我有第1页的按钮导航到第2页,第2页添加了一些消息并导航回第1页。我想在第1页上显示这些消息。我尝试了很多解决方案,但没有任何效果。
示例代码page1.xhtml:
<p:commandButton value="edit" action="#{bean1.edit}"/>
在托管bean中:
public String edit() {
return "page2?faces-redirect=true";
}
page2托管bean
@PostConstruct
private void postConstruct() {
Faces.getFlash().setKeepMessages(true);
Messages.addFlashGlobalError("cannot edit!");
Faces.navigate("page1?faces-redirect=true");
}
这两个bean都是视图范围的,两个页面的正文末尾都有<p:messages>
。
答案 0 :(得分:2)
如果调用@PostConstruct
太晚,就会发生这种情况。显然,豆被引用并因此在视图中相对“晚”第一次构造(例如在最底部)。此时,响应可能已经提交,这是一个不归路。您无法再导航到其他视图。
您基本上想要在渲染响应之前调用init()
方法。使用OmniFaces,您可以在page2.xhtml
中使用以下方法:
<f:metadata>
<f:viewParam name="dummy" />
<f:event type="postInvokeAction" listener="#{bean.init}" />
</f:metadata>
(如果您已在该页面上拥有自己的视图参数,则可以删除<f:viewParam name="dummy" />
;这只是为了确保执行INVOKE_ACTION
阶段,另请参阅postInvokeAction
demo page)
只是一个简单的<f:event listener>
方法:
public void init() {
Messages.addFlashGlobalError("cannot edit!");
Faces.navigate("page1?faces-redirect=true"); // Or Faces.redirect("page1.xhtml");
}
Faces.getFlash().setKeepMessages(true);
是不必要的,因为Messages#addFlashGlobalError()
已经这样做了。请记住,在Mojarra中,如果导航到URL中的其他文件夹,则Flash范围将不起作用。这两个页面必须位于URL中的同一文件夹中。这在即将到来的Mojarra 2.1.14中得到修复。
答案 1 :(得分:1)
首先,我不完全确定@PostConstruct
是执行重定向的最佳位置。见this。话虽这么说,谷歌出现this,看起来很合理。尝试使用靠近页面顶部的preRender
事件标记在facelets页面内重定向。干杯
答案 2 :(得分:-1)
只需使用nevigation。它肯定会奏效。检查以下代码。 public String redirect()抛出异常 { FacesContext.getCurrentInstance()。addMessage(“Msg1”,new FacesMessage(“Message 1 is”)); //FacesContext.getCurrentInstance().getExternalContext().redirect("/Sam/page2.jsf“); 返回“page2”; }