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

时间:2011-12-05 16:56:04

标签: jsf jsf-2 phaselistener

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

2 个答案:

答案 0 :(得分:39)

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

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

E.g。

<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.
    }
}

使用<f:event type="preRenderView">

的方式更多的是JSF 2.0
<f:event type="preRenderView" listener="#{bean.preRenderView}" />

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

答案 1 :(得分:5)

jsf 2中,您可以使用<f:phaseListener type="my.MyPhaseListener">为某些MyPhaseListener挂钩faceletMyPhaseListener应实施PhaseListener并覆盖

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