【问题标题】:Send flash message to redirected page向重定向页面发送 Flash 消息
【发布时间】:2024-01-23 05:30:01
【问题描述】:

我有一个页面,我在保存数据时添加新项目我转到另一个页面,我想在其中看到“数据已成功保存”的消息。我读到该消息属于请求范围,这就是我使用 flash 范围的原因。

context.addMessage("calendarGameForm:growl", new FacesMessage("Data was saved successful");
context.getExternalContext().getFlash().setKeepMessages(true);
return outcome;

这是由第一页上的保存按钮 addSeason.xhtml 调用的。

<p:commandButton id="save" action="#{controller.add}"
                 value="#{msg.save}" ajax="true"
                 type="submit" update="@form"/>

导航规则定义如下。

<navigation-rule>
    <from-view-id>/competitions/addSeason.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>success</from-outcome>
        <to-view-id>/competitions/calendarGame.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
    <navigation-case>
        <from-outcome>fail</from-outcome>
        <to-view-id>/competitions/calendarGame.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
</navigation-rule>

但在目标页面 calendarGame.xhtml 我没有收到我的消息。

<p:growl id="growl" globalOnly="true" sticky="true"/>

我也在服务器日志中收到此警告。

警告 [javax.enterprise.resource.webcontainer.jsf.flash] (ajp--127.0.0.1-8009-1) JSF1095:在我们尝试为 flash 设置传出 cookie 时,响应已经提交。存储到闪存中的任何值在下一次请求时都将不可用。

我该如何解决我的问题?

【问题讨论】:

    标签: java redirect jsf-2 message flash-scope


    【解决方案1】:

    这个问题有两个方面。

    至于第一个问题,我猜您是在操作方法中而不是在预渲染视图中添加 faces 消息,对吗?你有一个return outcome,所以它在一个真正的动作方法中是有道理的。在这种情况下,JSF1095 消息是由 Mojarra 中的 Ajax 编码相关错误引起的,并在 2.1.11 中修复。 Mojarra 有很多与 Flash 范围相关的问题,其中最后一个在 2.1.14 中修复。我建议将 Mojarra 更新到至少该版本。 currently 已经在 2.1.17。

    关于第二个问题,&lt;p:growl globalOnly="true"&gt; 只显示带有null 客户端 ID 的消息。修复您的 addMessage() 调用以改为通过 null

    context.addMessage(null, message);
    

    如果您实际上在导航之前的预渲染事件期间添加了 faces 消息,那么问题的原因可能不同,需要不同的解决方案。请参阅以下答案:Mojarra 2.1.14 flash scope messages and redirect to different path

    【讨论】:

      【解决方案2】:

      消息必须在接收页面/视图中设置。为此,我会尝试使用preRenderViewEvent 调用的函数。您应该在此处添加代码(您也可以使用其他形式的消息通知)

      preRenderViewEvent 用法示例。

      【讨论】: