Ray*_*Ray 6 java redirect message jsf-2 flash-scope
我有一个页面,我在保存数据时添加新项目我转到其他页面,我想看到"数据已成功保存"的消息.我读到该消息属于请求范围,这就是我使用闪存范围的原因.
context.addMessage("calendarGameForm:growl", new FacesMessage("Data was saved successful");
context.getExternalContext().getFlash().setKeepMessages(true);
return outcome;
Run Code Online (Sandbox Code Playgroud)
这是由第一页上的保存按钮调用的addSeason.xhtml
.
<p:commandButton id="save" action="#{controller.add}"
value="#{msg.save}" ajax="true"
type="submit" update="@form"/>
Run Code Online (Sandbox Code Playgroud)
导航规则定义如下.
<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>
Run Code Online (Sandbox Code Playgroud)
但是在目标页面中,calendarGame.xhtml
我没有收到我的消息.
<p:growl id="growl" globalOnly="true" sticky="true"/>
Run Code Online (Sandbox Code Playgroud)
我也在服务器日志中收到此警告.
警告[javax.enterprise.resource.webcontainer.jsf.flash](ajp - 127.0.0.1-8009-1)JSF1095:当我们尝试为闪存设置传出cookie时,响应已经提交.存储在闪存中的任何值在下一个请求中都不可用.
我怎么能解决我的问题?
这个问题是双重的.
至于第一个问题,我收集到你在动作方法中添加了faces消息而不是在预渲染视图中,对吧?你有一个return outcome
,所以它有意义,它是一个真正的行动方法.在这种情况下,JSF1095消息是由Mojarra中与Ajax编码相关的错误引起的,并在2.1.11中修复.Mojarra有很多Flash范围相关的问题,其中最后一个问题在2.1.14中得到修复.我建议将Mojarra更新到至少那个版本.它目前已经是2.1.17.
至于第二个问题,a <p:growl globalOnly="true">
仅显示具有null
客户端ID的消息.修复你的addMessage()
通话null
代替.
context.addMessage(null, message);
Run Code Online (Sandbox Code Playgroud)
如果您实际在导航前的prerender事件期间添加了faces消息,则问题会有不同的原因,并且需要不同的解决方案.请参阅此答案:Mojarra 2.1.14闪存范围消息并重定向到不同的路径.