【问题标题】:JSF: How can I check whether I'm in the "Restore View" phase?JSF:如何检查我是否处于“恢复视图”阶段?
【发布时间】:2010-03-30 16:57:45
【问题描述】:

当我的托管 bean 中的特定方法被调用时,我想知道我是否处于 JSF 生命周期的恢复视图阶段。我怎样才能做到这一点?

【问题讨论】:

    标签: jsf jakarta-ee


    【解决方案1】:

    如果您已经在使用 JSF 2.0,那么您可以使用 FacesContext#getCurrentPhaseId() 进行检查:

    if (FacesContext.getCurrentInstance().getCurrentPhaseId() == PhaseId.RESTORE_VIEW) {
        // Restore view called.
    }
    

    但是,如果您仍在使用 JSF 1.x,那么您最好的方法是使用 PhaseListener,它在 PhaseId.RESTORE_VIEW 上侦听,在 beforePhase() 期间在请求范围内设置标志/切换/令牌并删除afterPhase() 期间的它。然后让 bean 的 getter 方法检查它是否存在于请求范围内。

    也就是说,你到底需要它做什么?我从来没有需要这样的功能需求。 bean 的构造函数或 @PostConstruct 带注释的方法可能不是一个更好的地方来做这样的初始化工作吗?

    【讨论】:

    • 我只在 JSF 1.x 上。我想做这样的事情的原因是在恢复视图阶段,在我的托管 bean 上调用了一个我不需要调用的方法,而且它特别昂贵。所以我想输入“如果在恢复视图中,不要做任何事情”的逻辑。
    • 您是否考虑过相反的情况?检查您是否在RENDER_RESPONSE。这样您就可以使用 if (FacesContext.getCurrentInstance().getRenderResponse()) {} 代替自 JSF 1.0 以来已经可用的。但是如果 bean 本身是请求范围的,那么我只需将它放在 bean 的构造函数中。除非 bean 有太多的责任,但这是另一个问题 ;)
    • OK-- 我想检查 getRenderResponse 但不确定这是否会最终告诉您您是否处于 RestoreView 阶段。我试试看……
    • 如果你在RENDER_RESPONSE,它只会返回true。此阶段总是在请求期间作为最后阶段执行一次,就像 RESTORE_VIEW 在请求期间总是作为第一阶段执行一次。
    • @BalusC 恳请您就以下问题征求意见:有同样的需求(在 APPLY_REQUEST 阶段跳过数据收集,仅在 RENDER_RESPONSE 阶段执行)。 FacesContext.getCurrentInstance().getRenderResponse() - 工作正常,但是当第一次打开页面时 - 它在 RENDER_RESPONSE 阶段返回 false(通过 PhaseListener 调试检查)。任何建议如何解决这个问题? (IBM Domino XPages 上的 JSF 1.x)。提前致谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 2015-01-09
    • 2014-05-28
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    相关资源
    最近更新 更多