web-dev-qa-db-ja.com

h:commandLinkの代わりにh:outputLinkを使用する場合

<h:outputLink>の代わりに<h:commandLink>を使用する場合

commandLinkはHTTPポストを生成することを理解しています。 outputLinkがHTTP GETを生成すると推測しています。とはいえ、ほとんどの JSFチュートリアル資料 私が読んだことはcommandLink(ほぼ?)のみを使用しています。

コンテキスト:Stack Overflowのように、ユーザーページへのヘッダーリンクを表示するちょっとしたデモプロジェクトを実装しています...

needs more jquery

...また、commandLink(ブックマーク機能に?faces-redirect=trueを使用している場合)またはoutputLinkが正しい選択かどうかわかりません。

127
Matt Ball

<h:outputLink> は、ブックマーク可能なGETリクエストを起動するhref属性に適切なURLを持つ完全なHTML <a>要素をレンダリングします。マネージドBeanアクションメソッドを直接呼び出すことはできません。

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

<h:commandLink> は、(隠された)POSTフォームを送信し、マネージドBeanアクションメソッドを呼び出すことができるonclickスクリプトでHTML <a>要素をレンダリングします。また、<h:form>内に配置する必要があります。

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

POSTの後にリダイレクトをトリガーする?faces-redirect=true<h:commandLink>パラメーター( Post-Redirect-Get パターンに従って)は、リンクがリンクされている場合にのみターゲットページのブックマーク機能を改善します。実際にクリックされました(URLは「1つ後ろ」になりません)が、<a>要素のhrefが完全なURLに変更されることはありません。まだ#のままです。

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

JSF 2.0以降、 <h:link> もあり、URLの代わりにビューID(ナビゲーションケースの結果)を取得できます。 hrefに適切なURLを持つHTML <a>要素も生成します。

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

そのため、SOユーザー名リンクのような純粋でブックマーク可能なページ間ナビゲーションの場合は、<h:outputLink>または<h:link>を使用します。ボットは通常POSTフォームやJSコードを暗号化しないため、SEOにとっても優れています。また、ページがブックマーク可能になり、URLが「後ろ」にならないため、UXも改善されます。

必要に応じて、コンストラクタで、または問題の宛先ページに接続されている@PostConstructまたは@RequestScoped@ViewScoped@ManagedBeanで前処理ジョブを実行できます。 @ManagedPropertyまたは<f:viewParam>を使用して、GETパラメーターをBeanプロパティとして設定できます。

こちらもご覧ください:

191
BalusC

また、ページの読み込み(パフォーマンス)は、h:linkよりh:commandLinkの使用に時間がかかることもわかりました。 h:linkはh:commandLinkと比較して高速です

4
Ashok