Nov 28

duke-danceBu yazımızda JSF Richfaces Hibernate Spring teknolojilerini kullanarak bir ToDo uygulaması yapacağız. Bu uygulamada yapılacaklar listesi tutulacak ve bu liste arasında arama yapabileceğiz. Bu yapacağımız uygulamanın en güzel özelliği ise herşeyi AJAX ile yapıyor olmamız.

Projeye başlamadan önce kullanılan teknolojiler üzerinden geçmemiz iyi olacak.

JSF : Java’nın component tabanlı web geliştirme kütüphanesi. MyFaces 1.2 versiyonu kullanılıyor.
Richfaces : Gene JSF implementasyonu olan bu kütüphane bize zengin AJAX desteği sunuyor. 3.2.2.SR1 versiyonu kullanılıyor.
Hibernate : Hibernate ile birlikte Database işlemleri Obje tabanlı yapılmakta. 3.2.1.ga versiyonu kullanılıyor
Spring : Spring benim olmaz ise olmaz kütüphanelerimden. Spring ile birlikte J2EE’nin tüm nimetlerinden bir Application Server’a(JBoss, Glassfish gibi) ihtiyacınız olmadan yararlanabilirsiniz. 2.5.1 versiyonu kullanılıyor.

Veritabanı olarak HsqlDB kullanmaktayım. Veritabanı “on the fly” yaratıldığı için her uygulamayı başlattığınızda eski datalar yok olacaktır. İsterseniz siz bunun yerine MySql kullanabilirsiniz.

Projeyi çalıştırmak için bilgisayarınızda Maven kurulu olması gerekiyor. Ama “Maven nedir?” diyorsanız buradan gerekli bilgiyi öğrenebilirsiniz.

Aşağıdan Todo Ekleme, Listeleme ve Arama sayfalarını görebilirsiniz

TODO Listeleme

TODO Arama

Projeyi çalıştırmak için önce proje kodunu indirin.

Download: Javacı Todo Uygulaması  Javacı Todo Uygulaması (21.4 KiB, 117 hits)

İndirme işlemini tamamladıktan sonra proje dosyalarını sıkıştırılmış dosyadan çıkartıp, o klasöre konsoldan giriş yapınız.
Projeyi çalıştırmak için konsolda mvn jetty:run demeniz yeterli olacaktır. Gerisini Maven sizin için halledecektir.

Şimdi biraz da kodu inceleyelim.

1 tane model sınıfımız var. Veritabanı işlemlerimizi bu model sınıfı ile yapıyoruz.

package net.javaci.todo.domain;
 
import java.io.Serializable;
import java.util.Date;
import java.util.Calendar;
 
import javax.persistence.*;
 
@Entity
public class Todo implements Serializable{
 
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
 
    @Basic
    private String title;
 
    @Basic
    @Lob
    private String description;
 
    @Basic
    @Temporal(value = TemporalType.TIMESTAMP)
    private Date publishedDate;
 
    public Todo() {
        this.publishedDate = Calendar.getInstance().getTime();
    }
 
     public Todo(String title, String description) {
	this.title = title;
	this.description = description;
        this.publishedDate = Calendar.getInstance().getTime();
     }
 
    public long getId() {
        return id;
    }
 
    public void setId(long id) {
        this.id = id;
    }
 
    public String getTitle() {
        return title;
    }
 
    public void setTitle(String title) {
        this.title = title;
    }
 
    public String getDescription() {
        return description;
    }
 
    public void setDescription(String description) {
        this.description = description;
    }
 
    public Date getPublishedDate() {
        return publishedDate;
    }
 
    public void setPublishedDate(Date publishedDate) {
        this.publishedDate = publishedDate;
    }
}

DAO(Data Access Object) sınıfımız sayesinde veritabanı üzerinde yapacağımız işlemleri belirliyoruz. Ayrıca DAO sayesinde ileride teknoloji değişikliği yapacaksak kolay entegre etmemizi sağlıyor. Mesela bir bu projede JPA(Java Persistence API) kullandık.

package net.javaci.todo.dao.jpa;
 
import org.springframework.stereotype.Repository;
import javax.persistence.Query;
 
import net.javaci.todo.domain.Todo;
import net.javaci.todo.dao.jpa.GenericDaoWithJpa;
import net.javaci.todo.dao.TodoDao;
 
