リクエスト値の適用フェーズでは、コンポーネント ツリー内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 出力の生成中に実行され、何らかの方法でリクエスト パラメータとして渡されるわけではありません。いいえ、実際のアプリケーションの呼び出し段階で実行されただけです。