web-dev-qa-db-ja.com

FacesContextとExternalContextの違いは何ですか

FacesContextExternalContextの違いは何ですか?いつ使用できますか?一方には何があり、他方には何がありますか?

次のサンプルは、書籍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によって生成されますか?

29
vmaric

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もあります。これは、パラメーター値としてボタンの値を持つリクエストパラメーター名として終わります。

43
BalusC