JSF 拡張ポイント - ActionListener | ボタンイベント制御
2009/06/24 10:50Update
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>
.
Sponsored Link
- Relative Articles
- JSFプロジェクト階層構造例 - (2009/06/20 16:39)
- JSFのインストール - 初めてのJSFアプリ作成・実行 - (2009/06/23 16:24)
- ライフサイクルから理解するJSFの仕組み - (2009/06/24 17:43)
- JSF開発におけるweb.xmlの基本的な設定方法 - (2009/03/13 18:13)
- JSF Webページ(JSP)の基本的な書き方 - (2009/03/16 11:58)
- JSF Managed-Beanの定義・設定・使い方 - (2009/03/16 14:48)
- JSF メッセージ処理 概要 - (2009/06/20 20:01)
- JSF Validator入門 - 標準Validator及びその使い方 - (2009/06/22 18:26)
- JSF Converter入門 - 標準Converter及びその使い方 - (2009/06/23 17:17)
- JSF画面遷移 - (2009/06/24 18:08)