【问题标题】:JSF 2.0 Opening a new browser window using external context along with faces-redirect=trueJSF 2.0 使用外部上下文和 faces-redirect=true 打开一个新的浏览器窗口
【发布时间】:2013-09-05 19:32:15
【问题描述】:

我正在开发一个 JSF 2.0 应用程序。单击 时,我在后端 bean 操作中执行了一些逻辑,需要在新窗口中重定向到另一个 URL,并在退出操作之前在我的原始 bean 操作中执行一些清理工作。我目前正在使用 externalContext.redirect() 方法和“faces-redirect=true”(因为在重定向发生后我有一些清理代码要执行)。但是外部 URL 正在同一个窗口中打开。

我会要求它在单独的新浏览器窗口中打开,同时执行重定向后的清理代码。你能告诉我这是怎么做到的吗?

【问题讨论】:

    标签: jsf jsf-2


    【解决方案1】:

    您无法从服务器端打开新的浏览器窗口/选项卡。这只能从客户端完成。其中一种方法是将target="_blank" 属性添加到提交按钮所在的HTML 表单中。

    所以,用 JSF 术语来说,就是:

    <h:form target="_blank">
    

    这与支持 bean 代码所做的任何事情都无关。它只是在服务器处理 HTTP 请求时同步运行。

    【讨论】:

    • 我试过你的方法,但即使有一些验证错误,也会打开一个新窗口。验证错误显示在新窗口中。如果有任何验证错误,我不希望打开新窗口。有什么办法吗?
    • 确实,在我的回答中,这已经或多或少地被“一种方式”所涵盖。如果要考虑 JSF 验证,则必须彻底改变打开新窗口的方式。基本上,您需要 JavaScript 的 window.open() 而不是给定的 URL。您需要让 JSF 有条件地渲染/执行这段 JS 代码。有关代码示例的详细答案,请参阅此相关问题:stackoverflow.com/questions/14584187/…
    • 所以如果我们按照帖子中的方法 2,我们不需要执行 externalcontext.redirect() 对吗?
    • 没错。您根本不需要导航。只需回发到同一个视图(返回nullvoid)并让有条件生成的JS window.open() 函数调用完成它的工作。请注意,如有必要,您可以使用 window.open('#{bean.reportURL}') 之类的 bean 属性参数化 reportURL
    • 谢谢。这非常有效。但是我这里还有另一个问题。在单击提交按钮之前,该网页使用 AJAX 并基于某些用户操作呈现了一些字段。当新窗口打开时,这些字段会消失。即使在 window.open 执行之后,有什么方法可以在页面中保留这些字段?
    猜你喜欢
    • 2011-02-28
    • 2014-06-26
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 2020-05-11
    • 1970-01-01
    相关资源
    最近更新 更多