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

Ami*_*ira 1 jsf new-window primefaces managed-bean

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

我发现了这种可能性:

"h:link"标签对于生成需要与JSF"结果" 进行交互的链接很有用,但缺乏"动作"支持使得难以生成动态结果.

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

"h:outputLink"对于生成不需要与JSF程序本身交互的链接很有用.最后,如果将"action"属性添加到"h:link"中,它将是完美的.

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

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

Bal*_*usC 6

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

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

<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>
Run Code Online (Sandbox Code Playgroud)

private String url;
private boolean valid;

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

// ...
Run Code Online (Sandbox Code Playgroud)

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

<h:form>
    <p:inputText value="#{bean.url}" />
    <p:commandButton value="submit" action="#{bean.submit}" />
</h:form>
Run Code Online (Sandbox Code Playgroud)

private String url;

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

// ...
Run Code Online (Sandbox Code Playgroud)

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