我想实现用户输入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。
答案 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的限制等等)。请带上一粒盐。