Merhaba arkadaşlar. Birkaç yazılık bir yazı dizi halinde gelecek derslerimizde JSF’nin Olay Yakalama (Event Handling) yöntemlerini inceleyeceğiz. Daha önceleri de belirttiğimiz gibi JSF olaylar üzerine inşa edilmiş bir çatı idi. Yani meydana gelecek olaylara göre davranacak bir çatı. JSF’yi inşa edenler bu olayları 3 gruba bölmüşler:
- ValueChangeEvent
- ActionEvent
- ApplicationEvent
Biz bu dersimizde ValueChangeEvent konusunu işleyeceğiz. Adından da anlıyacağınız üzere bu olay tipi değer değiştiği anda bir olay tetiklenmesini sağlayan tiptir.
Bizim bir selectOneMenu’müz olduğunu düşünelim ve kullanıcının bu selectOneMenu’den bir değer seçtiğinde sayfadaki bir şeyin otomatik değişmesini istiyoruz. Bu durumda ValueChangeEvent kullanabiliriz.
ValueChangeEvent kullanmak istediğimizde bunun da iki yolu mevcut. İstersek valueChangeListener özelliğine bir metot atayarak kullanabilir,istersek de ValueChangeListener interface’ini kullanabiliriz.
Bu yazıda valueChangeListener özelliğine metot atama yolu değişimi yakalamayı öğreneceğiz. Gelecek yazıda ise interface kullanarak bu olayı yakalamayı öğreneceğiz. Şimdi örneğimize bakalım:
UlkeveKodBean.java Kodu
import java.io.Serializable; import java.util.LinkedHashMap; import java.util.Map; import javax.annotation.PostConstruct; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import javax.faces.event.ValueChangeEvent; @ManagedBean(name="ulke") @SessionScoped public class UlkeVeKodBean implements Serializable{ private Map<String,String> ulkelerVeKodlari; private String ulkeKodu = "tr"; @PostConstruct public void listeyiDoldur() { ulkelerVeKodlari = new LinkedHashMap<String,String>(); ulkelerVeKodlari.put("Türkiye Cumhuriyeti", "tr"); ulkelerVeKodlari.put("Azerbeycan", "az"); ulkelerVeKodlari.put("Türkmenistan", "tm"); ulkelerVeKodlari.put("Kazakistan", "kz"); } public void ulkeKoduDegisti(ValueChangeEvent e){ ulkeKodu = e.getNewValue().toString(); } public Map<String,String> getUlkeler() { return this.ulkelerVeKodlari; } public String getUlkeKodu() { return ulkeKodu; } public void setUlkeKodu(String ulkeKodu) { this.ulkeKodu = ulkeKodu; } }
Java kodumuz içinde bir Map tanımladık. Map’ler bize Java’da anahtar-değer ilişkisi sağlayan yapılardır. Dikkat ederseniz bizim Map’imiz 2 parametre alıyor. Bunlardan birisi anahtar kelime örneğin isim diğeri de bu anahtar kelimeye karşılık gelen değerdir,örneğin ilkay.
JSF’de selectOneMenu bileşenine f:selectItem ile veri eklemek istediğimizde itemLabel ve itemValue özelliklerine değer atamamız gerekiyor. Eğer Map yapısını kullanırsak ve f:selectItems’a value olarak bu Map yapısını verirsek anahtar kelime(birinci parametre) itemLabel olarak,ikinci kelime itemVaue olarak geçiyor. Alttaki xhtml kodunu da incelediğinizde daha iyi anlayacaksınız.
listeyiDoldur metodu ile uygulama çalıştığı anda listenin dolmasını sağlıyoruz. @PostConstruct bize yardım ediyor. @PostConstruct ile işaretlenmiş metotlar constructor‘ların akabinde hemen çalışır.
ulkeKoduDegisti metodu aldığı ValueChangeEvent parametresi ile değer değişimini yakalar ve gelen yeni değeri ülke kodu değişkenine atar.
Diğerleri get-set metotlarımız.
index.xhtml Kodu
<?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" xmlns:ui="http://java.sun.com/jsf/facelets" > <h:body> <h1>valueChangeListener Özelliğine Metot Atama Yolu İle Kullanım</h1> <h:form> <h:panelGrid columns="2"> Seçilen Ülkenin Kodu : <h:inputText id="ulkeKodu" value="#{ulke.ulkeKodu}"/> Ülke Seçiniz: <h:selectOneMenu value="#{ulke.ulkeKodu}" onchange="submit()" valueChangeListener="#{ulke.ulkeKoduDegisti}"> <f:selectItems value="#{ulke.ulkeler}" /> </h:selectOneMenu> </h:panelGrid> </h:form> </h:body> </html>
Xhtml kodumuz içinde ulkeKodu id’li inputText bileşenimiz bize seçilen ülkenin ülke kodunu gösterecek.
selectOneMenu bileşenimizde value özelliği Java sınıfımızda seçilen değeri kimin tutacağını söylüyor. onchange=”submit()” ifadesi ile değer değişimini olduğunu bildirip gerekli metodu tetikliyoruz. valueChangeListener özelliğine değer değişimi olduğunda çalışacak metodu atıyoruz. f:selectItems özelliğine Java sınıfını anlatırken bahsettiğim üzere Map yapımız olan ulkeler‘i atıyoruz.
Ekran Çıktıları
Azerbaycan’ı seçtiğimde ülke kodu tr‘den az‘ye değişiyor.
Bu yazıda bu kadar arkadaşlar. Gelecek yazıda ValueChangeListener ara birimi (interface) ile değer değişimini yakalamayı öğreneceğiz. Sağlıcakla kalın.
bu örneği 2 tane selectOneMenu kullanarak yapmam lazım yani 1.de seçtiğim seçenekle ilgili şeyler 2. selectOneMenude seçenek olarak gösterilecek fakat ikisi de veritabanından çekilecek. 4-5 gündür uğraşıyorum fakat 2. selectOneMenu ye sadece ilk kaydı getirebiliyorum birden fazla kayıt getiremiyorum. Yardımcı olabilecek bi fikriniz mi var mı ?