我的 page1 带有导航到 page2 的按钮,第 2 页添加了一些消息并导航回 page1。我想在第 1 页上显示这些消息。我尝试了很多解决方案,但没有任何效果。
示例代码页1.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 都是 View 范围的,并且两个页面都有 <p:messages>
在正文的末尾。
最佳答案
如果 @PostConstruct
就会发生这种情况调用得太晚了。显然,bean 被引用,因此在 View 中相对“较晚”地第一次构建(例如在最底部)。此时,响应可能已经提交,这是一个无法返回的点。您无法再导航到不同的 View 。
您基本上想要调用 init()
渲染响应之前的方法。使用 OmniFaces,您可以使用 page2.xhtml
中的以下方法:
<f:metadata>
<f:viewParam name="dummy" />
<f:event type="postInvokeAction" listener="#{bean.init}" />
</f:metadata>
(如果您在该页面上已有自己的 View 参数,则可以删除 <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 中得到修复。
关于redirect - JSF - 从 @PostConstruct 重定向后保留 Faces 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12708156/