Merhaba arkadaşlar,

Bu yazımda JSF’de action ve actionListener’ın ne olduğunu anlatacağım. Öncelikle arkadaşlar bilindiği gibi web üzerinde işlem yaparken olayları tetiklemek için butonları kullanırız. Bir siteye giriş yaparken ya da yorum yazarken vs. JSF üzerinde bu işlemleri yapabilmek için ilgili bileşen üzerinde ya action ya da actionListener tanımlamalıyız. Peki bu ikisi arasındaki fark nedir? Öncelikle bu soruyu cevaplayalım. Arkadaşlar action özelliği bir sayfadan başka bir sayfaya statik ya da dinamik bir şekilde geçişi sağlar. ActionListener ise tetiklendikten sonra tanımlanana olayı gerçekleştirir. Şöyle örnek verebiliriz. Siteye giriş yaptığınız vakit butona tıkladığınızda kullanıcı adının ve şifrenin veritabanında olup olmadığını kontrol eden kısım actionListener içerisindedir. İşlem sonucu yönlendirileceğiniz sayfa ise action içinde tanımlanır. Kısaca actionListener içinde event, action içinde işlem sonucu yönlendirilecek sayfa belirtilir. Şimdi bunu bir örnekle açıklayalım. Öncelikle index.xhtml sayfamızı ve java kodumuzu inceleyelim.

index.xhtml

<?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://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>Blog Deneme</title>
    </h:head>
    <h:body>
        <h:form>
        <p:growl id="growl" showDetail="true" />

        <p:commandButton value="Action Butonu" action="#{act.actionMethod()}" />
        <p:commandButton value="ActionListener Butonu" actionListener="#{act.actionListenerMethod}" update="growl" />

        <br />
        <p:outputLabel value="#{act.a}" id="a" />
        <p:commandButton value="Action-ActionListener Butonu" action="#{act.actionMethod2()}" actionListener="#{act.actionListenerMethod2()}" update="a"/>
        </h:form>
    </h:body>
</html>

actionPage.xhtml

<?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://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        ActionPage
    </h:body>
</html>

ActionBean.java

/*
 *
 * Bu sınıf index.xhtml içinde kullanılan bean sınıfı
 *
 */
package com.kodumundunyasi.blogdeneme.actions;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

/**
 *
 * @author Yusuf ÖNDER
 */
@ManagedBean(name = "act")
@SessionScoped
public class ActionBean {
    String a = "Yusuf";

    public String getA() {
        return a;
    }

    public void setA(String a) {
        this.a = a;
    }

    //actionPage sayfasına gideceğiz
    public String actionMethod() {
        return "actionPage?faces-redirect=true";//faces-redirect=true daha sonra değineceğim
    }

    //Event'in olduğu sayfanın id'sini yazacak
    public void actionListenerMethod(ActionEvent event) {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "ActionListener", event.getComponent().getId()));

    }

    //1.çalışan kod
    //3.commandButton metodu
    public void actionListenerMethod2() {
        a += " Listener";
    }

    //2.çalışan kod
    //3.commandButton metodu
    public void actionMethod2() {
        a += " Action";
    }
}

Sayfamızda 3 commandButton ve 1 outputLabel var öncelikle üstteki 2 commandButton inceleyeceğiz. Üstteki butona tıkladığımızda actionMethod çalışacak ve bizi actionPage.xhtml sayfasına yönlendirecek. 2.butona tıkladığımızda ise actionListenerMethod() çalışacak ve bize ilgili bileşenin id’sini gösterecek.

İlk Buton Tıklandığında
2014-09-27 02-19-18 Ekran görüntüsü
2014-09-27 02-20-03 Ekran görüntüsü

İkinci Buton Tıklandığında
2014-09-27 02-20-25 Ekran görüntüsü
2014-09-27 02-20-40 Ekran görüntüsü

En altta ise bir outputLabel ve commandButton var ve bu buton üzerinde hem action hem de actionListener tanımlı. Peki tıkladığımızda hangisi önce çalışacak?
Son Buton Tıklandığında
2014-09-27 02-21-12 Ekran görüntüsü

Gördüğünüz gibi önce listener sonra ise action çalıştı ki olması gereken mantık da odur. Önce bir event oluşur ve gerçekleştirilir ve o evente göre bir yönlendirme meydana gelir.

Bu yazımızında sonun gelmiş bulunmaktayız. Umarım iyi bir yazı olmuştur. Bir daha ki yazımızda görüşmek üzere esenlikle kalın 🙂