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

Jsf 如果托管bean中的条件为true,则打开新窗口,jsf,primefaces,managed-bean,new-window,Jsf,Primefaces,Managed Bean,New Window,我想实现一种情况,用户输入一个URL,如果在我的托管bean中指定的条件为true,那么这个URL将在一个新网页中打开 我发现了这种可能性: “h:link”标记对于生成需要与JSF“结果”交互的链接非常有用,但是缺少“action”支持使得很难生成动态结果 “h:commandLink”标签很烂,生成的JavaScript真是吓人!除非您有充分的理由支持,否则不建议使用此标记。但它支持“action”属性,这正是“h:link”所缺少的 “h:outputLink”用于生成不需要与JSF程序本

我想实现一种情况,用户输入一个URL,如果在我的托管bean中指定的条件为true,那么这个URL将在一个新网页中打开

我发现了这种可能性:

“h:link”标记对于生成需要与
JSF
“结果”交互的链接非常有用,但是缺少“action”支持使得很难生成动态结果

“h:commandLink”标签很烂,生成的
JavaScript
真是吓人!除非您有充分的理由支持,否则不建议使用此标记。但它支持“action”属性,这正是“h:link”所缺少的

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

但在条件得到验证后,我没有找到从托管bean启动开放网页的方法


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

要在新窗口中使用这些链接组件之一打开目标,需要指定
target=“\u blank”
属性,但这将在您单击链接时在新窗口中打开目标,因此不依赖于响应。您基本上需要在响应到达时在新窗口中打开目标。唯一的方法是向响应返回JavaScript调用,以便在webbrowser中执行

在标准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>

在PrimeFaces中,您可以使用指定在响应完成时需要执行的JavaScript代码

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


与具体问题无关:你在那里引用的那些狂妄的语句似乎是由一个对HTTP/HTML基础知识一无所知的人写的(GET vs POST的局限性等等)。请带上一粒盐。

打开URL,但像那样''我只想要这个,那么URL显然无效。它必须以http://等开头。将其传递给
new URL()
构造函数并捕获异常。如果捕获,则URL无效。我不希望此内容出现在“localhost:8081/JavaServerFaces/faces”URL之前,因为它是一个外部URL。谢谢您难道不理解我之前的评论吗?URL必须以
http://
开头。否则,它显然与当前URL相关。您可以可以使用
新URL(URL)对其进行验证
,然后检查它是否没有引发异常。如有必要,您可以在最终用户未输入时手动将
http://
添加到URL的前缀。我相信OP表示他不希望URL中的“localhost…”部分…@AmiraGL:您可能应该为此提出另一个问题,详细说明如何获取此URL。
<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 + "')");
    }
}

// ...