5

JSFの学習を始めたばかりです。

例で作業しているときに、MyBean クラス内の ServletContext オブジェクトにアクセスする必要があると感じました。Listener を使用して ServletContext 内に配置したオブジェクトを使用したかったのです。それをしてもいいですか?ServletContext のスコープは Beans 内にもありますか?

4

1 に答える 1

14

から入手できますExternalContext#getContext()その javadocも参照してください。

getContext

public abstract java.lang.Object getContext()

現在のアプリケーションのアプリケーション環境オブジェクト インスタンスを返します。

アプリケーションの起動時またはシャットダウン時にこのメソッドを呼び出すことは有効です。アプリケーションの起動またはシャットダウン中に呼び出された場合、これは、実際のリクエスト中に によって返されたを呼び出したときに返されたものと同じコンテナ コンテキスト インスタンス (ServletContextまたは) を返します。PortletContextgetContext()ExternalContextFacesContext

Servlet : これは、現在のアプリケーションのjavax.servlet.ServletContextインスタンスである必要があります。

したがって、これは次のようにする必要があります。

public void someMethod() {
    ServletContext servletContext = (ServletContext) FacesContext
        .getCurrentInstance().getExternalContext().getContext();
    // ...
}

具体的な質問とは関係ありませんが、具体的な機能要件によっては、これが具体的な問題の正しい解決策ではない場合があります。一般的なコンセンサスは、JSF コードは依存関係やインポートを可能な限りなくすべきだということです。javax.servlet.*あなたの質問は明確ではありませんが、サーブレットコンテキストに入れた属性に実際にアクセスするつもりなら、ExternalContext#getApplicationMap()代わりにそれを取得してください。

ServletContextListener

event.getServletContext().setAttribute("foo", foo);

そしてJSFで

Foo foo = (Foo) FacesContext.getCurrentInstance().getExternalContext()
    .getApplicationMap().get("foo");

または単に@ManagedProperty

@ManagedProperty("#{foo}")
private Foo foo; // +setter
于 2013-01-09T20:24:40.600 に答える