我曾与第1页的按钮,导航到第2页第2页添加一些信息和导航回第1页。 我想显示第一页上的消息。 我尝试过多种解决方案,但没有工作。
示例代码page1.xhtml:
<p:commandButton value="edit" action="#{bean1.edit}"/>
在Managed Bean:
public String edit() {
return "page2?faces-redirect=true";
}
第2页托管bean
@PostConstruct
private void postConstruct() {
Faces.getFlash().setKeepMessages(true);
Messages.addFlashGlobalError("cannot edit!");
Faces.navigate("page1?faces-redirect=true");
}
两个豆视图作用域和两个页均具有<p:messages>
在主体的端部。
首先,我不完全肯定的@PostConstruct
是执行重定向的最佳场所。 请参见本 。 话虽这么说,谷歌打开了这个 ,它看起来是合理的。 尝试Facelets页面本身重定向与preRender
事件标签接近页面的顶部。 干杯
如果可能发生@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
演示页 )
并且只是一个简单<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()
已经做到这一点。 请记住,在钻嘴鱼科,如果导航是在URL不同的文件夹中的Flash范围将无法正常工作。 在两个页面都必须在URL相同的文件夹。 这是固定在即将举行的钻嘴鱼科2.1.14。
只需使用nevigation。 它肯定会工作。 检查下面的代码。 公共字符串重定向()抛出异常{FacesContext.getCurrentInstance()方法addMessage( “MSG1”,新的FacesMessage( “消息1是”))。 //FacesContext.getCurrentInstance().getExternalContext().redirect("/Sam/page2.jsf"); //FacesContext.getCurrentInstance().getExternalContext().redirect("/Sam/page2.jsf“); return "page2"; 返回“第2页”; } }