かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

PhaseListener

いつもGoogleで検索してJSF ライフサイクルとかのページに行き着くけど自分でもメモ。

PhaseListenerを使うとJSFのライフサイクルの途中に任意の処理を挟める。

package okazuki;

import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;

public class MyPhaseListener implements PhaseListener{

    // 各フェースの前に呼ばれる
    public void beforePhase(PhaseEvent event) {
        System.out.println("[BEFORE]" + event.getPhaseId());
        FacesContext ctx = event.getFacesContext(); // FacesContextもとれる
        UIViewRoot root = ctx.getViewRoot(); // view rootもとれる
        String viewId = root.getViewId(); // viewIdもとれる
    }

    // 各フェーズの後に呼ばれる
    public void afterPhase(PhaseEvent event) {
        System.out.println("[AFTER]" + event.getPhaseId());
    }

    //対象のフェイズIDを返す。ここでは全てのフェイズを指定。
    public PhaseId getPhaseId() {
        return PhaseId.ANY_PHASE;
    }
}

フェーズはPhaseIdに定義されてるだけある。
名前から大体わかる??

PhaseId.ANY_PHASE 全フェーズ
PhaseId.RESTORE_VIEW リクエストからUIコンポーネントツリーを作る
PhaseId.APPLY_REQUEST_VALUES リクエストの値をUIコンポーネントに適用
PhaseId.PROCESS_VALIDATIONS バリデーション実行
PhaseId.UPDATE_MODEL_VALUES モデルの値が更新?
PhaseId.INVOKE_APPLICATION イベントが走る(ボタンクリックやら
PhaseId.RENDER_RESPONSE レスポンス生成


faces-config.xmlに登録したら使える。

<?xml version='1.0' encoding='UTF-8'?>
<!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>okazuki.MyPhaseListener</phase-listener>
  </lifecycle>
</faces-config>