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

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

我知道 commandLink会生成一个 HTTP 文章; 我猜想 outputLink会生成 HTTP get。也就是说,我读过的大多数 JSF 教程材料都使用 commandLink(几乎?)独家。

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

needs more jquery

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

109977 次浏览

<h:outputLink>呈现一个完整的 HTML <a>元素,在 href属性中使用适当的 URL,该属性触发一个书签 GET 请求。它不能直接调用托管 bean 操作方法。

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

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

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

<h:commandLink>上的 ?faces-redirect=true参数,在 POST 之后触发一个重定向(根据 后重定向-获取模式) ,只是在链接实际被点击时提高目标页面的书签性(URL 不再是“落后一个”) ,但是它不会改变 <a>元素的 href为一个完整的 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中使用适当的 URL。

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

因此,如果它是为纯粹和书签页到页导航,如 SO 用户名链接,那么使用 <h:outputLink><h:link>。这对搜索引擎优化也有好处,因为机器人通常不加密 POST 表单或 JS 代码。此外,用户体验将得到改善,因为现在的网页是书签和网址不再是“一个落后”了。

必要时,您可以在 @RequestScoped@ViewScoped @ManagedBean的构造函数或 @PostConstruct中执行预处理工作,@RequestScoped@ViewScoped @ManagedBean附加到相关的目标页。您可以使用 @ManagedProperty<f:viewParam>将 GET 参数设置为 bean 属性。

参见:

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