我应该何时使用h:outputLink而不是h:commandLink?

时间:2010-11-30 19:30:59

标签: jsf jsf-2

我应该何时使用<h:outputLink>代替<h:commandLink>

我了解commandLink生成HTTP帖子;我猜测outputLink将生成HTTP获取。也就是说,我读过的大多数JSF tutorial material只使用commandLink(差不多?)。

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

needs more jquery

...我不确定commandLink(可能使用?faces-redirect=true表示可收藏性)或outputLink是否是正确的选择。

2 个答案:

答案 0 :(得分:188)

<h:outputLink>使用<a>属性中的正确网址呈现一个值得信赖的HTML href元素,该网址会触发可收藏的GET请求。它无法直接调用托管bean操作方法。

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

<h:commandLink>呈现带有<a>脚本的HTML 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>更改为完全匹配的URL。它仍然是#

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

从JSF 2.0开始,还有<h:link>可以获取视图ID(导航案例结果)而不是URL。它还会生成HTML <a>元素以及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>或{{1}}将GET参数设置为bean属性。

另见:

答案 1 :(得分:4)

我还看到使用h:commandLink而不是h:link,页面加载(性能)需要很长时间。 h:与h:commandLink相比链接更快