2

我的 page1 带有导航到 page2 的按钮,第 2 页添加了一些消息并导航回 page1。我想在 page1 上显示这些消息。我尝试了很多解决方案,但没有任何效果。

示例代码 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>位于正文的末尾。

4

3 回答 3

2

如果@PostConstruct调用太晚,就会发生这种情况。显然,bean 被引用,因此第一次在视图中相对“较晚”构建(例如,在最底部)。此时,响应可能已经提交,这是一个不归路。您无法再导航到其他视图。

您基本上想在呈现响应之前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演示页面

只是一个简单的<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 中修复。

于 2012-10-04T14:43:52.930 回答
1

首先,我不完全确定这@PostConstruct是执行重定向的最佳位置。看到这个。话虽这么说,谷歌出现了这个,它看起来很合理。preRender尝试使用靠近页面顶部的事件标记在 facelets 页面本身内重定向。干杯

于 2012-10-04T04:04:00.110 回答
-1

只需使用导航。它肯定会奏效。检查以下代码。公共字符串重定向()抛出异常 { FacesContext.getCurrentInstance().addMessage("Msg1",new FacesMessage("Message 1 is"​​)); //FacesContext.getCurrentInstance().getExternalContext().redirect("/Sam/page2.jsf"); 返回“第2页”;}

于 2012-10-04T07:58:10.740 回答