Sansür, bir toplumun kendine olan güvensizliğini yansıtır ve otoriter rejimlerin belirgin bir özelliğidir.

--Potter Stewart

26.01.2008

Spring - JSF Bütünleştirmesi

JSF (JavaServer Faces) bilindiği gibi Java masaüstü programcılığında Swing ve AWT’nin uygulama geliştiricilere sunduğu metin alanları, liste kutuları, tab panelleri, grid vb. kullanıcı arayüz bileşenlerinin Web geliştirme ortamında da etkin bir şekilde kullanılmasına olanak veren bir çatıdır. Bu bileşenlerin masaüstü uygulamalarda kullandığı olay-dinleyici (event-listener) mekanizmasını web ortamında da olanaklı kılarak istem/cevap (request/response) mantığını soyutlamıştır. Örneğin formun bir düğmesine tıklama eylemi sunucuda backing beanlerin dinleyici yöntemleri(method) ile ele alınır. Aynı şekilde bir girdi alanının değerinin değişmesi sunucu tarafında bir dinleyici ile ele alınarak gerekli görülen bir akış işletilebilir.

JSF’nin sunduğu bu güçlü kullanıcı arayüzü desteği JSF’nin sunum çatısı olarak kullanılması ve arka plan görevlerin Spring gibi güçlü çatılarla desteklenmesi, web uygulama geliştiriciler için bir seçenek oluşturmuştur. Bu bütünleştirmenin nasıl kolaylıkla yapıldığına bir bakalım:

Elimizde JSF bileşenleri ile hazırlanmış ve kullanıcıdan kayıt bilgileri isteyen bir .jsp kütüğü olsun:

<h:form>

<h2>Register</h2>

<h:panelGrid columns="2">

<f:verbatim><b>First Name:</b></f:verbatim>

<h:inputText value="#{member.firstName}" required="true"/>


<f:verbatim><b>Last Name:</b></f:verbatim>

<h:inputText value="#{member.lastName}" required="true"/>


<f:verbatim><b>E-mail:</b></f:verbatim>

<h:inputText value="#{member.email}" required="true"/>


<f:verbatim><b>Password:</b></f:verbatim>

<h:inputText value="#{member.password}" required="true"/>

...


</h:panelGrid>


<h:commandButton id="submit" action="#{member.register}"

value="Register Member"/>

</h:form>


Spring çatısı gibi JSF de ayar kütüğünde(faces-config.xml) tanımlanan bean tanımlarını kullanır. Burada dikkat edilmesi gereken nokta Spring ve Struts gibi denetim(controller) sınıflarının JSF’de bulunmamasıdır. Yukardaki kod incelendiğinde “Register Member” düğmesine basıldığında işletilecek kod parçası “member” bean’in “register” yöntemidir:


public class Member {


...

public String register() {

memberService.addMember(this);

return "success";

}

}

Member” sınıfının “register” yöntemi, sorumluluğu “memberService”e aktarmıştır. JSF de Spring gibi bağımlılık aktarımı mekanizmasını kullanır. Varsayılan bir değişken çözücü (variable resolver), faces-config.xml kütüğünde tanımlanan beanlerle bağımlılık aktarımını yapar. “MemberService” sınıfının “Member” sınıfına bağımlılık aktarımı şu şekilde gerçekleştirilir:


<managed-bean>

<managed-bean-name>member</managed-bean-name>

<managed-bean-class>

com.model.Member

</managed-bean-class>

<managed-bean-scope>request</managed-bean-scope>

<managed-property>

<property-name>memberService</property-name>

<value>#{memberService}</value>

</managed-property>

</managed-bean>

Geleneksel JSF uygulamasında “memberService” bean ve uygulamanın ihtiyaç duyduğu diğer beanler de faces-config.xml kütüğünde tanımlanır. Bizim hedeflediğimiz ise bean tanımlarını Spring ayar kütüğünde tanımlamak ve JSF’nin bunlara erişimini olanaklı kılmak. JSF’nin varsayılan değişken çözücüsü ile bağımlılık aktarımını kendi içeriğindeki bean tanımlarınıyla yaptığınından bahsetmiştik. Spring içeriğinde bulunan bean tanımlarına JSF erişimini sağlamak için varsayılan değişken çözücüyü değiştirmek bunu başarabiliriz. faces-config.xml kütüğünde Spring’in sağladığı değişken çözücüyü JSF’ye tanıtmak işimizi görecektir:

<application>

<variable-resolver>

org.springframework.web.jsf.DelegatingVariableResolver

</variable-resolver>

</application>

DelegatingVariableResolver ilk olarak JSF beanleri içinde bağımlılığı aktarılacak bean’i arayacak bulamadığı taktirde de Spring beanlerini control edecektir:

<bean id="memberService"

class="com.service.MemberServiceImpl">

<property name="memberDao" ref="memberDao" />

</bean>

JSF sayfalarından Spring uygulama bağlamına (application context) erişim sağlayabilmek için ise varsayılan değişken çözücü tanımını WebApplicationContextVariableResolver olarak ayarlayıp webApplicationContext değişkenini JSF sayfalarında kullanabilirsiniz:


<variable-resolver>

org.springframework.web.jsf.WebApplicationContextVariableResolver

</variable-resolver>

Yukardaki işlemlerin sonrasında Spring beanlerini JSF ile bütünleşik kullanabiliriz. Artık faces-config.xml kütüğünde sayfa yönlendirmelerini yapabilmek için “navigation” kurallarını yazmamız yeterli olacaktır. JSF ile daha ayrıntılı bilgiyi “Manning JavaServer Faces in Action” kitabından edinebilirsiniz.

Hiç yorum yok:

Yorum Gönder