74

h:buttonJSF 2 では、との違いは何h:commandButtonですか?

4

5 に答える 5

110

<h:button>

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

例えば

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

発生します

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

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

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

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

ボタンをクリックしても呼び出されません。代わりに、ボタンを含むページが、生成されたコードに組み込まれるナビゲーション結果を取得するという唯一の目的でレンダリングされるときに、既に呼び出されていonclickます。アクション メソッドの構文を のように使用しようとしたことがある場合は、 javax.el.E​​LException: Could not find property actionMethod in class com.example.Beanoutcome="#{bean.action}"に直面することで、この間違い/誤解がすでに示唆されています。

POST リクエストの結果としてメソッドを呼び出す場合は、<h:commandButton>代わりに以下を参照してください。または、GET リクエストの結果としてメソッドを呼び出す場合は、ページの読み込み時に JSF マネージド Bean アクションを呼び出すに進んでください。 ?<f:param>


<h:commandButton>

は、デフォルトで HTTP POST メソッドを使用して親を送信し、および/またはに関連付けられているアクションを呼び出す<h:commandButton>HTML ボタンを生成します。が必要です。<input type="submit"><h:form>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 を変更することなく、ターゲット ページに転送されます。?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() {
    // ...
}

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

于 2012-10-25T15:29:17.150 に答える
7

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

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

于 2012-10-25T14:16:26.567 に答える
4

h:commandButton は ah: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:button はよりシンプルで、次のように静的またはルールベースのナビゲーションに使用されます。

<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" />
于 2012-10-25T16:11:13.430 に答える
3

これは、Ed Burns と Chris Schalk による The Complete Referenceという本からの抜粋です。

h:commandButton vs h:button

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

後者の 2 つのコンポーネントは2.0、View Parameters 機能と組み合わせて使用​​すると、ブックマーク可能な 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 の前に行われます。

于 2014-12-18T17:05:28.063 に答える
0

JSF javadocscommandButton actionが属性について述べなければならないことは次のとおりです。

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

このページの回答との関係を誰かが説明できれば、それは私に光を当てます. actionメソッドではなく、ページのファイル名を参照していることは明らかです。

于 2015-06-27T18:17:10.000 に答える