いつh:commandLinkではなくh:outputLinkを使用する必要がありますか?


129

<h:outputLink>代わりにいつ使用する必要があり<h:commandLink>ますか?

commandLinkHTTPポストを生成することを理解しています。outputLinkHTTP get が生成されると思います。とはいえ、私が読んだほとんどのJSFチュートリアル資料commandLink(ほぼ?)独占的に使用しています。

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

さらにjqueryが必要

...そして、commandLinkおそらく?faces-redirect=trueブックマーク可能性のために使用しているのかoutputLink、それとも正しい選択なのかわかりません。

回答:


195

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

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

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

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

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

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

JSF 2.0以降<h:link>、URLの代わりにビューID(ナビゲーションケースの結果)を取ることができるものもあります。HTML <a>要素が生成され、同様に適切なURLが含まれhrefます。

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

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

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

以下も参照してください。


2
いいえ、そうである必要はありません。UICommandコンポーネントのみをコンポーネントに入れる必要がありUIFormます。
BalusC 2010年

3
実際にはありません。一般に、可能な場合は、リンクに固執するh:outputLinkh:link、リンクを張ってください。SEOを過小評価しないでください。ちなみに、ここにあるようなRESTに似た素敵なURLについては、PrettyFacesをご覧ください
BalusC 2010年

1
いいえ、違いは、h:linkJSFビューID(例:)pageを値としてh:outputLink受け取り、実際のURL(例:/page.xhtmlまたは/page.jsf、またはFacesServletマッピングに応じてその他)を値として取る点です。どちらの場合も、URLエンコードはとにかく発生します。ところで、テンプレートテキスト#{...}とのELのレンダリング動作に違いはありませんh:outputText。どちらも事前定義されたXMLエンティティをエスケープします(いいえ、それはURLエンコーディングと同じではありません)。h:outputText以下のような、よりattribtuesのみの提供idstyleClassなどは、構成要素および/またはマークアップを制御します。
BalusC 2010年

1
@BalusC回答の1行目の「完全なHTML」とは、具体的にはどういう意味ですか。
オタク2012年

1
@Geek:1つのHTML <a>要素をポイントするだけで、それ以上、
空想

4

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


1
それを信じるのは難しいと思います。伝聞/あなた自身の事例証拠以外に、あなたはそれを裏付ける何かを持っていますか?
Matt Ball

5
@マット:たとえば、ページの「神」フォーム内にこのPOSTナビゲーションリンクがあり、1行あたり3つの入力フィールドを含む1000行を超えるデータテーブルがある場合は、速度が遅くなると想像できます。しかし、そのようなページにはとにかく他の深刻な問題があります:)
BalusC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.