JSF – 09 – Managed Bean & CDI Bean Scopes – 01

Merhaba Arkadaslar
Bu bolumde JSF Managed Bean ve CDI Bean’lerin yasam alanlarindan/scope giris yapacagiz.
Burada su scope/yasam alanlarini inceleyecegiz. Diger scope’lari ise bir sonraki bolumlerde inceleyecegiz. Burada bahsedecegimiz Scope’lar hem JSF hem CDI bean’leri icin gecerlidir.

Ilgili annotation’lar ;
JSF Managed Bean’ler icin javax.faces.bean paketinde
CDI Bean’ler icin javax.enterprise.context paketinde yer almaktadir.
Hangi bean’leri kullanacaksak ilgili paketteki annotation’lari eklememiz gerekmektedir.

  • Request Scope
  • Session Scope
  • Application Scope

Request Scope

Request Scope ( @RequestScoped ) olarak tanimli bir managed bean son derece kisa omurludur. HTTP request submit edilip response client’a donene kadar Request Scope bean yasayacaktir. HTTP request’i tamamlandiginda yasam alani sonlanir. Her bir request sonucunda yeni bir managed bean objesi (instance) olusur.

RequestScopedBean.java

package _10.request.scoped;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean
@RequestScoped
public class RequestScopedBean {

	private String name;
	private String password;

	//getters and setter

	// Her bir request sonucunda yeni bir bean objesi (instance) olusur.
	// Bunu gorebilmek icin basit olarak hashCode degerini yazdirabiliriz.
	// Metodu cagirabilmek icin get/setter isim kuralina uygun sekilde
	// tanimliyoruz.
	// Boylelikle #{requestScopedBean.hashCode} seklinde cagirabiliriz.
	public int getHashCode() {		
		return super.hashCode();
	}
}

loginRequestScoped.xhtml
Bu xhtml dosyamiz diger login sayfalari gibi , sadece hashCode u gormek icin su kismi ekledim.

....
	<h:form>
....
		<p>Hashcode : #{requestScopedBean.hashCode}</p>
...
	</h:form>
...

Xhtml dosyamizi calistirdigimizda ;

requestscoped bean

Sayfayi refresh ettigimizde yeni bir request olacaktir , her request yeni bir RequestScoped bean objesi olusmasina neden olacaktir. Dolayisiyla farkli obje olacagi icin yeni hashCode degeri farkli olacaktir.

requestscoped bean 2

  • Kullanici h:commandButton’a tiklar , form submit edilir (HTTP POST) . Yeni bir request oldugu icin yeni bir RequestScoped bean objesi olusur.
  • JSF action’i alir ve Page Forward islemi welcome.xhtml e yapilir.
  • JSF welcome.xhtml icerigini doner.

requestscoped bean 3

Onceki bolumde Page Redirect konusunu incelemistik. Eger burada Page Redirect yapisina uygun sekilde commandButton kullanirsak bu durumda bu submit islemi sonucunda 2 tane request olacaktir. Bu yapiyi onceki bolumde incelemistik.

RequestScoped bean icin yasam alani (scope) sadece 1 request icin gecerli olacaktir. Page Redirect yaklasiminda ise 2 tane request olacaktir, dolayisiyla formda girilen bilgilere ulasim saglanamayacaktir , cunku RequestScoped bean yasam alani (scope) sadece ilgili request icin gecerli olacaktir.

		
<p>
     <h:commandButton value="Login Page Redirect" action="welcome?faces-redirect=true" />
</p>

requestscoped bean 4

Session Scope

HTTP stateless/durumsuz bir protokoldur. Yani browser/istemci server/sunucu ile baglanti kurar, istekte bulunur(request) cevabi alir(response) ve browser ile server arasinda baglanti kapanir. Yani her baglanti bir request/response icindir.

Session Scope ( @SessionScoped ) Managed Bean’ler , HTTP session boyunca yasayacaktir. Session, ayni client/istemcinin birden fazla istek/request icin devamliligi saglar.

Yine her Session icin sadece bir ManagedBean olustugunu gormek icin hashCode degerini
yazdiralim.

SessionScopedBean.java

package _11.session.scoped;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class SessionScopedBean {

	private String name;
	private String password;

	//getters and setters
	public int getHashCode() {		
	     return super.hashCode();
	}
}

Bu ornegimizde 3 tane xhtml sayfamiz olsun.

loginSessionScoped.xhtml

RequestScoped bean icin Page Redirect durumunda 2 tane request oldugu icin forma girdigimiz alanlara ulasamadik , cunku yasam alani 1 request icin sinirlidir.
Peki RequestScoped  bean yerine SessionScoped bean kullanirsak bu durumda ulasim saglayabilir miyiz ? Ayni session icin bu ulasim saglanacaktir!

...		
<p>
     <h:commandButton value="Login Page Redirect" action="welcome?faces-redirect=true" />
