还有一种方法,可以使用 JavaScript 的 submit
方法与 target
属性结合,来实现不通过 AJAX 在新窗口打开 URL。
JSF 页面
<h:form id="mainForm" target="_blank">
<h:commandButton id="forwardButton" value="Forward" action="#{bean.forwardToPage}"
onclick="submitFormInNewWindow(); return false;"/>
<h:outputText id="newUrlOutput" value="#{bean.newUrl}" style="display:none;" />
<h:outputScript>
function submitFormInNewWindow() {
var form = document.getElementById('mainForm');
form.target = '_blank';
form.submit();
form.target = ''; // Reset target to default after submission
}
</h:outputScript>
</h:form>
后端 Bean
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean
@ViewScoped
public class Bean {
private String newUrl;
public void forwardToPage() {
// 调用外部 API 获取 URL
newUrl = callExternalApiAndGetUrl();
}
public String getNewUrl() {
return newUrl;
}
public void setNewUrl(String newUrl) {
this.newUrl = newUrl;
}
private String callExternalApiAndGetUrl() {
// 模拟调用外部 API 并返回 URL
return "https://example.com";
}
}
解释
-
JSF 页面:
-
<h:form>
的target
属性设置为_blank
,表示表单提交时将在新窗口打开。 -
<h:commandButton>
的onclick
事件触发submitFormInNewWindow
函数。 -
submitFormInNewWindow
函数中,通过设置表单的target
属性为_blank
并调用form.submit()
方法,在新窗口中提交表单。提交完成后,重置target
属性为空字符串以恢复默认行为。
-
-
后端 Bean:
-
forwardToPage
方法调用外部 API 并设置newUrl
属性。
-
这种方法利用了 HTML 表单的 target
属性,可以在新窗口中打开页面,而不需要使用 AJAX。