我有一个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();
}
}
不幸的是,这似乎不起作用。重定向恰好发生,但&lt;消息/&gt;标签未显示消息。 redirect()发生的方式有什么不同可以阻止它工作吗?
答案 0 :(得分:4)
保存消息的代码在阶段结束后执行(请参阅Flash.doPostPhaseActions(FacesContext))。因此,预计它不起作用,但也许您可以在重定向之前调用Flash.doPostPhaseActions。注意不是一个“干净”的解决方案,但它是可能的。
答案 1 :(得分:0)
JSFMessages仅用于处理实际请求。使用重定向时会发出第二个请求,因此JSFMessages将丢失。 EL-Flash是解决这个问题的一种方法。此示例应该有效:http://ocpsoft.com/java/persist-and-pass-facesmessages-over-page-redirects/
答案 2 :(得分:0)
我遇到了同样的问题并且没有使用ExternalContext.redirect()
来解决它,而是为了你的行动而发挥作用。
也就是说,我的按钮调用的动作返回String
(结果),表示导航规则转到下一页。使用该系统,消息将被保留。