JSFの学習を始めたばかりです。
例で作業しているときに、MyBean クラス内の ServletContext オブジェクトにアクセスする必要があると感じました。Listener を使用して ServletContext 内に配置したオブジェクトを使用したかったのです。それをしてもいいですか?ServletContext のスコープは Beans 内にもありますか?
から入手できますExternalContext#getContext()
。その javadocも参照してください。
getContext
public abstract java.lang.Object getContext()
現在のアプリケーションのアプリケーション環境オブジェクト インスタンスを返します。
アプリケーションの起動時またはシャットダウン時にこのメソッドを呼び出すことは有効です。アプリケーションの起動またはシャットダウン中に呼び出された場合、これは、実際のリクエスト中に によって返されたを呼び出したときに返されたものと同じコンテナ コンテキスト インスタンス (
ServletContext
または) を返します。PortletContext
getContext()
ExternalContext
FacesContext
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