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

Mat*_*all 128 jsf jsf-2

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

我知道a commandLink生成一个HTTP帖子; 我猜这outputLink将产生HTTP获取.也就是说,我读过的大多数JSF教程材料都是commandLink(几乎?)使用的.

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

需要更多的jquery

......我不确定commandLink(可能是?faces-redirect=true用于书签)还是outputLink正确的选择.

Bal*_*usC 193

使用属性中的适当URL <h:outputLink>呈现一个完整的HTML <a>元素,该URL href触发可收藏的GET请求.它无法直接调用托管bean操作方法.

<h:outputLink value="destination.xhtml">link text</h:outputLink>
Run Code Online (Sandbox Code Playgroud)

使用提交(隐藏)POST表单的脚本<h:commandLink>呈现HTML <a>元素,onclick并可以调用托管bean操作方法.它也需要放在一个<h:form>.

<h:form>
    <h:commandLink value="link text" action="destination" />
</h:form>
Run Code Online (Sandbox Code Playgroud)

在POST之后触发重定向的?faces-redirect=true参数<h:commandLink>(根据Post-Redirect-Get模式)仅在实际点击链接时改进了目标页面的可书写性(URL不再是"落后") ,但它不会href<a>元素更改为完整的URL.它仍然存在#.

<h:form>
    <h:commandLink value="link text" action="destination?faces-redirect=true" />
</h:form>
Run Code Online (Sandbox Code Playgroud)

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

<h:link value="link text" outcome="destination" />
Run Code Online (Sandbox Code Playgroud)

因此,如果它是纯粹的,可收藏的页面到页面导航,如SO用户名链接,那么使用<h:outputLink><h:link>.这对于SEO来说也更好,因为机器人通常不会加密POST表单和JS代码.此外,随着页面现在可以添加书签并且URL不再"落后",UX将得到改进.

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

也可以看看:

  • 没有,实际上.通常,当你可以时,坚持使用`h:outputLink`或`h:link`获取链接.SEO不应该被低估.顺便说一句,对于像SO这样漂亮的类似REST的URL,请看一下[PrettyFaces](http://ocpsoft.com/prettyfaces/). (3认同)
  • 不,不一定是.只有[`UICommand`](http://download.oracle.com/javaee/6/api/javax/faces/component/UICommand.html)组件需要进入[`UIForm`](http://下载.oracle.com/javaee/6/api/javax/faces/component/UIForm.html)组件. (2认同)