redirect - JSF - 从 @PostConstruct 重定向后保留 Faces 消息

标签 redirect jsf-2 java-ee-6 omnifaces

我的 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/

相关文章:

php - 将文件作为附件发送到浏览器

java - 需要查询来检查数据库中是否已存在电子邮件(Java Persistence API)

glassfish - 禁用 EJB 计时器(GlassFish 3.1、Java EE 6)

jsf-2 - 移动站点前缀和jsf 2

html - t :selectOneRadio is not working in tomahawk version 2. 0

java - 避免在 glassfish 上删除计时器

php cURL函数301错误

redirect - 404 错误自定义页面适用于 .cfm 扩展名,但不适用于 .html?

c# - 如何根据输入在同一方法中返回 JsonResult 或 ActionResult?

spring - NoSuchMethodError : FaceletsAuthorizeTag. setIfAllGranted