JSF

JSF Dersleri-ActionListener Kullanımı

Merhaba arkadaşlar. Bu yazımızda JSF içinde “ActionListener” kullanımını öğreneceğiz.

Hepimizin bildiği gibi Java’da Swing ile GUI kodlarken koyduğumuz butonların çalışması için onlara bir olay tanımlamamız gerekiyor. Bu olayları yazarken de ActionListener yapısını kullanıyoruz. JSF içinde butonlara action verip gideceği sayfayı tayin ediyoruz. Action’ın yanında butonara olay da tanımlayabiliriz. Şimdi örnek yapalım ve konuyu anlamaya çalışalım.

NetBeans ortamımızda “ActionListenerInJSF” adında bir proje oluşturalım ve projemize kaynak kodlarını verdiğim dosyaları ekleyelim.Kodların açıklaması kodun altındadır.

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">
   <h:head>
      <title>JSF Dersleri</title>		   
   </h:head>
   <h:body> 
      <h2>actionListener Örneği</h2>
      <h:form>
      <h2>Method İle Kullanma</h2>
      <hr/>
      <h:commandButton id="submitButton" 
         value="submit" action="#{userData.showResult}"
         actionListener="#{userData.updateData}" >
      </h:commandButton>
      <h2>ActionListener interface İle Kullanma</h2>
      <hr/>
      <h:commandButton id="submitButton1" 
         value="submit1" action="#{userData.showResult}" >
         <f:actionListener 
            type="UserActionListener" />
      </h:commandButton>
      </h:form>
    </h:body>
</html>

JSF içinde actionListener’ın kullanımını 2 yöntemle yapabiliyoruz. Biz istersek ya butonun actionListener özelliğini ya da <f:actionListener> etiketini kullanabiliriz. Butonun actionListener özelliğini kullanmak istersek Java sınıfımızda tanımladığımız olay metodunu değer olarak veriyoruz. <f:actionListener> etiketini kullanmak istersek de ActionListener arayüzünü implement ettiğimiz sınıfın adını type özelliğine atıyoruz. O sınıfın içinde tanımlı olan overRide edilmiş olay metodu çağrılıyor.

result1.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:f="http://java.sun.com/jsf/core"    
   xmlns:h="http://java.sun.com/jsf/html">
   <h:head>
   <title>JSF Tutorial!</title>   
   </h:head>
   <h:body>
   <h2>Result</h2>
   <hr />
   #{userData.data}
   </h:body>
</html>

Bu kod  içinde yaptığımız tek şey actionListener ile değerini değiştirdiğimiz nesneyi ekrana yazdırmak.

UserActionListener.java Kodu

import javax.faces.context.FacesContext;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ActionEvent;
import javax.faces.event.ActionListener;

public class UserActionListener implements ActionListener{
   @Override
   public void processAction(ActionEvent arg0) 
   throws AbortProcessingException {
      UserData user = (UserData) FacesContext.getCurrentInstance().
       getExternalContext().getSessionMap().get("userData"); 
       user.setData("Hello World2");
       /*UserData user1=new UserData();
       user1.setData("Hello World2");
       Böyle bir tanımlama JSF'de actionListener kullanımı için geçersizdir.Siz yine setData'ya ulaşıp
       Hello World2 yazardınız ama bu işlem çalışmaz çünkü uygulama web tabanlı bir uygulama.*/
       
   }
}

Gördüğünüz gibi bu kod içinde yazdığımız sınıfı ActionListener arayüzünden implement ettik. Override ettiğimiz metodun içinde UserData sınıfı içindeki user nesnesinin setData metoduna erişmek normal Java ifadelerinden farklı bir ifade yazdık. Çünkü biz bu metodu JSF tarafından çağırıyoruz. Bu nedenle işlemimizi yukarıdaki koddaki gibi yapmalıyız. Bu kod içinde data nesnenin değerini değiştiriyoruz.

UserData.java Kodu

import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ValueChangeEvent;
import javax.faces.event.ActionEvent;
@ManagedBean(name = "userData")
@SessionScoped
public class UserData implements Serializable {

   private String data = "sample data";
   
   public String showResult(){
      return "result1";
   }

   public void updateData(ActionEvent e){
      data="Hello World1";
   }

   public String getData() {
      return data;
   }

   public void setData(String data) {
      this.data = data;
   }
}

Bu kodumuzda data nesnesine ait get ve set metodlarımız, yönlendirme yapacak showResult veolay metodumuz olan updateData  metodumuz yer alıyor. Bu sınıfı ActionListener’dan implemet etmedik çünkü Override edeceğimiz bir metot yok. Olay metodunu kendimiz yazdık.

Bu iki yöntem arasındaki farkı özetlemek gerekirse şöyle diyebiliriz:

Butonun actionListener özellğini kullanmak istersek actionListener özellğine olay metodunu atıyoruz ve olay metodunun yer aldığı sınıfı ActionListener arayüzünden implement etmemize gerek yok. Ama <f:actionListener> kullanmak istersek type özelliğine sınıf isimini atayacağız ve o sınıfa actionListener’ı implement etmek zorundayız ve processAction metodunu Override etmemiz gerekiyor.

Ekran çıktılarımıza bakalım.

submit Butonuna tıklıyoruz.

submit Butonuna tıklıyoruz.

 

 

 

 

 

 

 

 

updateDate metodu çalıştı ve Hello World 1 yazdı.

updateDate metodu çalıştı ve Hello World 1 yazdı.

 

 

 

 

 

 

Geri gelip submit1 butonuna tıklıyorum. ActionListener'ı implement ettiğim sınıf çalıştı ve Hello World2 yazdı.

Geri gelip submit1 butonuna tıklıyorum. ActionListener’ı implement ettiğim sınıf çalıştı ve Hello World2 yazdı.

 

 

 

 

 

 

 

ActionListener’ı böyle kullanıyoruz arkadaşlar. ActionListener’ı kullanırken bir de parametre geçirme olayı var. Onu da bir sonraki yazıda öğreneceğiz. Görüşmek üzere esen kalın.

 

Yorum Yap