【问题标题】:Preserving JSF messages after a redirect重定向后保留 JSF 消息
【发布时间】:2011-09-21 16:15:40
【问题描述】:

我有一个 JSF 页面(使用 MyFaces 2.0),它在第一次显示时会收集一些数据。如果它找不到某些信息,它应该提供一条消息以达到该效果并重定向回不同的页面。我尝试使用此处找到的解决方案 Preserving FacesMessage after redirect for presentation through <h:message> in JSF (setKeepMessages(true)) 但重定向后消息未显示。我能挑出的唯一区别是我没有使用导航规则,我在外部上下文中调用了 redirect() 调用,因为这不是在正常操作中发生的。

相关代码:

public void redirectToPageWithMessage(String inPage, String message, FacesMessage.Severity severity){
    getFlash().setKeepMessages(true);
    addMessage(message, severity);
    try {
        getFacesContext().getExternalContext().redirect(inPage);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

不幸的是,这似乎不起作用。重定向发生得很好,但是 标签没有显示消息。 redirect() 发生的方式有什么不同会阻止它工作吗?

【问题讨论】:

    标签: jsf jsf-2 myfaces


    【解决方案1】:

    我遇到了同样的问题,但不是使用ExternalContext.redirect() 来解决它,而是根据你的行为来玩结果。

    也就是说,我的按钮调用的操作返回一个String(结果),它指示导航规则到下一页。使用该系统,消息将被保留。

    【讨论】:

    • 所以你现在是转发而不是重定向。为此,您根本不需要Flash#setKeepMessages()。还是您实际上根本没有使用它?
    • 你说得对,我已经停止使用它了:) 其实我在遇到WELD-1218这个bug的时候发现了。
    【解决方案2】:

    保存消息的代码在阶段结束后执行(参见 Flash.doPostPhaseActions(FacesContext) )。因此,预计它不起作用,但也许您可以在重定向之前调用 Flash.doPostPhaseActions。注意不是一个“干净”的解决方案,但它是可能的。

    【讨论】:

    • 有没有更好的方法(除了调用redirect())来重定向一个不会返回结果的函数?
    • 在尝试了多种方式之后,这是在 JBoss 中使用重定向而不是转发对我有用的唯一解决方案
    【解决方案3】:

    JSFMessages 仅用于处理实际请求。使用重定向时会发出第二个请求,因此 JSFMessages 将丢失。 EL-Flash 是一种解决此问题的方法。这个例子应该可以工作:http://ocpsoft.com/java/persist-and-pass-facesmessages-over-page-redirects/

    【讨论】:

    • 您是否错过了关于setKeepMessages(true) 的第一段和问题的代码sn-p 行getFlash().setKeepMessages(true);?他已经在使用 Flash,但与 ExternalContext#redirect() 结合使用时无法正常工作。
    猜你喜欢
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 2020-08-25
    • 1970-01-01
    相关资源
    最近更新 更多