如果托管bean中的条件为true,则打开一个新窗口

时间:2012-10-02 10:08:19

标签: jsf primefaces managed-bean new-window

我想实现用户输入URL的情况,如果我的托管bean中指定的条件为真,则此URL将在新的网页中打开。

我发现了这种可能性:

  

“h:link”标记用于生成需要与JSF“结果”进行交互的链接,但缺少“操作”支持会导致难以生成动态结果。

     

“h:commandLink”标签很糟糕,生成的JavaScript非常可怕!除非您有充分的理由支持,否则不建议使用此标记。但它支持“action”属性,这就是“h:link”所缺乏的。

     

“h:outputLink”可用于生成不需要与JSF程序本身交互的链接。   最后,如果将“action”属性添加到“h:link”中,那将是完美的。

但在验证条件后,我找不到从托管bean启动打开网页的方法。

我正在使用JSF2.0,Facelets和PrimeFaces 3.4。

1 个答案:

答案 0 :(得分:6)

要使用其中一个链接组件在新窗口中打开目标,您需要指定target="_blank"属性,但是当您单击链接时这将在新窗口中打开目标,因此不依赖于回应。您基本上需要在响应到达时在新窗口中打开目标。唯一的方法是返回对响应的JavaScript window.open()调用,以便在Web浏览器中执行。

在标准JSF中,您可以有条件地呈现JavaScript window.open()

<h:form>
    <h:inputText value="#{bean.url}" />
    <h:commandButton value="submit" action="#{bean.submit}">
        <f:ajax execute="@form" render="@form" />
    </h:commandButton>
    <h:outputScript rendered="#{bean.valid}">window.open('#{bean.url}')</h:outputScript>
</h:form>

private String url;
private boolean valid;

public void submit() {
    valid = validate(url);
}

// ...

在PrimeFaces中,您可以使用RequestContext#execute()来指定需要在完成响应时执行的JavaScript代码。

<h:form>
    <p:inputText value="#{bean.url}" />
    <p:commandButton value="submit" action="#{bean.submit}" />
</h:form>

private String url;

public void submit() {
    if (validate(url)) {
        RequestContext.getCurrentInstance().execute("window.open('" + url + "')");
    }
}

// ...

对具体问题

无关:你在那里引用的ranty语句似乎是由对HTTP / HTML基础知识一无所知的人写的(GET与POST的限制等等)。请带上一粒盐。