Jsf 在新选项卡中重定向到外部URL,同时在backingbean中执行操作

Jsf 在新选项卡中重定向到外部URL,同时在backingbean中执行操作,jsf,redirect,external,Jsf,Redirect,External,我在一个jsf应用程序中工作,在某个特定时间需要在新选项卡中打开一个外部页面,使第一个页面保持活动状态。我需要找到一种方法使应用程序运行,只需单击一个按钮: 重定向到新选项卡中的外部URL 在原始页面中禁用按钮本身的操作 我尝试过使用,但它没有action属性。 我尝试过使用,但它无法重定向到外部。 我还尝试了使用target=“\u blank”的,以及在支持bean中编码的重定向: <h:commandLink onclick="submit();" target="_blank" a

我在一个jsf应用程序中工作,在某个特定时间需要在新选项卡中打开一个外部页面,使第一个页面保持活动状态。我需要找到一种方法使应用程序运行,只需单击一个按钮:

  • 重定向到新选项卡中的外部URL
  • 在原始页面中禁用按钮本身的操作
  • 我尝试过使用
    ,但它没有action属性。 我尝试过使用
    ,但它无法重定向到外部。 我还尝试了使用
    target=“\u blank”
    ,以及在支持bean中编码的重定向:

    <h:commandLink onclick="submit();" target="_blank" action="#{myBean.execute}" disabled="#{myBean.linkDisabled}" value="external link" />
    
    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
    常量的页面。外部URL
    且按钮仍处于启用状态。未显示任何错误消息。有什么建议吗


    提前感谢Andrea,为什么不使用action=“someaction”并将其映射到faces-config.xml以转到另一个页面?

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

    要解决您的问题,您需要删除
    onclick=“submit()”
    (因为这会干扰默认行为),并且需要删除导航结果(这不重要,但在某些JSF impl中您永远不知道),并且需要在客户端禁用JS的按钮

    所有代码应如下所示:

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

    setTimeout()
    是必需的,因为在发送表单数据之前按钮被禁用,这将导致按钮自身的名称=值对不会作为请求参数发送,因此JSF不会调用任何操作。

    它不会工作,因为重定向到外部页面:操作和相关导航规则用于内部页面仅限。是否有任何方法使用导航规则重定向到外部页面?感谢您的详细答复,抱歉在问题中不当使用“按钮”一词。有一个问题,
    没有属性
    target
    ,因此页面编译器出错。我使用的是JSF1.1Oh,但忽略了这一点。如果按钮是表单中唯一的按钮,那么您可以将该属性放在
    中。
    public void execute() throws IOException {
        FacesContext.getCurrentInstance().getExternalContext().redirect(Constants.EXTERNAL_URL);
    }