EJB – Session Bean (Stateless-Stateful -Singleton) kullanımı?
Bir onceki yazimda EJB(Enterprise Java Beans) Nedir? Nasıl Kullanılır? sorunusun yanitlamaya calismistim . Simdi ise @Stateless ,@Statefull , @Singleton notasyonlarinin aralarindaki farklar neler bunlara deginecegim bir alisveris sepeti ornegiyle … ornegimize basliyalim..
EJB’ lere interfaceler aracılığı ile ulaşılır. Yani kullanıcı sadece interfacede tanımlı metotlara erişebilir. @Local ,@Remote adinda iki tane notasyonumuz var bunlar isimlerindende anlasilacagi gibi @Remote uzaktan çağrılan işlemler için , @Local notasyonu ise localden çağrılan işlemler için kullanılacak olan bir EJB interfacesi olduğunu tanımlıyor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package ejbbeans; import java.util.List; import javax.ejb.Remote; import pojo.UrunPojo; /** * * @author www.turkishh.com */ @Remote public interface TesterInterfaces { // interface clasimizda iki tane methodumuz var // Bu methodumuz bize urunlerimizin oldugu List donderiyor public List<UrunPojo> getDeneme(); //Bu methodumuz ise bizden bir tane urun nesnesi aliyor public void setDeneme(UrunPojo deneme1); } |
Burada interface sinifimizi tanimliyoruz ve iki tane methoduz olacak birisi list donderecek birisi ise urun nesnesi alip implements ettigimiz sinifimizda listemize ekliyecek.
UrunPojo sinifizimi yazalim .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
package pojo; /** * * @author www.turkishh.com */ public class UrunPojo { String urunAdi; String urunAciklama; int urunFiyat; public String getUrunAdi() { return urunAdi; } public void setUrunAdi(String urunAdi) { this.urunAdi = urunAdi; } public String getUrunAciklama() { return urunAciklama; } public void setUrunAciklama(String urunAciklama) { this.urunAciklama = urunAciklama; } public int getUrunFiyat() { return urunFiyat; } public void setUrunFiyat(int urunFiyat) { this.urunFiyat = urunFiyat; } } |
Simdi ise is yapan methodlarimizin oldugu intefacemizi implement eden SessionBean sinifimizi olusturalim .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
package ejbbeans; import java.util.ArrayList; import java.util.List; import javax.ejb.Stateful; import pojo.UrunPojo; /** * * @author www.turkishh.com */ @Stateful public class DenemeSessionBean implements TesterInterfaces { //Urun tipnde bir tane listemiz var List<UrunPojo> urunler; public DenemeSessionBean() { urunler = new ArrayList<UrunPojo>(); } //Implements edilen bize urun listesi donderen method @Override public List<UrunPojo> getUrun() { return urunler; } //Implements edilen bizden bir tane urun nesnesi alip //urunler listesine dolduran methodumuz. @Override public void setUrun(UrunPojo urun) { urunler.add(urun); } } |
Simdi ise jsf sayfasi kullanicagimiz icin bir tane controller sinifimizi (Managed Bean) olusturalim
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
package controller; import ejbbeans.TesterInterfaces; import java.util.List; import javax.ejb.EJB; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import pojo.UrunPojo; /** * * @author www.turkishh.com */ @ManagedBean(name = "TesterBeans") @SessionScoped public class TesterBean { // En basta EJB’ lere interfaceler aracılığı ile ulaşılır demistik bunun icin // @EJB notasyonu ile interface sinifimizdan referans // aliyoruz ki methodlarimizi kullanabilelim @EJB TesterInterfaces bean; UrunPojo urunPojo; public TesterBean() { urunPojo = new UrunPojo(); } // Birtane urun nesnemizi alip listimize ekleyen // ejb methodumuza gonderiyoruz // ve sayfamizi refresh yapiyoruz public String setTable() { bean.setUrun(urunPojo); return "index.xhtml"; } //Burada ise jsf sayfamizdaki tabloya listemizdeki urunleri yazdiracayiz public List<UrunPojo> getTable() { return bean.getUrun(); } public UrunPojo getUrunPojo() { return urunPojo; } public void setUrunPojo(UrunPojo urunPojo) { this.urunPojo = urunPojo; } } |
ve jsf sayfamizi olusturuyoruz .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> <h:head> <title>Facelet Title</title> </h:head> <h:body> <h:form> <center> SessionBean Ornegi </center> <h:panelGrid columns="4" style="background-color: activecaption"> <h:outputText value="Urun Adi : "/> <h:inputText value="#{TesterBeans.urunPojo.urunAdi}"/> <h:outputText value="Urun Aciklama : "/> <h:inputText value="#{TesterBeans.urunPojo.urunAciklama}"/> <h:outputText value="Urun Fiyat : "/> <h:inputText value="#{TesterBeans.urunPojo.urunFiyat}"/> </h:panelGrid> <h:commandButton value="Sepete Ekle" action="#{TesterBeans.setTable()}"/> <h:dataTable border="1" var="sepet" value="#{TesterBeans.table}" style="background-color: activecaption"> <h:column> <f:facet name="header"> <h:outputText value="Urun Adi"/> </f:facet> <h:outputText value="#{sepet.urunAdi}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText value="Urun Aciklama"/> </f:facet> <h:outputText value="#{sepet.urunAciklama}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText value="Urun Fiyat"/> </f:facet> <h:outputText value="#{sepet.urunFiyat}"/> </h:column> </h:dataTable> </h:form> </h:body> </html> |
@Stateful
Simdi arkadaslar bu ornekte notasyonumuz olarak @Stateful kullandik bu notasyonun nasil davrandigini tarayicimiz uzerinden bakalim..Ilk once chrome ile aciyorum ve bir tane urun ekliyorum ,ekledikten sonra mozillada aciyorum sayfayi ve su sekilde gorunuyor.
Simdi 2 tarayiciyada ayri ayri birer tane urun daha ekliyorum ve ciktisi soyle oluyor..
Goruldugu gibi her istemciye ayri ayri bean olusturuluyor . Stateful notasyonunu daha iyi anlayabilmeniz icin resimde gostermeye calisalim ..
@Singleton
Bir baska notasyonumuz @Singleton nasil davrandigina deyinecek olursak singleton notasyonu bir tane sabit bean tutar ve her istemciye ayni bean yollar .. Simdi kodumuza geri donerek @Stateful notasyonunu @Singleton olarak degistirelim ve tarayicilarimizda nasil farkliliklar var gorelim .Ayni islemi tekrarliyalim chrome ile bir tane kitap ismi ekleyelim ve mozilla ile eklemiyelim bakalim ne olacak..
Bu sefer isler degisti 🙂 mozilladan urun eklemedigim halde bana ejb konteyner ayni bean’i gonderdi .. Yani durum assagidaki resimde anlattigim gibi oldu ..
@Stateless
Simdi gelelim @Stateless notasyonumuza bu notasyonumuzda su sekilde calismaktadir , uygulamaya baglanan tum istemciler erisilebilen bean cesitidir. Istemci nesneyi biraktiktan sonra baska bir istemci icin hazir hale gelir . Bu notasyonu kullandigimizda uygulama sunucunun ozelliklerine bagli olarak konteynerde hazirda bekleyen bir kactane bean olusturur , istemci istek yolladiginda konteynarda hazirda bean varsa onu yollar yoksa eger yenisini olusturup yollar istemciye.
Bu yazimda anlatacaklarim bu kadar bir sonraki ejb makalemde Kesiciler (interceptor) konusunu anlatmaya calisacagim .
Umarım yararlı olmuştur.
İyi Çalışmalar
stateles örneğide olsaydı keşke:)
Örnek olarak yazıda mevcuttur zaten 🙂