JavaServer Faces Olay Model ve Mimarisi: Eylem, Değer Değişikliği Olay ve Dinleyicileri

JavaServer Faces, sağladığı gelişmiş kullanıcı arabirimi bileşenler kümesini yönetmeyi kolaylaştıran, AWT ya da Swing ile zengin istemci geliştirmede kullanılana benzer bir olay tabanlı programlama modeline sahiptir.

Bu modelde kullanıcı arabirimi bileşenlerinden kaynaklanan olayları(örneğin bir düğmenin tıklanması, bir girdi alanındaki değerin değiştirilmesi vb) ifade eden sınıf/nesne(FacesEvent’ı genişletmiş sınıf/nesne) ve olayların teslim edildiği listener/dinleyici(FacesListener’ı genişletmiş arayüz) söz konusudur.

JavaServer Faces ayrıca, kullanıcı arabirimi bileşenlerinden kaynaklanan olayların kapsamını aşan, JSF yaşam döngüsünde gerçekleşen durum değişikliklerini kaydetmek ve izlemek için evre olaylar(PhaseEvent) ve evre dinleyicilerinden(PhaseListener) oluşan bir olay ve dinleyici türü de sağlar.

Ve son olarak, JSF 2.0 ile birlikte gelen, bir Faces isteği sırasında meydana gelen ve daha önce anılan 2 bildirim mekanizmasında kendilerine dair bir bildirim bulunmayan olaylar için de bir model ve bildirim mekanizması sağlanmıştır. Bu üçüncü olay modelinin adı da System Events‘dır.

Bu yazı dizisi ile sizlere, JavaServer Faces’ın sahip olduğu bu olay model ve mimarisini tanıtmayı amaçlıyorum.

EYLEM, DEĞER DEĞİŞİKLİĞİ OLAY ve DİNLEYİCİLERİ

JavaServer Faces kullanıcı arabirimi bileşenleri başlıca iki guruba ayrılabilir. Birinci gurupta yer alan bileşenler bir eylemi başlatan bileşenlerdir. Bunlara JSF’in HTML bileşen kütüphanesi içinde yer alan commandButton bileşeni örnek olarak verilebilir. Bir olay başlatan bileşenler, ActionSoruce arayüzünü implement etmişlerdir. İkinci gurupta yer alan bileşenler ise girdi ve çıktı alanları gibi, değer tutan bileşenlerdir. Bunlar da ValueHolder ya da EditableValueHolder arabirimlerini implement etmiş bileşenlerdir. Bu tip bileşenlere de yine JSF’in HTML bileşen kütüphanesi içinde yer alan inputText bileşeni örnek olarak verilebilir.

JavaServer Faces’ın, kullanıcı arabirimleri bileşenler kümesini yönetmeyi kolaylaştıran olay modeli, kaynak nesne ile bir ya da daha fazla sayıda hedef dinleyici nesne arasında durum değişikliği bildirimlerini(olay/event) yayan bir mekanizma olarak tarif edilebilir.

İşleyişi somutlaştırmak için, kaynak nesnenin düğme(commandButton) olduğu bir senaryoyu incelemeye çalışalım. Böylesi bir senaryoda, kaynak nesne(düğme) tıklandığında, yaşanan bu durum değişikliğini yani tıklanma eylemini belirten bir olay yayımlanır ve bu olaya karşılık gelen dinleyiciye olay teslim edilir.

JavaServer Faces, ActionSource arayüzünü implement etmiş bileşenlerden(commandButton bileşeninin çekirdek davranışlarını temsil eden HtmlCommandButton sınıfı, UICommand sınıfını genişletmiştir, UICommand sınıfı ise ActionSource arayüzünü implement etmiştir. Detay bilgi: JSF 1.2 den sonra bir eylem başlatan bileşenlerin impelement ettiği arayüzün adı aslında ActionSource2’dir. Actionsource2, ActionSource’dan genişletilmiştir) kaynaklanan olayları yönetmek için bir eylem olayı(ActionEvent) ve buna karşılık gelen bir eylem dinleyicisi(ActionListener) kullanmaktadır.

Bir başka senaryoda, bir değer tutan yani ValueHolder ya da EditableValueHolder arabirimlerini implement etmiş bir kullanıcı arabirimi bileşeninde ise bir değer değişikliği olayı(ValueChangeEvent) ve bu olayla ilişkilendirilmiş bir değer değişikliği dinleyicisi(ValueChangeListener) kullanılmaktadır. Değer değişikliği meydana geldiğinde bunu belirten bir olay yayımlanır ve bu olaya karşılık gelen dinleyiciye, değer değişikliği olayı teslim edilir.

JSF geliştiricisi, bir eylem olayı ve dinleyicisini, yine bir değer değişikliği olayı ve dinleyicisini, anılan eylemlere tepki vermek üzere programlayabilir.

