いつも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>