如何实现在生命周期结束时运行的PhaseListener?

Mah*_*leh 25 jsf jsf-2 phaselistener

如何实现PhaseListener在JSF生命周期结束时运行的?

Bal*_*usC 40

您需要实现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.
    }

}
Run Code Online (Sandbox Code Playgroud)

要使其运行,请按以下方式注册faces-config.xml:

<lifecycle>
    <phase-listener>com.example.MyPhaseListener</phase-listener>
</lifecycle>
Run Code Online (Sandbox Code Playgroud)

更新上面的阶段监听器确实适用于整个范围.要为特定视图设置阶段侦听器,请使用beforePhase和/或afterPhase属性<f:view>.

例如

<f:view beforePhase="#{bean.beforePhase}">
    ...
</f:view>
Run Code Online (Sandbox Code Playgroud)

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

顺便说一下,更多的JSF 2.0方法使用<f:event type="preRenderView">:

<f:event type="preRenderView" listener="#{bean.preRenderView}" />
Run Code Online (Sandbox Code Playgroud)

public void preRenderView() {
    // Do here your job which should run right before the RENDER_RESPONSE.
}
Run Code Online (Sandbox Code Playgroud)


Ole*_*ika 5

jsf 2你可以<f:phaseListener type="my.MyPhaseListener">用来挂钩MyPhaseListener一些facelet.MyPhaseListener应该实现PhaseListener和覆盖

  • afterPhase - 在阶段结束后运行代码
  • beforePhase - 在阶段开始之前运行代码
  • getPhaseId- PhaseId枚举指定要为其调用侦听器的阶段名称(PhaseId.RENDER_RESPONSE作为生命周期的最后阶段)