JSF2.0使用外部上下文和faces redirect=true打开新的浏览器窗口

JSF2.0使用外部上下文和faces redirect=true打开新的浏览器窗口,jsf,jsf-2,Jsf,Jsf 2,我正在开发一个JSF2.0应用程序。单击,我在后端bean操作中执行一些逻辑,需要重定向到新窗口中的另一个URL,并在退出操作之前在原始bean操作中执行一些清理工作。我目前正在使用externalContext.redirect()方法以及“faces redirect=true”(因为我有一些清理代码要在重定向发生后执行)。但是外部URL正在同一窗口中打开 我会要求它在一个单独的新浏览器窗口中打开,同时执行重定向后的清理代码。您能告诉我怎么做吗?您不能从服务器端打开新的浏览器窗口/选项卡。这

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


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

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

因此,用JSF术语来说,这将是:

<h:form target="_blank">


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

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

因此,用JSF术语来说,这将是:

<h:form target="_blank">


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

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

因此,用JSF术语来说,这将是:

<h:form target="_blank">


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

我尝试了您的方法,但即使出现一些验证错误,也会打开一个新窗口。验证错误将显示在新窗口中。如果存在任何验证错误,我不希望打开新窗口。有什么方法可以做到这一点吗?事实上,在我的回答中,这已经或多或少地包含了“其中一种方法”。如果您想考虑JSF验证,那么必须彻底改变打开新窗口的方式。基本上,在给定的URL上需要JavaScript的
window.open()
。您需要让JSF有条件地呈现/执行这段JS代码。请参阅以代码示例详细回答的相关问题:因此,如果我们遵循本文中的方法2,我们将不需要执行externalcontext.redirect(),对吗?对。您根本不需要导航。只需回发到相同的视图(返回
null
void
),并让有条件生成的JS
window.open()
函数调用完成它的工作。请注意,如果需要,您可以使用类似so
window.open(“{bean.reportURL}”)的bean属性参数化
reportURL
。谢谢。这很有效。不过,我这里还有一个问题。在单击submit按钮之前,web页面使用AJAX并基于某些用户操作呈现了一些字段。当新窗口打开时,这些字段将消失。有没有办法在window.open执行后仍在页面中保留这些字段?我尝试了您的方法,但即使出现一些验证错误,也会打开一个新窗口。验证错误将显示在新窗口中。如果存在任何验证错误,我不希望打开新窗口。有什么方法可以做到这一点吗?事实上,在我的回答中,这已经或多或少地包含了“其中一种方法”。如果您想考虑JSF验证,那么必须彻底改变打开新窗口的方式。基本上,在给定的URL上需要JavaScript的
window.open()
。您需要让JSF有条件地呈现/执行这段JS代码。请参阅以代码示例详细回答的相关问题:因此,如果我们遵循本文中的方法2,我们将不需要执行externalcontext.redirect(),对吗?对。您根本不需要导航。只需回发到相同的视图(返回
null
void
),并让有条件生成的JS
window.open()
函数调用完成它的工作。请注意,如果需要,您可以使用类似so
window.open(“{bean.reportURL}”)的bean属性参数化
reportURL
。谢谢。这很有效。不过,我这里还有一个问题。在单击submit按钮之前,web页面使用AJAX并基于某些用户操作呈现了一些字段。当新窗口打开时,这些字段将消失。有没有办法在window.open执行后仍在页面中保留这些字段?我尝试了您的方法,但即使出现一些验证错误,也会打开一个新窗口。验证错误将显示在新窗口中。如果存在任何验证错误,我不希望打开新窗口。有什么方法可以做到这一点吗?事实上,在我的回答中,这已经或多或少地包含了“其中一种方法”。如果您想考虑JSF验证,那么必须彻底改变打开新窗口的方式。基本上,在给定的URL上需要JavaScript的
window.open()
。您需要让JSF有条件地呈现/执行这段JS代码。请参阅以代码示例详细回答的相关问题:因此,如果我们遵循本文中的方法2,我们将不需要执行externalcontext.redirect(),对吗?对。您根本不需要导航。只需回发到同一个视图(返回
null
void
),然后让有条件生成的JS
window.open()函数调用即可