重定向到一个外部URL在一个新的标签,并在同一时间进行的支持bean行动(Redirecting t

2019-07-29 00:29发布

我在JSF应用程序,在一定的时间需要在新标签打开外部页的工作,离开第一页活跃。 我需要找到一种方法,使应用程序执行,在一个单一的按一下按钮:

  1. 一个重定向到一个外部URL在新标签
  2. 它禁用在原始页面的按钮本身的行动

我已经使用试过<outputLink />但它没有action属性。 我已经使用试过<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和按钮仍处于启用状态。 示出没有错误消息。 任何建议?

在此先感谢,安德烈

Answer 1:

你的问题是混乱的。 你混“链接”和“按钮”。 你基本上需要通过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()是必要的,因为按钮的形式的数据被发送,这将导致该按钮自身的名称=值对将不会作为请求参数被发送,并且因此JSF不会调用任何行动之前,否则禁用。



Answer 2:

你为什么不使用行动=“someaction”和faces-config.xml中映射它去到另一个网页?



文章来源: Redirecting to an external URL in a new tab and performing an action in backing bean at the same time