web-dev-qa-db-ja.com

ライフサイクルの終わりに実行されるPhaseListenerを実装する方法は?

JSFライフサイクルの最後に実行されるPhaseListenerを実装するにはどうすればよいですか?

25
Mahmoud Saleh

PhaseListener インターフェースを実装し、 beforePhase()PhaseId_RENDER_RESPONSE 。レンダリング応答は、JSFライフサイクルの最後のフェーズです。

public class MyPhaseListener implements PhaseListener {

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RENDER_RESPONSE;
    }

    @Override
    public void beforePhase(PhaseEvent event) {
        // Do your job here which should run right before the RENDER_RESPONSE.
    }

    @Override
    public void afterPhase(PhaseEvent event) {
        // Do your job here which should run right after the RENDER_RESPONSE.
    }

}

実行するには、faces-config.xmlで次のように登録します。

<lifecycle>
    <phase-listener>com.example.MyPhaseListener</phase-listener>
</lifecycle>

Update上記のフェーズリスナーは実際にアプリケーション全体に適用されます。特定のビューのフェーズリスナーを使用するには、 <f:view>beforePhaseおよび/またはafterPhase属性を使用します。

例えば。

<f:view beforePhase="#{bean.beforePhase}">
    ...
</f:view>

public void beforePhase(PhaseEvent event) {
    if (event.getPhaseId() == PhaseId.RENDER_RESPONSE) {
        // Do here your job which should run right before the RENDER_RESPONSE.
    }
}

JSF 2.0のもう1つの方法は、 <f:event type="preRenderView"> を使用する方法です。

<f:event type="preRenderView" listener="#{bean.preRenderView}" />

public void preRenderView() {
    // Do here your job which should run right before the RENDER_RESPONSE.
}
40
BalusC

jsf 2を使用できます<f:phaseListener type="my.MyPhaseListener">は、いくつかのMyPhaseListenerfaceletをフックします。 MyPhaseListenerPhaseListenerを実装してオーバーライドする必要があります

  • afterPhase-フェーズ終了後に実行されるコード付き
  • beforePhase-フェーズ開始前に実行されるコード
  • getPhaseId-PhaseId enumは、リスナーが呼び出されるフェーズの名前を指定します(PhaseId.RENDER_RESPONSEライフサイクルの最終段階として)
5