JavaServer Faces’da gerek eylem olayları gerek değer değişikliği olayları, java.util.EventObject sınıfından genişletilen jenerik Faces olayı FacesEvent’tan genişletilmiştir. Benzer şekilde, eylem olayları ve değer değişikliği olayları kendilerine teslim edilen dinyleyici sınıfları da, java.util.EvenListener arayüzünü genişletmiş FacesListener arayüzünü genişletmektedir.

 

EYLEM ve DEĞER DEĞİŞİKLİĞİ OLAYLARININ YÖNETİLMESİ

JavaServer Faces’da ActionEvent olaylarını yönetmek için varsayılan bir ActionListener kullanılır. Dolayısıyla JSF geliştiricisi, özelleştirilmiş bir dinleyiciye ihtiyaç duymuyorsa, bir eylem olayını yakalamak için kendisine sunulan bu varsayılan ActionListener’ı kullanır.

index.xhtml


<h:commandButton value="Gönder" action="#{myBean.test}" />

MyBean.java


public void test(){
    System.out.println("Test...");
}

Yukarıdaki kod, varsayılan ActionListner’ın kullanımına bir örnektir. commandButton bileşeninin action niteliğine set edilen MethodExpression örneği, ActionListener tarafından tıklanma eyleminin gerçekleşmesi ardından, JSF yaşam döngüsünün ilgili evresinde işletilecektir

Varsayılan ActionListener, olayı başlatan kaynak bileşeni tanımlayan source özelliğine sahiptir. Bu özelliğin değeri kaynak bileşenin id’sidir. Source’u elde eden ActionListener, source bileşenin action özelliğini işler. Bileşenin action özelliğine atanan metod bir MethodExpression(JSF 1.2 öncesi MethodBinding) örneğidir. Çalışma zamanında metotta yer alan iş mantığına göre çeşitli işlemler gerçekleştirilir. Örneğin metod karakter döndürüyorsa ve bu bir navigasyon eşleşmesi ise JSF yaşam döngüsü NavigationHandler ile bu navigasyon talebini, yaşam döngüsünün ilgili evresinde gerçekleştirir.

JavaServer Faces, bir ValueChangeEvent olayını yönetmek için varsayılan bir ValueChangeListener kullanır. Dolayısıyla az önce ActionEvent olaylarının yönetiminde bahsedildiği gibi, JSF geliştiricisi özelleştirilmiş bir değer değişikliği dinleyicisine ihtiyaç duymuyorsa, değer değişikliği olayını yakalamak için kendisine sunulan bu varsayılan ValueChangeListener’ı kullanır.

index.xhtml


<h:inputText value="#{myBean.price}" valueChangeListener="#{myBean.valueChangeMethod}"/>

MyBean.java


public void valueChangeMethod(ValueChangeEvent event){
    System.out.println("Değer değişikliği olayı yaşandı...");
}

Yukarıdaki kod, varsayılan ValueChangeListner’ın kullanımına bir örnektir. inputText bileşeninin valueChangeListener niteliğine set edilen MethodExpression örneği, varsayılan ValueChangeListener tarafından, bileşenin içinde yer aldığı form post edildiğinde JSF yaşam döngüsünün ilgili evresinde işletilecektir

Bir değer değişikliği olayı yaşandığında JSF yaşam döngüsü, ValueChangeEvent olayının bir örneğini oluşturur ve bu örneği, olayın gerçekleştiği, örneğin inputText bileşeninin(inputText bileşeninin çekirdek davranışlarını temsil eden HtmlInputText sınıfı, ValueHolder arayüzünü implement etmiş UIOutput sınıfını genişletmiş, ayrıca EditableValueHolder arayüzünü de implement etmiş UIInput sınıfını genişletmiştir) queueEvent metoduna argüman olarak aktarır.

Ardından bileşenin değer değişikliği olayı, JSF’in sağladığı varsayılan ValueChangeListener ya da özelleştirilmiş bir değer değişikliği sınıfı ile yönetilebilir.

 

EYLEM ve DEĞER DEĞİŞİKLİĞİ OLAYLARI NE ZAMAN İŞLENİR?

JavaServer Faces’da eylem olayları, eylemi başlatan bileşenin immediate niteliğine true değeri atanmamış ise, yaşam döngüsünün Invoke Application evresinin sonunda işlenir. Aksi durumda, yani eylemi başlatan bileşenin immediate niteliğine true değeri atanması halinde ActionEvent, JSF yaşam döngüsünün Apply Request Values evresinin sonunda işlenir.

Değer değişikliği olayını yönetmek için kullanılacak metod ise, JSF yaşam döngüsünün Process Validations evresinde etkinleştirilir. Burada da istisnai durum, değer değişikliği olayının yaşandığı bileşenin immediate niteliğine true değeri atanmasında yaşanır.

JavaServer Faces’ta eylem ve değer değişikliği olaylarını yönetmek için, ActionListener ve ValueChangeListener arayüzlerini implement etmiş, kendi özel dinleyici sınıflarınızı da oluşturabilirsiniz.

Bu özelleştirilmiş dinleyici sınıfları ve kullanımlarının örneklendirilmesini İnşallah bir sonraki yazıda ele alacağız.

Post a Comment

Comment
Name
Email
Website