JSF

JSF Dersleri-Uygulamalı JSF Yaşam Döngüsü

Merhaba arkadaşlar.  JSF Yaşam Döngüsü yazımızda sözlü olarak bir JSF uygulamasında hangi fazlardan geçildiğini öğrenmiştik. O yazının ardından bu olayların bir örnek vasıtası ile  anlatılmasını talep eden arkadaşlar olmuştu. Bu yazıda JSF Yaşam Döngüsü bilgimizi örnek bir uygulama ile pekiştireceğiz. Uygulamaya ait kaynak kodlara buradan ulaşabilirsiniz. Proje bir IntelliJ projesidir. IntelliJ Idea IDE’niz varsa projeyi indirip çalıştırabilirsiniz. Şimdi kodlarımıza bakalım.

Yaşam döngüsü aşamalarını takip edebilmemiz için bir listener yazmamız gerekmekte. Ardından bu listener’ı yaşam döngüsü listener’ı olarak projeye tanıtmamız gerekmekte. Bunun için de faces-config.xml dosyası işimizi görecek.

LifeCycleListener.java Kodu

 getPhaseId() metodu ile o anki içinde bulunulan faz  bilgisi bize döndürülüyor. beforePhase() ve afterPhase() metodları ile fazın başlangıç ve bitişini takip edebiliyoruz.

faces-config.xml Kodu

Yaşam döngüsünü takip için yazdığımız listener’ı lifecycle etiketinin içinde phase-listener etiketini kullanarak projemize tanıtıyoruz.

index.xhtml Kodu

Projemizin görünüm tarafında bir inputText’imiz ve bir commandButton’ımız olacak. inputText’te normalde karşılaşmadığımız bir özellik var o da binding.

JSF mimarisinde kodladığımız bileşenler bileşen ağacı oluşturulurken eğer binding özelliği ile oluşturulmamışsa JSF kendisi oluşturur,oluşturulmuşsa oluşturulmuş olan o bileşeni kullanır. Ne demek istediğimi aşağıdaki BeanClass.java’dan verdiğim kod parçasını inceleyince anlayacaksınız.

f:converter etiketi ile dönüşüm işleminden sorumlu sınıfı tanıtıyoruz. f:validator ile de girilen metnin geçerliliğini denetleyecek sınıfı tanıtıyoruz.

BeanClass.java’dan Kod Parçası

Yukarıdaki kod parçasında JSF kodlarımız içindeki binding özelliğimiz için kullanmak üzere tanımladığımız bileşenleri görmektesiniz. Bu bileşenler Java kodunda yazılıp xhtml sayfası içinde binding özelliğine verilirse JSF otomatik bileşen oluşturma özelliğini kullanmaz ve burada oluşturulan bileşeni kullanır.

BeanClass sınıfımız içinde yazılı diğer kodlar üzerinde kafa karıştırmamak için çok durmuyorum. Sadece binding özelliğini nasıl kullandığımızı bilmemizin yeterli olduğunu düşünüyorum. Kodun tamamını incelemek isterseniz yazının başında verdiğim Github linkinden ulaşabilirsiniz.

ConverterClass.java Kodu

Converter  ara birimi (interface) getAsObject ve getAsString metotlarını içinde tutan bir arayüzdür bu nedenle bu metotları override etmek zorundayız. Biz veri girdğimizde girdiğimiz veri önce getAsObject metodu ile obje tipine değer alıyoruz. getAsString ile de String tipinde değer alıyoruz.

Girilen veri önce Process Validations aşamasında getAsObject ile alınır. Daha sonra ekrana basmak istediğimizde getAsString ile String tipinde bize verilir.

ValidatorClass.java Kodu

Xhtml kodumuz içinde f:validator etiketine validator etiketi ile verdiğimiz geçerlilik denetleyicisi sınıfımız olan ValidatorClass sınıfımızda denetleme işlemi gerekince validate metodu çağırılıyor.

