15 Haziran 2014 Pazar

JSF,EJB ve JPA ile Web Uygulaması-1

Bu yazımda sizlere Java ile bir MVC projesinin nasıl yapıldığı,adımları ve gerekli teknolojilerinden bahsedip örnek bir uygulama üzerinde göstereceğim.
Bu uygulama Eclipse IDE ile GlassFish Server üzerinde MySQL veritabanı kullanılarak yapılmış olup aşağıda ki teknolojiler kullanılmıştır.

* JSF 2 - xhtml sayfaları ve ManagedBean ler
* PrimeFaces - View katmanı için hazır ve pratik component kütüphanesi
* JPA 2 - Java Persistance Api
* EJB - Dao ve Facade
* MVC - Design Pattern



Proje için ilk olarak Eclipse IDE de bir EJB projesi create etmemiz gerekmektedir. Bu işlem aşağıda ki gibi yapılır.





Açtığımız bu projenin içerisine bir package açıp model katmanımıza ait Entity lerimizi yazacağız. Login - logout için DB deki uyeler  tablosunun Entity si aşağıda ki gibidir.


Uyeler.java

@Entity
@Table(name = "uyeler")
public class Uyeler implements Serializable {

      private static final long serialVersionUID = 1L;

      @Id
      @Column(name = "kullaniciadi")
      private String kullaniciadi;

      @Column(name = "sifre")
      private String sifre;

      @Column(name = "ad")
      private String ad;

      @Column(name = "soyad")
      private String soyad;

      @Column(name = "cinsiyet")
      private String cinsiyet;

      @Column(name = "ilgialanlari")
      private String ilgialanlari;

      @Column(name = "dogumtarihi")
      private String dogumtarihi;

      @Column(name = "eposta")
      private String eposta;

      @Column(name = "epostahaberdar")
      private String epostahaberdar;

      public String getKullaniciadi() {
            return kullaniciadi;
      }

      public void setKullaniciadi(String kullaniciadi) {
            this.kullaniciadi = kullaniciadi;
      }

      public String getSifre() {
            return sifre;
      }

      public void setSifre(String sifre) {
            this.sifre = sifre;
      }

      public String getAd() {
            return ad;
      }

      public void setAd(String ad) {
            this.ad = ad;
      }

      public String getSoyad() {
            return soyad;
      }

      public void setSoyad(String soyad) {
            this.soyad = soyad;
      }

      public String getCinsiyet() {
            return cinsiyet;
      }

      public void setCinsiyet(String cinsiyet) {
            this.cinsiyet = cinsiyet;
      }

      public String getIlgialanlari() {
            return ilgialanlari;
      }

      public void setIlgialanlari(String ilgialanlari) {
            this.ilgialanlari = ilgialanlari;
      }

      public String getDogumtarihi() {
            return dogumtarihi;
      }

      public void setDogumtarihi(String dogumtarihi) {
            this.dogumtarihi = dogumtarihi;
      }

      public String getEposta() {
            return eposta;
      }

      public void setEposta(String eposta) {
            this.eposta = eposta;
      }

      public String getEpostahaberdar() {
            return epostahaberdar;
      }

      public void setEpostahaberdar(String epostahaberdar) {
            this.epostahaberdar = epostahaberdar;
      }

      @Override
      public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result
                        + ((kullaniciadi == null) ? 0 : kullaniciadi.hashCode());
            return result;
      }

      @Override
      public boolean equals(Object obj) {
            if (this == obj)
                  return true;
            if (obj == null)
                  return false;
            if (getClass() != obj.getClass())
                  return false;
            Uyeler other = (Uyeler) obj;
            if (kullaniciadi == null) {
                  if (other.kullaniciadi != null)
                        return false;
            } else if (!kullaniciadi.equals(other.kullaniciadi))
                  return false;
            return true;
      }

}

Entity classımız ın şimdilik bir NamedQuery si yok. Fakat projenin ilerki safhalarında ihtiyaç duyulacaktır.
Tablomuzun PK sı Entity den de anlaşılacağı üzere "kullaniciadi" dir.
Artık DB işlemlerinin (select,insert,update,delete) yapıldığı Dao ve Facade larımızı yazabiliriz.Fakat öncelikle bu DAO (Database Access Object) ve Facade ın ne olduğuna bir bakalım.

DAO : Dao bir design pattern olmak üzere kullanılan veritananına erişim ve veri depolama işlemini daha soyutlaştırarak uygulamalarımızda ki diğer katmanların veritabanına olan bağımlılıklarını azaltır.Dao design pattern(tasarım şablonu) ile diğer katmanlar etkilenmeden veritabanı işlemlerimizi yapabiliriz.

Facade : Facade pattern sistemde ki karmaşıklığı önlemekle birlikte alt sistemleri kolayca kullanabileceğimiz interface ler sağlar. Yani sub sistemler deki interfacelerin tek bir interfacesine facade diyoruz.


UyelerDAO.java

@Stateless
@LocalBean
public class UyelerDAO extends UyelerDaoImpl<Uyeler> implements Serializable{

      private static final long serialVersionUID = 1L;
     
      @Override
      public Uyeler findMemberByUserName(String username) {
            return super.findMemberByUserName(username);
      }    
     
}


UyelerDaoImpl.java

@Stateless
@LocalBean
public class UyelerDAO extends UyelerDaoImpl<Uyeler> implements Serializable{

      private static final long serialVersionUID = 1L;
     
      @Override
      public Uyeler findMemberByUserName(String username) {
            return super.findMemberByUserName(username);
      }
     
}

UyelerFacade.java
@Local
public interface  UyelerFacade {
     
      public abstract Uyeler findMemberByUserName(String username);
     
}




UyelerFacadeImpl.java

@Stateless
@LocalBean
public class UyelerFacadeImpl implements UyelerFacade,Serializable {
     
      private static final long serialVersionUID = 1L;
     
      @EJB
      UyelerDAO uyelerDao;

      @Override
      public Uyeler findMemberByUserName(String username) {
            return uyelerDao.findMemberByUserName(username);
      }
     
}

Böylece DAO , Facade ve Entity mizi yazımış olup EJB projemizi bitirmiş oluyoruz. Yazımın ikinci kısmında dinamik bir web projesi açıp tekrar devam edeceğim.