Merhaba arkadaşlar. Metot İle Değer Değişimi Yakalama yazımızda bir selectOneMenu bileşenimizin valueChangeListener özelliğine değer değişimini yakalayacak bir metot atayarak değer değişimini yakalamıştık. Bu yazımızda ise bu değer değişimini bir ara birim (interface) kullanarak yakalayacağız.
Önceki yazımızdaki UlkeVeKodBean sınıfımızı ve index.xhtml dosyamızı aynen bu yazıda da kullanabiliriz. Fazladan olarak bir Java sınıfı daha ekleyeceğiz projemize.
UlkeDegerDinleyici.java Kodu
import javax.faces.context.FacesContext; import javax.faces.event.AbortProcessingException; import javax.faces.event.ValueChangeEvent; import javax.faces.event.ValueChangeListener; public class UlkeDegerDinleyici implements ValueChangeListener{ @Override public void processValueChange(ValueChangeEvent event) { UlkeVeKodBean ulkeKodu = (UlkeVeKodBean) FacesContext.getCurrentInstance(). getExternalContext().getSessionMap().get("ulke"); ulkeKodu.setUlkeKodu(event.getNewValue().toString()); } }
Bu sınıfımızda değer değişimini yakalamak için ValueChangeListener arabirimini sınıfımıza uyguluyor ve arabirim içindeki processValueChange metodunu Override ederek değişim yakalandığında ne olması gerektiğini bildiriyoruz. Burada dikkat ederseniz biraz karmaşık gelebilecek bir kod yapısı mevcut. Bu bir managed bean içinden diğerine erişmek için kullanılan bir yoldur. Ben bu yazıyı yazarken şu kodu da denedim:
UlkeVeKodBean u=new UlkeVeKodBean(); u.setUlkeKodu(event.getNewValue().toString());
Bu kod ile uygulama istediğimiz gibi çalıştı. İki yolla da set metodunu çağırabiliyoruz.
Gelen ülke kodunu alıyor ve UlkeVeKodBean sınıfındaki ulkeKodu değişkenine atıyoruz ülke kodunu.
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()"> <f:valueChangeListener type="UlkeDegerDinleyici"/> <f:selectItems value="#{ulke.ulkeler}" /> </h:selectOneMenu> </h:panelGrid> </h:form> </h:body> </html>
Önceki yazımızdaki işlemden farklı olarak burada selectOneMenu bileşenimizin içinde <f:valueChangeListener> etiketini kullanacağız. Bu etiket type özelliğine atanmış olan sınıf içinde processValueChange metodunu arar ve o metodu tetikler.
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; } }
Bu sınıfımız hakkında gerekli anlatımları önceki yazıda yapmıştım arkadaşlar.
Ekran Çıktıları
Bu yazıda da bu kadar arkadaşlar. Gelecek yazıda Action Event Handling konusunu işleyeceğiz. Sağlıcakla kalın.
Jsf bilgilerimi tazelemek adına çalışmalarını takıp ediyorum. Küçük eklemeler yapacağım.
UlkeVeKodBean u=new UlkeVeKodBean();
u.setUlkeKodu(event.getNewValue().toString());
Bunun çalıştığını söylemişsin ama bir ManagedBean’in bizim tarafımızdan “new” kulanarak oluşturulmaması gerektiğini duymuştum. (Godoro’dan Önder Teker Jsf eğitim videolarında bahsediyor. ‘Bean’leri oluşturan biz değiliz bağlamın kendi’ diye)
Ek olarak valueChangeListener ‘PROCESS_VALIDATIONS’ Phase’ında tetiklendiği için henüz Model update edilmemiş oluyor. Henüz ‘UPDATE MODEL VALUES’ Phase’ına girmemiş oluyor.
Eğer biz
ulkeKodu.setUlkeKodu(event.getNewValue().toString()); kodunu
şu şekilde değiştirirsek
ulkeKodu.setUlkeKodu(“girdi”);
JSF sayfasındaki h:inputText etiketinin “girdi” olarak değişmediğini görürüz.
Başlangıçta bende tam olarak ne olduğunu anlamadım ama biraz araştırmadan sonra bu kanıya vardım.
Kaynak : BalusC
http://stackoverflow.com/questions/11879138/when-to-use-valuechangelistener-or-fajax-listener
Bu güzel kaynağı hazırladığın için sana da teşekkürler İlkay.