4

用户点击时如何打开新标签p:commandButton?我还想使用 FlashScope 将一些参数传递给新页面。这是代码:

<h:form>
  <p:commandButton value="open new tab" action="#{myBean.newTab}"/>
</h:form>

public String newTab() {
  Faces.setFlashAttribute("foo", bar);
  return "otherView";
}

在 otherView 页面上我f:event type="preRenderView"用来读取 Flash 参数。两个注意事项:

  1. 我需要使用 FlashScope,而不是 URL 参数。
  2. 如果可能的话,我不想改变newTab()preRenderView()方法。

感谢帮助

4

1 回答 1

6

在表单上使用target="_blank"来告诉浏览器表单的同步响应应该呈现在一个新的(空白)选项卡/窗口中。您只需要关闭 ajax 行为<p:commandButton>即可使其成为同步请求。

<h:form target="_blank">
  <p:commandButton value="open new tab" action="#{myBean.newTab}" ajax="false" />
</h:form>

支持 bean 不需要更改,它会按照您的意图工作。我只建议在操作方法中使用 POST-Redirect-GET 模式。

return "otherView?faces-redirect=true";

否则,新选项卡将显示原始页面的 URL,并且 F5 将重新调用 POST。此外,这种方式也真正使用了 flash 范围,因为它的设计目的是(如果您没有重定向,只需存储在请求范围中就足够了)。


更新:根据评论,初始选项卡/窗口中的视图范围 bean 以这种方式被杀死。通过返回String导航案例结果。没错,如果您想让视图范围的 bean 保持活动状态,请通过Faces#redirect()调用替换导航案例(假设它确实是您在那里使用的OmniFacesFaces#setFlashAttribute())。您只需要预先设置Flash#setRedirect()true以指示将发生重定向的闪存范围。

public void newTab() throws IOException {
    Faces.setFlashAttribute("foo", bar); 
    Faces.getFlash().setRedirect(true);
    Faces.redirect("otherView.xhtml");
}
于 2012-12-12T11:37:25.267 回答