什么时候应该使用h:outputLink而不是h:commandLink?


129

什么时候应该使用<h:outputLink>而不是<h:commandLink>

我了解会commandLink产生HTTP讯息;我猜这outputLink将生成HTTP获取。就是说,我阅读的大多数JSF教程资料都是commandLink(几乎?)专门使用的。

上下文:我正在实施一个小小的演示项目,该项目显示了指向用户页面的标题链接,就像Stack Overflow的...

需要更多的jQuery

...而且我不确定commandLink(也许?faces-redirect=true用于书签功能)还是outputLink正确的选择。

Answers:


195

所述<h:outputLink>呈现一个fullworthy HTML <a>与所述正确的URL元件href,其触发一个可收藏GET请求属性。它不能直接调用托管bean操作方法。

<h:outputLink value="destination.xhtml">link text</h:outputLink>

所述<h:commandLink>渲染HTML <a>与元素onclick,其提交(隐藏)POST形式,并且可以调用一个托管bean动作方法脚本。还需要将其放置在中<h:form>

<h:form>
    <h:commandLink value="link text" action="destination" />
</h:form>

上的?faces-redirect=true参数<h:commandLink>,它会在POST之后触发重定向(按照Post-Redirect-Get模式),仅在实际单击链接时才会提高目标页面的书签性(该URL将不再“落后”) ,但不会href<a>元素的更改为具有完整价值的网址。它仍然存在#

<h:form>
    <h:commandLink value="link text" action="destination?faces-redirect=true" />
</h:form>

从JSF 2.0开始,还有<h:link>一个可以使用视图ID(导航案例结果)而不是URL。还将生成一个HTML <a>元素,并带有中的正确URL href

<h:link value="link text" outcome="destination" />

因此,如果是用于纯净且可添加书签的页面到页面导航(例如SO用户名链接),请使用<h:outputLink><h:link>。这对于SEO也更好,因为机器人通常不加密POST形式或JS代码。另外,由于页面现在可以添加书签并且URL不再“落后”,因此UX将会得到改善。

必要时,可以在构造函数或做预处理工作@PostConstruct一的@RequestScoped@ViewScoped @ManagedBean它连接到有问题的目标页面。您可以使用@ManagedProperty<f:viewParam>将GET参数设置为bean属性。

也可以看看:


2
不,不是必须的。只有UICommand组件需要进入UIForm组件。
BalusC,2010年

3
没有,实际上。通常,如果可以,请坚持h:outputLinkh:link链接。SEO不应该被低估。顺便说一下,对于像SO上这样的类似REST的URL,请看一下PrettyFaces
BalusC 2010年

1
不,区别在于h:link将JSF视图ID(例如page)作为值,h:outputLink并使用真实URL(例如/page.xhtml/page.jsf,或其他取决于您的FacesServlet映射)作为值。在两种情况下,URL编码都会发生。还有的方式呈现在模板文本EL的行为之间没有差异#{...}h:outputText。两者都转义了预定义的XML实体(不,这与URL编码不同)。在h:outputText只提供更喜欢attribtues idstyleClass等,以控制组件和/或标记。
BalusC 2010年

1
@BalusC在答案的第一行中,“完全有价值的HTML”到底是什么意思?
极客

1
@Geek:刚了点一个HTML <a>元素,仅此而已,没有任何装饰性,无JS代码等
BalusC

4

我还看到,使用h:commandLink的页面加载(性能)要比h:link花费更长的时间。h:link比h:commandLink更快


1
我觉得很难相信。除了传闻证据/您自己的轶事证据之外,您还有什么要支持的?
马特·鲍尔

5
@Matt:我可以想象,当页面中的“上帝”表单中包含此POST导航链接时,它的速度会变慢,例如,数据表的行数大于1000,每行包含3个输入字段。但是无论如何,这样的页面还有其他严重的问题:)
BalusC
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.