</p>
     <h3>Hashcode : #{sessionScopedBean.hashCode}</h3>
...

page1.xhtml

page1.xhtml sayfamiza bir tane h:link component’i ekliyoruz ve page2.xhtml sayfasina yonlendirme yapiyoruz.

<?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">
<h:head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>Page1</title>
</h:head>
<h:body>
	<h3>SessionScoped Bean example - page1</h3>
	<h3>Welcome !#{sessionScopedBean.name}</h3>
	
	<h:link value="Page2" outcome="page2" />
	<h3>Hashcode : #{sessionScopedBean.hashCode}</h3>
</h:body>
</html>

page2.xhtml

page2.xhtml sayfasinda yine SessionScoped bean objemize ulasmaya calisalim.

<?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">
<h:head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>Page2</title>
</h:head>
<h:body>
	<h3>SessionScoped Bean example - page2</h3>
	<h3>Welcome !#{sessionScopedBean.name}</h3>
	<h3>Hashcode : #{sessionScopedBean.hashCode}</h3>
</h:body>
</html>

loginSessionScoped.xhtml sayfamizi calistiralim ve formu submit edelim.

session scoped bean
Page Redirect kullanmamiza ragmen #{sessionScopedBean.name} ile “Levent” degerine ulasabiliriz.

session scoped bean page1

Page2 ye gittigimizde yine #{sessionScopedBean.name} ile  “Levent” degerine ulasabiliriz.

Managed Bean’imiz SessionScoped olarak tanimli oldugu icin yasam alani session boyunca devam edecektir.

session scoped bean page2

Ayrica uretilen hashCode degerinin 3 sayfa icin de ayni olduguna dikkat edelim.
Ayni browserda oldugumuz icin ayni Session soz konusu olmaktadir , dolayisiyla bir session icin sadece tek bir managed bean objesi olusacaktir.

Bir baska browserdan page2 sayfamizi acarsak ayni sessionda olmayacagi icin ulasim saglanamaz.

Firefox ‘ta

http://localhost:8080/Injavawetrust.jsf/11.session.scoped/page2.xhtml 

linkine direkt gittigimizde farkli session olacagi icin hashCode degeri de farkli olacaktir , cunku bu session icin yeni bir managed bean objesi olusturuldu.

session scoped bean page2 firefox

Unutmayalim farkli browser’lar farkli session olarak degerlendirilir. Ayni browserda farkli sekme yine ayni session olarak degerlendirilir.

Session yonetimi , cookie’ler aracigiyla gerceklesmektedir. Arka planda JSESSIONID cookie olarak kullanilmaktadir. Test etmek icin tarayicimizda cookie ozelligini disable yaptigimizda URL rewriting islemi sonrasinda URL de jsessionid bilgisini gorebiliriz.
ornek olarak eklenen jsessionid bilgisi ;

http://localhost:8080/Injavawetrust.jsf/11.session.scoped/page1.xhtml;jsessionid=FFBD96FE934D50AFFC8585AE19688927

Application Scope

Application Scope ( @ApplicationScoped ) Managed Bean’ler  , tum web application boyunca yasayacaktir. Yani tum request’ler ve tum session’lar icin gecerli olacaktir.

ApplicationScopedBean.java

package _12.application.scoped;

import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;

@ManagedBean
@ApplicationScoped
public class ApplicationScopedBean {
	
	private String name;
	private String password;
	
	//getters and setters
	public int getHashCode() {		
		return super.hashCode();
	}
}

SessionScoped ornegimizde kullandigimiz 3 xhtml dosyamizin benzerini kullanabiliriz. Sayfalar arasinda gecis yaptigimizda ayni sessionda oldugumuz icin zaten ulasim saglaniyordu. Bununla birlikte page2.xhtml sayfamizi baska bir browser ile acinca farkli session oldugu icin Managed Bean objemize ulasim saglayamadik. Benzer testi ApplicationScoped bean icin yaptigimizda bu bean ‘e ulasim saglanacaktir.

oginApplicationScoped.xhtml sayfamizi calistirip formu submit edelim daha sonrasinda linke tiklayarak page2.xhtml sayfasina gelelim. Bir baska browser icin bu linke direkt gittimizde (copy-paste)  Managed Bean objemize ulastigimizi gorebiliriz.
Ayrica hashCode degerini incelersek , bu degerin degismedigini gorebiliriz. Tum Application icin tek bir managed bean olusacaktir dolayisiyla ayni hashCode degeri olacaktir.

application scoped bean

Unutmayalim ApplicationScoped Managed Bean icin yasam alani (scope) tum application/uygulama icin gecerlidir.

ApplicationScoped icin test ettigimiz xhtml dosyalari SessionScoped icin test ettigimiz xhtml dosyalariyla ayni oldugu icin tekrar burada paylasmiyorum. Tabi sadece kullandigimiz bean farkli.  Kod icerisinde inceleyebilirsiniz.

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *