JSF 拡張ポイント - PhaseListener | フェーズ制御

2009/06/24 11:40Update
TAGS: JSF | 拡張 | PhaseListener | フェーズ | リスナー | ライフサイクル

JSFフレームワークでは、様々な拡張ポイントを提供しています。フェーズの前後にロジックを入れたい場合のPhaseListenerはその拡張ポイントの一つです。

概要


JSFのライフサイクルには次6つのフェーズがあります。
①Restore View Phase:ビューの復元フェーズ
②Apply Request Values Phase:リクエスト値の適用フェーズ
③Process Validation Phase:入力値の検証(バリデーション実行)フェーズ
④Update Model Values Phase:モデル値の更新フェーズ
⑤Invoke Application Phase:アプリケーションの起動フェーズ
⑥Render Response Phase:レスポンスのレンダリング(出力)フェーズ

JSFでは、①~⑥(いずれか)それぞれのフェーズを順番に実行します。

JSF のPhaseListenerは、これらのフェーズの前後に何かの処理をしたい場合に役立ちます。
例えば、
各フェーズが実行される前後にログなどの共通処理を入れたい、
権限チェック、
条件によって次のフェーズを実行したくない
などの場合、PhaseListenerを実装し、リスナーの登録をすることができます。

PhaseListenerの実装手順


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

javax.faces.event.PhaseListener {
    //フェーズ前に実行される
    public void beforePhase(PhaseEvent phaseEvent);
    //フェーズ後に実行される
    public void afterPhase(PhaseEvent phaseEvent);
    //どのフェーズで実行されるかを指定(フェーズのいずれの一つか全フェーズを指定可能)
    public PhaseId getPhaseId();
}

定義例:
package mypackage;

import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpServletRequest;

public class ApplicationPhaseListener implements PhaseListener {
    /**
     * {@inheritDoc}
     * @see javax.faces.event.PhaseListener#beforePhase(javax.faces.event.PhaseEvent)
     */
    public void beforePhase(PhaseEvent phaseEvent) {
        //何らかの処理:ログなど
    }

    /*
     * @see javax.faces.event.PhaseListener#afterPhase(javax.faces.event.PhaseEvent)
     */
    public final void afterPhase(PhaseEvent phaseEvent) {
        //何らかの処理:ログなど
    }

    /**
     * @see javax.faces.event.PhaseListener#getPhaseId()
     */
    public PhaseId getPhaseId() {
        return PhaseId.ANY_PHASE;    //任意フェーズ
                    //PhaseId.RESTORE_VIEW
                    //PhaseId.APPLY_REQUEST_VALUES
                    //PhaseId.PROCESS_VALIDATIONS
                    //PhaseId.UPDATE_MODEL_VALUES
                    //PhaseId.INVOKE_APPLICATION
                    //PhaseId.RENDER_RESPONSE
                    //PhaseId.ANY_PHASE
    }
}


2)faces-config.xmlにカスタムActionListenerクラスを登録します。
次のように、定義したPhaseListenerクラスをfaces-config.xmlに登録すれば、適応されます。

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>
    <lifecycle>
        <phase-listener>mypackage.ApplicationPhaseListener</phase-listener>
    </lifecycle>
<faces-config>

.

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

Sponsored Link


Comments