3

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

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

我试过使用 an<outputLink />但它没有 action 属性。我试过使用 a<commandLink />但它无法重定向到外面。我还尝试了在支持 bean 中编码的<commandLink />with和重定向:target="_blank"

<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并且该按钮仍处于启用状态。不显示错误消息。有什么建议吗?

在此先感谢,安德里亚

4

2 回答 2

12

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

要解决您的问题,您需要删除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 不会调用任何操作。

于 2012-04-17T12:06:47.080 回答
0

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

于 2012-04-17T10:00:47.207 回答