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

2023-12-02

当用户点击时如何打开新选项卡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() and preRenderView()方法。

感谢帮助


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

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

无需对烘焙豆进行任何更改,它就会按照您的预期工作。我只建议在操作方法中使用 POST-Redirect-GET 模式。

return "otherView?faces-redirect=true";

否则,新选项卡将显示原始页面的 URL,并且 F5 将重新调用 POST。此外,通过这种方式,闪存作用域也真正按照其设计目的使用(如果您没有重定向,只需存储在请求作用域中就足够了)。


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

public void newTab() throws IOException {
    Faces.setFlashAttribute("foo", bar); 
    Faces.getFlash().setRedirect(true);
    Faces.redirect("otherView.xhtml");
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CommandButton 使用 FlashScope 参数打开新选项卡 的相关文章

随机推荐