かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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>