【问题标题】:Redirecting to an external URL in a new tab and performing an action in backing bean at the same time在新选项卡中重定向到外部 URL 并同时在支持 bean 中执行操作
【发布时间】:2012-04-17 09:49:05
【问题描述】:

我正在处理一个 jsf 应用程序,该应用程序在某个时间需要在新选项卡中打开一个外部页面,使第一页保持活动状态。我需要找到一种方法来让应用程序执行,只需单击一下按钮:

  1. 在新标签页中重定向到外部 URL
  2. 在原始页面中禁用按钮本身的操作

我尝试过使用<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 的页面,并且该按钮仍处于启用状态。不显示错误消息。有什么建议吗?

提前致谢,安德里亚

【问题讨论】:

    标签: jsf redirect external


    【解决方案1】:

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

    要解决您的问题,您需要删除onclick="submit()"(因为它会干扰默认行为)并且您需要删除导航结果(这无关紧要,但在某些 JSF 实现中您永远不知道)并且您需要在客户端通过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 不会调用任何操作。

    【讨论】:

    • 感谢您的详细回复,很抱歉在问题中不恰当地使用了“按钮”一词。有问题,&lt;h:commandButton&gt; 没有target 属性,所以页面编译器出错。我正在使用 JSF 1.1
    • 哦,对了,忽略了那一点。如果该按钮是表单中的唯一按钮,那么您可以将该属性放在 &lt;h:form&gt; 中。
    【解决方案2】:

    为什么不使用 action="someaction" 并将其映射到 faces-config.xml 中以转到另一个页面?

    【讨论】:

    • 它不起作用,因为重定向到外部页面:操作和相关导航规则仅适用于内部页面。
    • 有没有办法使用导航规则重定向到外部页面?
    猜你喜欢
    • 2017-08-04
    • 1970-01-01
    • 2015-03-08
    • 2010-12-05
    • 2012-01-15
    • 2011-03-18
    • 2012-11-15
    • 2019-10-06
    • 2021-01-04
    相关资源
    最近更新 更多