1. ホーム
  2. jsf

h:buttonとh:commandButtonの相違点

2023-11-07 21:51:03

質問

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

どのように解決するのですか?

<h:button>

その <h:button> は HTML の <input type="button"> . 生成された要素は、JavaScript を使って、属性 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的に不利です。検索ボットは onclick . を使用した方が良いでしょう。 <h:outputLink> または <h:link> といった具合に、SEOが重要な場合は、指定されたURLの上に記述します。必要であれば、生成された HTML にいくつかの CSS を投げ込むことができます。 <a> 要素に CSS を適用して、ボタンのように見せることもできます。

メソッドを参照するEL式は outcome 属性に記述することができます.

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

それは ではない はボタンをクリックしたときに呼び出されます。その代わり、ボタンを含むページがレンダリングされるときにすでに呼び出され、その目的は生成された onclick コードに埋め込まれるナビゲーションの結果を得るためです。のようなアクションメソッドの構文を使おうとしたことがある場合、それは outcome="#{bean.action}" のようにアクションメソッドの構文を使おうとすると、すでにこの間違い/誤解を示唆する javax.el.ELException: com.example.Bean クラスで actionMethod プロパティが見つかりませんでした。 .

POSTリクエストの結果としてメソッドを呼び出したい場合は <h:commandButton> を使ってください。また、GET リクエストの結果としてメソッドを呼び出す場合は、次のようにします。 ページロード時にJSFマネージドビーンのアクションを呼び出す または、GETリクエストのパラメータを <f:param> , ページロード時にバッキングビーンのGETクエリ文字列URLパラメータを処理するにはどうすればよいですか?


<h:commandButton>

その <h:commandButton> は HTML の <input type="submit"> ボタンを生成し、デフォルトで親 <h:form> を HTTP POST メソッドで送信し、その際に action , actionListener または <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は変更されません。あなたは ?faces-redirect=true パラメータを追加して、POST 後のリダイレクトをトリガーすることもできます (例. Post-Redirect-Get パターン のように)POST後にリダイレクトを行い、ターゲットURLがブックマーク可能になるようにします。

<h:commandButton> は通常 POST フォームの送信にのみ使用され、ページ間の移動には使用されません。通常 action は、フォームのデータを DB に保存するようなビジネスアクションを指し、そのアクションは String の結果を返します。

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

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

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

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


こちらもご覧ください。