3

私がボタンをクリックしたことをJSFがどのように認識しているか、いくつかのアクションがあり、パラメーターを使用してアクションリスナーを呼び出すことさえ可能であることに興味があります。サーバーが状態とELに気づき、メソッドを呼び出すと想像できます。

例 1:

<form>
   <p:commandButton actionListener="{bean.do_something(bean.info)}" />
</form>

例 2:

<form>
     <h:datatable values=... var="myvar">
        <h:column>
           <p:commandButton actionListener="{bean.do_something(myvar.info)}" />
        </h:column>
     </h:datatable>
</form>
4

1 に答える 1

7

リクエスト値の適用フェーズでは、コンポーネント ツリー内decode()のすべてのインスタンスのメソッドが実行されます。UIComponentここで、必要な HTTP 要求パラメーターがチェックされ、収集されます。UIInputコンポーネント (およびフレンド) の場合<h:inputText>、送信された値が取得されています。UICommandコンポーネント (<h:commandButton>およびフレンド) の場合、はActionEventキューに入れられています。

<p:commandButton>すべての魔法が発生した場合、ソース コードCommandButtonRenderer#decode()の関連部分が以下に抽出されます (行番号は PrimeFaces 3.5 のものです)。

34  public void decode(FacesContext context, UIComponent component) {
35      CommandButton button = (CommandButton) component;
36      if(button.isDisabled()) {
37          return;
38      }
39         
40      String param = component.getClientId(context);
41      if(context.getExternalContext().getRequestParameterMap().containsKey(param)) {
42          component.queueEvent(new ActionEvent(component));
43      }
44  }

基本的な HTMLに精通している場合はname=value、すべての入力要素のペアと、それを囲むフォームの押されたボタンのみが要求パラメーターとしてサーバーに送信されることを既に知っているはずです。PrimeFaces コマンド ボタンは、基本的に次の HTML を生成します。

<button type="submit" name="formId:buttonId" ... />

どこformId:buttonIdから印刷されUIComponent#getClientId()ます。HTTP 要求パラメーター名として使用されているのはまさにこの値です (HTTP 要求パラメーター値はボタンのラベルですが、ここではそれ以上関係ありません)。JSF がその上で実行される基本的な サーブレットに精通している場合は、ボタンHttpServletRequest#getParameter()のペアを含めて、によってリクエスト パラメータが利用可能であることも既に知っているはずです。name=valueこれにより、押されたボタンを区別できます。

上記のdecode()方法でわかるように、このUIComponent#getClientId()値は、HTTP 要求パラメーター マップにパラメーター名が含まれているかどうかを確認するためにも使用されています。その場合、ActionEvent最終的にはアプリケーションの呼び出し段階で呼び出されるキューに入れられます。

EL の議論に関しては、実際にはロケット科学ではありません。EL式全体は、アプリケーションの呼び出し段階で実行されます。フォームの HTML 出力の生成中に実行され、何らかの方法でリクエスト パラメータとして渡されるわけではありません。いいえ、実際のアプリケーションの呼び出し段階で実行されただけです。

于 2013-09-17T00:38:30.357 に答える