web-dev-qa-db-ja.com

h:buttonとh:commandButtonの違い

JSF 2では、h:buttonh:commandButtonの違いは何ですか?

69
Geek

<h:button>

<h:button> はHTML <input type="button">を生成します。生成された要素は、JavaScriptを使用して、HTTP GETリクエストを使用して、属性outcomeで指定されたページに移動します。

例えば。

<h:button value="GET button" outcome="otherpage" />

生成します

<input type="button" onclick="window.location.href='/contextpath/otherpage.xhtml'; return false;" value="GET button" />

これにより、ブラウザのアドレスバーで(ブックマーク可能な)URLが変更されますが、これはSEOフレンドリーではありません。 SearchbotはonclickのURLを追跡しません。特定のURLでSEOが重要な場合は、<h:outputLink>または<h:link>を使用することをお勧めします。必要に応じて、生成されたHTML <a>要素にCSSをスローして、ボタンのように見せることができます。

以下のように、メソッドを参照するEL式をoutcome属性に配置できますが、

<h:button value="GET button" outcome="#{bean.getOutcome()}" />

ボタンをクリックするとnot呼び出されません。代わりに、生成されたonclickコードに埋め込まれるナビゲーション結果を取得するためだけに、ボタンを含むページがレンダリングされるときに既に呼び出されています。 outcome="#{bean.action}"のようなアクションメソッドの構文を使用しようとした場合、 javax.el.E​​LException:クラスcom.example.BeanでプロパティactionMethodが見つかりませんでした。

POSTリクエストの結果としてメソッドを呼び出す場合は、代わりに<h:commandButton>を使用してください。以下を参照してください。または、GETリクエストの結果としてメソッドを呼び出す場合は、 ページ読み込みでJSFマネージドBeanアクションを呼び出す 、または<f:param>を介してGETリクエストパラメータがある場合、 ページの読み込み時にバッキングBeanのGETクエリ文字列URLパラメータを処理するにはどうすればよいですか?


<h:commandButton>

<h:commandButton> は、デフォルトで親<input type="submit">を送信するHTML <h:form>ボタンを生成します。これは、HTTP POSTメソッドを使用して、actionactionListenerおよび/または<f:ajax listener>にアタッチされたアクションを呼び出します。 <h:form>が必要です。

例えば。

<h:form id="form">
    <h:commandButton id="button" value="POST button" action="otherpage" />
</h:form>

生成します

<form id="form" name="form" method="post" action="/contextpath/currentpage.xhtml" enctype="application/x-www-form-urlencoded">
    <input type="hidden" name="form" value="form" />
    <input type="submit" name="form:button" value="POST button" />
    <input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="...." autocomplete="off" />
</form>

したがって、現在のページに送信されることに注意してください(フォームアクションURLはブラウザのアドレスバーに表示されます)。その後、ブラウザのアドレスバーのURLを変更せずに、ターゲットページにforwardします。 ?faces-redirect=trueパラメーターを結果値に追加して、POST( Post-Redirect-Getパターン に従って)の後にリダイレクトをトリガーして、ターゲットURLをブックマーク可能にすることができます。

<h:commandButton>は通常、ページ間のナビゲーションを実行するためではなく、POSTフォームを送信するためにのみ使用されます。通常、actionは、フォームデータをDBに保存するなど、Stringの結果を返すビジネスアクションを指します。

<h:commandButton ... action="#{bean.save}" />

public String save() {
    // ...
    return "otherpage";
}

nullまたはvoidを返すと、同じビューに戻ります。空の文字列も返しますが、ビュースコープBeanを再作成します。最近のJSF2と<f:ajax>では、多くの場合、アクションは同じビュー(つまり、nullまたはvoid)に戻るだけで、結果はajaxによって条件付きでレンダリングされます。

public void save() {
    // ...
}

こちらもご覧ください:

106
BalusC

h:button-h:buttonをクリックすると、ブックマーク可能なGETリクエストが発行されます。

h:commandbutton-getリクエストの代わりに、h:commandbuttonはPOSTリクエストを発行し、フォームデータをサーバーに送り返します。

6
lifetimes

h:commandButtonはh:formで囲む必要があり、ナビゲーションの2つの方法があります。つまり、action属性を設定することによる静的と、actionListener属性を設定することによる動的です。

<h:form>
    <h:commandButton action="page.xhtml" value="cmdButton"/>
</h:form>

このコードは次のhtmlを生成します。

<form id="j_idt7" name="j_idt7" method="post" action="/jsf/faces/index.xhtml" enctype="application/x-www-form-urlencoded">

一方、h:ボタンはよりシンプルで、次のように静的またはルールベースのナビゲーションに使用されます

<h:button outcome="page.xhtml" value="button"/>

生成されたhtmlは

 <title>Facelet Title</title></head><body><input type="button" onclick="window.location.href='/jsf/faces/page.xhtml'; return false;" value="button" />
4
ashish

これは本から取られています-エド・バーンズとクリス・シャルクによる完全なリファレンス

h:commandButton vs h:button

h:commandButton | h:commandLinkh:button | h:linkの違いは何ですか?

後者の2つのコンポーネントは、2.0で導入され、ビューパラメーター機能と組み合わせて使用​​した場合、ブックマーク可能なJSFページを有効にします。

h:button | h:linkh:commandButton | h:commandLinkには3つの主な違いがあります。

まず、h:button|h:linkはブラウザにHTTP GETリクエストを発行させ、h:commandButton|h:commandLinkはフォームPOSTを発行させます。つまり、ユーザーが入力した値(テキストフィールド、チェックボックスなど)を持つページ内のコンポーネントは、h:button|h:linkを使用するときにサーバーに自動的に送信されません。 h:button|h:linkで値を送信するには、「パラメーターの表示」機能を使用して追加のアクションを実行する必要があります。

2種類のコンポーネントの2番目の主な違いは、h:button|h:linkが次に進むべき場所を説明する結果属性を持ち、h:commandButton|h:commandLinkがこの目的のためにアクション属性を使用することです。これは、前者はイベントシステムでActionEventを生成しないのに対し、後者はイベントシステムを生成するためです。

最後に、この機能を完全に理解するために最も重要なのは、h:button|h:linkコンポーネントにより、ナビゲーションシステムがページのレンダリング中に結果を導き出すように求められ、この質問に対する答えがページ。対照的に、h:commandButton|h:commandLinkコンポーネントにより、ナビゲーションシステムは、ページからPOSTBACKの結果を導き出すように求められます。これはタイミングの違いです。レンダリングは常にPOSTBACKの前に行われます。

2
Shirgill Farhan

commandButtonaction属性について JSF javadocs が言わなければならないことは次のとおりです。

このコンポーネントがユーザーによってアクティブ化されたときに呼び出すアプリケーションアクションを表すMethodExpression。式は、パラメーターを受け取らず、このアプリケーションのNavigationHandlerに渡されるObject(論理結果を導出するために呼び出されるtoString())を返すパブリックメソッドに評価される必要があります。

このページの回答のいずれかと関係があることを誰もが説明できると、私にとっては光り輝くでしょう。 actionがメソッドではなく、あるページのファイル名を参照していることは明らかです。

0
jordanpg