如何实现在JSF生命周期结束时运行的PhaseListener
?
答案 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">
:
<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
挂钩facelet
。 MyPhaseListener
应实施PhaseListener
并覆盖
afterPhase
- 代码将在阶段结束后运行beforePhase
- 包含要在阶段开始之前运行的代码getPhaseId
- PhaseId
枚举,指定要为其调用侦听器的阶段名称
(PhaseId.RENDER_RESPONSE
作为生命周期的最后阶段)