当前位置 : 主页 > 网页制作 > HTTP/TCP >

jsf – 在新选项卡中重定向到外部URL,同时在辅助bean中执行操作

来源:互联网 收集:自由互联 发布时间:2021-06-16
我正在使用jsf应用程序,该应用程序在某个时间需要在新选项卡中打开外部页面,使第一页保持活动状态.我需要找到一种方法来使应用程序执行,只需单击一下按钮: 在新选项卡中重定向
我正在使用jsf应用程序,该应用程序在某个时间需要在新选项卡中打开外部页面,使第一页保持活动状态.我需要找到一种方法来使应用程序执行,只需单击一下按钮:

>在新选项卡中重定向到外部URL
>在原始页面中禁用按钮本身的操作

我尝试过使用< outputLink />但它没有动作属性.
我尝试使用< commandLink />但它无法重定向到外部.
我也尝试了一个< commandLink />使用target =“_ blank”并在辅助bean中编码重定向:

<h:commandLink onclick="submit();" target="_blank" action="#{myBean.execute}" disabled="#{myBean.linkDisabled}" value="external link" />

并且,在支持bean中:

public String execute() {
    linkDisabled = true;

    try{
        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        externalContext.redirect(Constants.EXTERNAL_URL);
    } catch(Exception e){
        throw new FacesException("Redirection failed");
    }

    return THIS_PAGE;
}

页面在新选项卡中打开,但它是当前页面而不是具有URL Constants.EXTERNAL_URL的页面,并且该按钮仍处于启用状态.没有显示错误消息.有什么建议吗?

提前谢谢,安德烈

你的问题很混乱.你正在混合“链接”和“按钮”.您基本上需要通过JavaScript禁用客户端中的元素,因为响应不会返回到当前浏览器窗口/选项卡,而是返回到其他浏览器窗口/选项卡.在JavaScript中,很容易禁用按钮,但不能禁用链接.为简单起见,我假设您的意思是并且可以使用< h:commandButton>并且这是当前表单中的唯一按钮.

要解决您的问题,您需要删除onclick =“submit()”(因为它会扰乱默认行为)并且您需要删除导航结果(这应该没关系,但您在某些JSF impls中永远不会知道)并且您需要在客户端通过JS禁用按钮.

所有代码都应该如下所示:

<h:form target="_blank">
    <h:commandButton
        value="external" 
        action="#{myBean.execute}" 
        onclick="setTimeout('document.getElementById(\'' + this.id + '\').disabled=true;', 50);" />
</h:form>

public void execute() throws IOException {
    FacesContext.getCurrentInstance().getExternalContext().redirect(Constants.EXTERNAL_URL);
}

setTimeout()是必需的,因为在发送表单数据之前禁用该按钮会导致按钮自己的name = value对不会作为请求参数发送,因此JSF不会调用任何操作.

网友评论