<h:outputLink>
の代わりに<h:commandLink>
を使用する場合
commandLink
はHTTPポストを生成することを理解しています。 outputLink
がHTTP GETを生成すると推測しています。とはいえ、ほとんどの JSFチュートリアル資料 私が読んだことはcommandLink
(ほぼ?)のみを使用しています。
コンテキスト:Stack Overflowのように、ユーザーページへのヘッダーリンクを表示するちょっとしたデモプロジェクトを実装しています...
...また、commandLink
(ブックマーク機能に?faces-redirect=true
を使用している場合)またはoutputLink
が正しい選択かどうかわかりません。
<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プロパティとして設定できます。
また、ページの読み込み(パフォーマンス)は、h:linkよりh:commandLinkの使用に時間がかかることもわかりました。 h:linkはh:commandLinkと比較して高速です