FacesContext
とExternalContext
の違いは何ですか?いつ使用できますか?一方には何があり、他方には何がありますか?
次のサンプルは、書籍JavaServer Faces 3rd editionからのものです。
<h:commandButton ... actionListener="#{rushmore.handleMouseClick}" />
バッキングビーン:
public void handleMouseClick(ActionEvent e) {
FacesContext context = FacesContext.getCurrentInstance();
String clientId = e.getComponent().getClientId(context);
Map<String, String> requestParams = context.getExternalContext().getRequestParameterMap();
// ...
}
リクエストパラメータがExternalContext
にあるのはなぜですか? clientId
とは何ですか?アプリケーションの起動時にJSFによって生成されますか?
Javadocを注意深く調べて、提供されるメソッドと、それらのメソッドがすべて正確に何をするのかを確認してください。
Javadocにリストされているメソッドを詳しく見ると、FacesContext
がJSF固有のアーティファクトへのアクセスを提供していることに気付くでしょう。 JSFは、上で実行されるように設計されています。例えば。コンバーター、バリデーター、コンポーネント、EL式などを作成し、ビュールート、サポートされているロケールなどに関する情報を取得し、フェーズリスナー、システムイベントリスナーなどを追加します。 JSF APIに固有のすべて。
また、ExternalContext
は通常、JSFが現在「隠れて」使用しているサーブレットまたはポートレット固有のアーティファクトへのアクセスを提供します。たとえば、サーブレットコンテナで実行する場合、 HTTPサーブレットリクエスト 、 HTTPサーブレットレスポンス 、 HTTPセッション および サーブレットコンテキスト =そして本質的にすべてのアーティファクトも。これらのリンクをクリックすると、getRequestParameterMap()
などのExternalContext
によって委任されたメソッドが順番に提供されていることがわかります。 javadoc も参照してください。はい、そのリンクをクリックしても、サーブレットリクエストが明示的に言及されていることがわかります。
サーブレット:これは、_
javax.servlet.ServletRequest
_メソッドgetParameter()
およびgetParameterNames()
を介して使用可能なパラメーターのセットでなければなりません。
nothing があり、これはbothコンテキストによって提供されます。したがって、どちらか一方を好む理由はまったくありません。実行する必要があるジョブに適切なものを使用するだけです。
クライアントIDに関しては、JSFによって実際に生成されますが、サーバーの起動時ではありません。ビューごとにJSFコンポーネントごとに生成されます。 HTML _<h:inputText>
_要素を生成する_<input>
_のような入力コンポーネントの場合、それはname
属性にもなります
_<input type="text" id="formId:inputId" name="formId:inputId" ... />
_
_formId:inputId
_は、まさにJSFクライアントIDです。それがリクエストパラメータ名になります。コマンドボタンのHTML表現には、name
もあります。これは、パラメーター値としてボタンの値を持つリクエストパラメーター名として終わります。