2

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

我发现了这种可能性:

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

“h:commandLink”标签很烂,生成JavaScript的真的很吓人!不推荐使用这个标签,除非你有充分的理由支持。但它支持“action”属性,而这正是“h:link”所缺乏的。

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

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

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

4

1 回答 1

8

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

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

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 + "')");
    }
}

// ...

与具体问题无关:您在此处引用的粗俗陈述似乎是由对 HTTP/HTML 基础知识一无所知的人编写的(GET 与 POST 的限制等)。请把它们和一粒好盐一起吃。

于 2012-10-02T11:39:18.807 回答