【问题标题】:How to implement a PhaseListener which runs at end of lifecycle?如何实现在生命周期结束时运行的 PhaseListener?
【发布时间】:2012-01-13 09:39:23
【问题描述】:

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

【问题讨论】:

    标签: jsf jsf-2 phaselistener


    【解决方案1】:

    您需要实现PhaseListener 接口并挂钩PhaseId_RENDER_RESPONSEbeforePhase()。呈现响应是 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>
    

    更新上述阶段监听器确实是应用程序范围的。要为特定视图设置相位侦听器,请使用 &lt;f:view&gt;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.
        }
    }
    

    顺便说一句,使用&lt;f:event type="preRenderView"&gt;

    <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
    • @gurung: 阅读 PhaseId javadoc: docs.oracle.com/javaee/6/api/javax/faces/event/PhaseId.html 这是一个类型安全的常量。无论如何,它没有覆盖equals(),因此继承了Object#equals(),而后者基本上已经==
    • 这就是我所期待的。我想确认一下,因为我一直在盲目地使用equals。谢谢你的解释。
    • @BalusC 如果我想在渲染视图而不是预渲染之后做点什么,是否存在等效阶段,或者以其他方式完成?
    • 使用afterPhase() 方法或使用&lt;f:view afterPhase&gt;
    【解决方案2】:

    jsf 2 中,您可以使用&lt;f:phaseListener type="my.MyPhaseListener"&gt; 挂钩MyPhaseListener 以获得一些faceletMyPhaseListener 应该实现 PhaseListener 并覆盖

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-23
      • 2012-03-21
      相关资源
      最近更新 更多