gpt4 book ai didi

jsf - 命令按钮使用 FlashScope 参数打开新选项卡

转载 作者:行者123 更新时间:2023-12-04 16:50:38 25 4
gpt4 key购买 nike

用户单击时如何打开新标签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";
}

在其他查看页面上,我使用 f:event type="preRenderView"读取 Flash 参数。
两个注意事项:
  • 我需要使用 FlashScope,而不是 URL 参数。
  • 如果可能,我不想改变 newTab()preRenderView()方法。

  • 感谢帮助

    最佳答案

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

    更新 :根据评论,初始选项卡/窗口中的 View 范围 bean 以这种方式被杀死。通过返回 String导航案例结果。没错,如果您想让 View 作用域 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");
    }

    关于jsf - 命令按钮使用 FlashScope 参数打开新选项卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13836288/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com