发送flash消息到重定向页面



我有一个页面,我添加新项目,当我保存数据,我去到其他页面,我想看到消息,"数据保存成功"。我读到该消息属于请求作用域,这就是为什么我使用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警告。(ajp—127.0.0.1-8009-1)JSF1095:当我们尝试为flash设置传出cookie时,响应已经提交。存储到flash中的任何值在下一次请求时都不可用。

我该如何解决我的问题?

这个问题是双重的。

关于第一个问题,我认为你是在一个动作方法中添加faces消息,而不是在prerender视图中,对吧?你有一个return outcome,所以它在一个真正的动作方法中是有意义的。在这种情况下,JSF1095消息是由Mojarra中与ajax编码相关的错误引起的,并在2.1.11中修复。Mojarra有很多Flash范围相关的问题,其中最后一个在2.1.14中被修复。我建议将Mojarra更新到至少那个版本。目前已经是2.1.17。

对于第二个问题,<p:growl globalOnly="true">只显示具有null客户端ID的消息。修正你的addMessage()调用来传递null

context.addMessage(null, message);
如果实际上是在导航之前的preender事件期间添加faces消息,那么问题将有不同的原因,并且需要不同的解决方案。Mojarra 2.1.14 flash作用域消息并重定向到不同的路径

消息必须在接收页面/视图中设置。要做到这一点,我会尝试使用preRenderViewEvent调用的函数。这里是你应该添加代码的地方(你也可以使用其他形式的消息通知)

preRenderViewEvent用法示例

相关内容

  • 没有找到相关文章

最新更新