import java.util.List;
 
@Repository
public class TodoDaoJpa extends GenericDaoWithJpa<Todo,Long> implements TodoDao {
 
    public List<Todo> getAllTodo() {
        return this.loadAll();
    }
 
    public List<Todo> findByTitle(String title) {
        Query query = entityManager.createQuery("Select t from Todo t where t.title like ?1");
	query.setParameter(1, title + "%");
 
	return query.getResultList();
    }
 
    public List<Todo> findByDescription(String description) {
        Query query = entityManager.createQuery("Select t from Todo t where t.description like ?1");
	query.setParameter(1, description + "%");
 
	return query.getResultList();
    }
}

JSF ve Spring ikilisinin diğer bir özellikleri ise bizi MVC(Model-View-Controller) pattern’ına zorlamasıdır. Yukarıda Model ve Controller’dan bahsettik. Şimdi ise View’den bahsedelim.

Her bir işlem için ayrı Backing Bean ekledim. Backing Bean’lerin özellikleri JSF web arayüzündeki işlemleri karşılamalarıdır. Bunu eğer .NET kullandıysanız web sayfası üzerindeki buttona işlem atamak için çift tıkladığınızda gelen sayfaya eştir.

Arama için gerekli olan Backing Bean’i aşağıda görebilirsiniz.

package net.javaci.todo.view;
 
import java.io.Serializable;
import java.util.List;
import java.util.Set;
import java.util.HashSet;
import java.util.ArrayList;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import net.javaci.todo.domain.Todo;
import net.javaci.todo.service.TodoService;
 
@Component("searchTodo")
@Scope("request")
public class SearchTodo implements Serializable{
 
    private Todo todo = new Todo();
    private List<Todo> result;
 
    @Autowired
    private TodoService todoService;
 
    public Todo getTodo() {
        return todo;
    }
 
    public void setTodo(Todo todo) {
        this.todo = todo;
    }
 
    public List<Todo> getResult() {
        return result;
    }
 
    public void setResult(List<Todo> result) {
        this.result = result;
    }
 
    public String search() {
        Set<Todo> s = new HashSet<Todo>();
        if(todo != null) {
            if(!todo.getTitle().equals("")) {
                s.addAll(todoService.findByTitle(todo.getTitle()));
            }
            if(!todo.getDescription().equals("")) {
                s.addAll(todoService.findByDescription(todo.getDescription()));
            }
        }
 
        result = new ArrayList<Todo>(s);
        return null;
    }
}

Bu Backing Bean’e karşılık gelen JSF Web Arayüzünü de aşağıda görebilirsiniz.

 <h:panelGrid id="todosearchgrid" columns="2">
     <h:outputLabel for="titlesearch" value="Başlık" />
     <h:inputText id="titlesearch" value="#{searchTodo.todo.title}" />
 
     <h:outputLabel for="descsearch" value="Açıklama" />
     <h:inputText id="descsearch" value="#{searchTodo.todo.description}" />
 
     <h:outputLabel/>
     <a4j:commandButton value="Arama Yap" action="#{searchTodo.search}" reRender="todosearchresult" />
 </h:panelGrid>

Yukarıda görüldüğü gibi searchTodo.search çağırımı ile searchTodo Backing Bean’i içerisindeki search methodu çağırılıyor. Çağırım işlemi tamamlandıktan sonra da todosearchresult datayı göstermek için yenileniyor.

Sonuç olarak Java ile kolay ve hızlı web siteleri geliştirelebilir. Eğer rol tabanlı kullanıcı kontrolü de eklemek istiyorsanız Spring Security kullanabilirsiniz. Bunu ileriki yazılarımda göreceksiniz.

yazan Erol KOCAMAN \\ tags: , , , , ,

Oct 09

Building, Running, and Managing Spring-Powered Enterprise Applications isimli SpringSource grubunun 16 Ekim perşembe günü saat 16:00-17:00 arası ücretsiz eğitimi vardır. Eğitim internet üzerinden ve ingilizce olacaktır.

Eğitim içeriği daha çok Spring Framework kullanılmış projelerin yönetimi üzerine durmaktadır.

Katılım için https://www1.gotomeeting.com/register/958916297 adresini kullanabilirsiniz.

yazan Erol KOCAMAN \\ tags: , ,