如何在用户点击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参数。
两个注意事项:
newTab()
和preRenderView()
方法。感谢您的帮助
答案 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");
}