CommandButton使用FlashScope参数打开新选项卡

时间:2012-12-12 09:09:11

标签: jsf jsf-2

如何在用户点击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()方法。
  3. 感谢您的帮助

1 个答案:

答案 0 :(得分:6)

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

<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。此外,这种方式也可以真正使用闪存范围,因为它是专门设计的(如果你没有重定向,只需在请求范围内存储就足够了)。


更新:根据评论,初始标签/窗口中的视图范围bean会以这种方式被杀死。通过返回String导航案例结果。这是正确的,如果您想保持视图范围内的bean活着,请通过Faces#redirect()调用替换导航案例(假设您确实OmniFaces用于Faces#setFlashAttribute() )。您只需要事先将Flash#setRedirect()设置为true,以指示Flash范围将发生重定向。

public void newTab() throws IOException {
    Faces.setFlashAttribute("foo", bar); 
    Faces.getFlash().setRedirect(true);
    Faces.redirect("otherView.xhtml");
}