MyFacesでRederectした際のライフサイクル
faces-config.xmlの遷移定義で
Redirectのレスポンスを返す場合、レスポンスにちょっとした仕掛けをしたいのだけど、PhaseListenerで出来るのかな?という疑問。
結論から言うと出来そうな感じ。
なんでそんな疑問が出たかというと、Redeirectの場合ってどこまでライフサイクルが進むのだろうか?と考えたのが原因。
INVOKE_APPLICATIONまで行われるのは確実なんだけど、INVOKE_APPLICATIONのafterPhaseでPhaseListenerが実行されるのか?ということ
次画面のviewIDが欲しかったので、INVOKE_APPLICATIONのafterPhaseでPhaseListenerが動いていないのであれば、別の方法を模索する必要がある。
と、いう事情で調べてみた。調査にはもちろんPhaseListenerを使用。
package test;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
public class TestPhaseListener implements PhaseListener {
public void afterPhase(PhaseEvent event) {
TestUtil.doPrintLog(this, createLogString(event, "[afterPhase]"));
}
public void beforePhase(PhaseEvent event) {
TestUtil.doPrintLog(this, createLogString(event, "[beforePhase]"));
}
private String createLogString(PhaseEvent event, String PhaseTiming) {
StringBuilder logStr = new StringBuilder();
logStr.append(PhaseTiming);
logStr.append(event.getPhaseId().toString());
return logStr.toString();
}
public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE;
}}
結果
[beforePhase]RESTORE_VIEW(1)
[afterPhase]RESTORE_VIEW(1)
[beforePhase]APPLY_REQUEST_VALUES(2)
[afterPhase]APPLY_REQUEST_VALUES(2)
[beforePhase]PROCESS_VALIDATIONS(3)
[afterPhase]PROCESS_VALIDATIONS(3)
[beforePhase]UPDATE_MODEL_VALUES(4)
[afterPhase]UPDATE_MODEL_VALUES(4)
[beforePhase]INVOKE_APPLICATION(5)
[afterPhase]INVOKE_APPLICATION(5)
[beforePhase]RESTORE_VIEW(1)
[afterPhase]RESTORE_VIEW(1)
[beforePhase]RENDER_RESPONSE(6)
[afterPhase]RENDER_RESPONSE(6)
INVOKE_APPLICATIONのafterPhaseが実行されている。
これで簡単に出来そうだ。でももしかしたらLifeCycleの実装によるのかもしれない。そこまでは調べてない。