Ekran Çıktıları

ekran görüntüsü2

 

 

 

 

 

 

 

 

 

Sayfayı ilk çalıştırdığımızda herhangi bir olay tetiklemesi vermediğimiz ve veri giriş çıkışı olmadığından 2,3,4 ve 5. fazlar atlandı. Sadece bileşen ağaçlarını oluşturan 1. ve sayfayı bize sunan 6. faz çalıştı.

Şimdi veri girip GÖNDER butonuna tıklayacağım.

ekran görüntüsü6

 

 

 

 

 

Butona tıkladığımda bileşenlere verilen binding özelliğinden dolayı Java kodunda tanımlanan bileşenlere ait get-set metotları ve girilen metni tutacak değişkenin get-set metodu çağırıldı.

ekran görüntüsü4

 

 

 

 

 

 

 

Bir veri girişi olduğu için 1. fazın hemen akabinde 2. faz olan APPLY REQUEST VALUES fazı devreye girdi. Bu faz ile girilen metin bileşenin lokal hafızasına kaydediliyor. Bu noktada değinmemiz gereken başka bir nokta daha var. inputText bileşenimizin immediate adında true ya da false değer alan bir özelliği var. Eğer bu özelliğe true özelliğini verirsek Process Validations aşamasında olması gereken işlemler Apply Request Values aşamasında gerçekleştirilir ve Process Validations aşaması boş geçilir. immediate=”true” özelliği verdiğimiz bileşenler işlemlerini Apply Request Values aşamasında yaparlar.

Girilen metnin alınmasının ardından sıra bu metnin denetlenmesi aşamasına geliyor. PROCESS VALIDATIONS aşamasında zorunluluk-dönüşüm-geçerlilik sırasında bir kontrol gerçekleşiyor. Zorunluluk için herhangi bir sınıf vs. yazmadık. Bileşene required=true özelliğini verip boş inputText göndermeye çalışırsak JSF yaşam döngüsünde 6. aşamaya atlar ve girilen metni Java koduna yollamaz ve olay metotlarını çağırmaz. Üstteki çıktıda gördüğünüz üzere JSF mimarisi önce dönüşüm ardından da geçerlilik denetleyici kontrolleri çağırıldı.

Process Validations aşamasını başarılı şekilde geçtikten sonra mimari girilen metni Java koduna yükleme aşaması olan UPDATE MODEL VALUES aşamasına geçildi. Bu fazın içinde çıktıda göreceğimiz üzere metni tutacak değişkenimizin set metodu çalışıyor.

ekran görüntüsü5

 

 

 

 

Update Model Values fazının ardından sıra xhtml kodu içinde action,actionListener vs. için verdiğimiz metotların çağırılması aşaması olan INVOKE APPLICATIONS aşamasına geçildi. Bizim kodumuzda commandButton’ımızın action özelliğine metot atadığımız için o metot çaığırıldı. action() adındaki log() fonksiyonu ile metoda girildiğinde loglama yapılmasını sağlıyoruz.

Olayların çaığırımından ardından artık kullanıcıya isteğinin cevabını döndürmemiz lazım,bunun için de RENDER RESPONSE aşamasına geçilerek yaşam döngüsü bitiriliyor. Bu faz içinde sayfamızda girilen metin gösterileceği için önce değişkenden metin alınıyor. Akabinde metne dönüşüm işlemini uygulanıyor. Daha sonra ekrana yazdırılacak değişkenin get metodu çağırılıyor ve faz bitiriliyor.

Bir JSF uygulamasında yaşam döngüsünü uygulamalı olarak elimden geldiğince anlatmaya çalıştım arkadaşlar. Sorularınız olursa yorum kısmından sorabilir ya da [email protected] mail adresimden bana ulaşabilirsiniz. Başka yazıda görüşmek üzere sağlıcakla kalın arkadaşlar.