JSF 拡張ポイント - ActionListener | ボタンイベント制御

2009/06/24 10:50Update
TAGS: JSF | 拡張 | ActionListener | ボタン | action | イベント

JSFフレームワークでは、様々な拡張ポイントを提供しています。ActionListenerはその拡張ポイントの一つです。

ActionListenerの実行タイミング


ボタン(commandButton)やコマンドリンク(commandLink)などが押下時、
JSFは、JSFアプリのライフサイクルの「Invoke Application Phase:アプリケーション機能フェーズ」の「broadcast event:ブロードキャスト」の時、ActionListenerを通じてボタンのイベントメソッドを呼び出します。

こんな感じです。
<h:commandButton value="submit" action="#{MyBean.doSubmit}" ... />



ActionListener

MyBeanのdoSubmit()メソッドが実行されます。



イベントメソッドの実行(ボタン押下)の前後にログやExceptionなど処理を入れたいときがあります。
こんな場合、JSFのActionListener拡張ポイントを利用して自前のActionListenerクラスを実装すればよいのです。

カスタムActionListenerの実行手順


1)javax.faces.event.ActionListenerインタフェースを実装したクラスを定義します。

定義例:
package mypackage;

import javax.faces.application.Application;
import javax.faces.application.NavigationHandler;
import javax.faces.component.ActionSource;
import javax.faces.context.FacesContext;
import javax.faces.el.EvaluationException;
import javax.faces.el.MethodBinding;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ActionEvent;
import javax.faces.event.ActionListener;

public class ActionListenerImpl implements ActionListener {
    //Override
    public void processAction(ActionEvent actionEvent) throws AbortProcessingException {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Application application = facesContext.getApplication();

        ActionSource actionSource = (ActionSource) actionEvent.getComponent();
        MethodBinding methodBinding = actionSource.getAction();    //メソッド・バインディング
        
        String fromAction = null;    //遷移元
        String outcome = null;        //遷移先
        try {

            if (methodBinding != null) {
                //ボタン押下処理前のログはここで
                fromAction = methodBinding.getExpressionString();
                outcome = (String) methodBinding.invoke(facesContext, null);    //イベント・メソッドを呼び出し
                //ボタン押下処理後のログはここで
            }

        } catch (EvaluationException eex) {
            //Exception処理はここで
        }
        
        NavigationHandler navigationHandler = application.getNavigationHandler();
        navigationHandler.handleNavigation(facesContext, fromAction, outcome);  //画面遷移
        
        //Render Response 
        facesContext.renderResponse();
    }
}


2)faces-config.xmlにカスタムActionListenerクラスを登録します。
次のように、定義したActionListenerクラスをfaces-config.xmlに登録すれば、自動的にActionListenerをmypackage.ActionListenerImplにするようになります。

faces-config.xml
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
                              "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config>
    <!--  Application Config -->
    <application>
        <action-listener>mypackage.ActionListenerImpl</action-listener>
    </application>
<faces-config>

.

有关作者
Syboos.jp編集長システム設計や開発、保守運営などを行ってます。オープンソース技術に興味があります。

Sponsored Link


Comments