【发布时间】:2012-01-13 09:39:23
【问题描述】:
如何实现在 JSF 生命周期结束时运行的 PhaseListener?
【问题讨论】:
标签: jsf jsf-2 phaselistener
如何实现在 JSF 生命周期结束时运行的 PhaseListener?
【问题讨论】:
标签: jsf jsf-2 phaselistener
您需要实现PhaseListener 接口并挂钩PhaseId_RENDER_RESPONSE 的beforePhase()。呈现响应是 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 属性。
例如
<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.
}
【讨论】:
event.getPhaseId() == PhaseId.RENDER_RESPONSE 中是== 可以,而不是equals?
PhaseId javadoc: docs.oracle.com/javaee/6/api/javax/faces/event/PhaseId.html 这是一个类型安全的常量。无论如何,它没有覆盖equals(),因此继承了Object#equals(),而后者基本上已经==。
equals。谢谢你的解释。
afterPhase() 方法或使用<f:view afterPhase>。
在jsf 2 中,您可以使用<f:phaseListener type="my.MyPhaseListener"> 挂钩MyPhaseListener 以获得一些facelet。 MyPhaseListener 应该实现 PhaseListener 并覆盖
afterPhase - 在阶段结束后运行代码beforePhase - 在阶段开始之前运行代码getPhaseId - PhaseId 枚举指定要为其调用侦听器的阶段名称
(PhaseId.RENDER_RESPONSE 作为生命周期的最后阶段)【讨论】: