2012-03-26 20 views
3

How to gain access to a ServletContext instance from any method?から、Java Webプロジェクトの任意のクラスからサーブレットコンテキストにアクセスする場合、ServletContextを指す静的フィールドを宣言できますが、静的フィールドは次のとおりです。 Java Webアプリケーションの悪い習慣は、JVMがオフになるまでGCが収集できないためです(この時点で私が間違っていると私を修正します)。リスナーを使用せずに、あるいはパラメータとして受け取ることなくServletContextにアクセスする別の方法がありますか?この問題を解決する別の回避策がありますか? Webアプリケーション用にJSF 1.2とJBoss 5.1 GAを使用しています。静的サーブレットコンテキスト変数

注:私はのServletContextにアクセスするために

(ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext(); 

を使用することができます知っているが、のServletContextにアクセスする必要があるとFacesContext.getCurrentInstance()が初期化されていない起動時に実行される方法があります。

UPDATE:

我々は、Webアプリケーションの起動時にString定数へのweb.xmlからいくつかのIPのをロードする必要があります。これを行うために、変数でcontext-paramsをロードしてSingletonクラスのいくつかの値でString定数を埋め込むSingletonクラスを作成しました。このSingletonクラスは、大量のデータを管理し、メモリ例外エラーを出しています。この問題を解決するために、SingletonクラスをServerContext属性としてロードされる単純なクラスに変更していますが、この(存在しなくなった)シングルトンのインスタンスがないためにString定数をロードできません。

+0

正確に必要な理由は何ですか?なぜあなたは 'ServletContextListener'自体で仕事をしないのですか? 'FacesContext'は、' FacesServlet'のURLパターンとURLが一致し、それを呼び出したHTTP要求ごとに初期化されます。 – BalusC

+0

@BalusC web.xmlにcontext-paramを使用して静的メソッドでロードされる定数Stringがあります。これを行うには、 'ServletContext#getInitParameter'が必要です。これに対する実際の回避策は、ServletContextListener'を実装するクラスでこれらの値をロードするが、メモリの問題を生成するSingletonクラスを作成することでした。そのため、クラスのインスタンスを作成し、ServletContextの属性としてロードする必要があります静的メソッドではアクセスできません。 –

+0

*「ServletContextListenerを実装するクラスでこれらの値をロードするSingletonクラスを作成する」*どのように意味があるのでしょうか。機能要件は何ですか?あなたは 'public static'変数で終わる必要がありますか?どうして? – BalusC

答えて

2

シングルトンが必要な理由はわかりません。 Just create oneアプリケーションスコープに格納するBean。

@Override 
public void contextInitialized(ServletContextEvent event) { 
    ServletContext context = event.getServletContext(); 
    Set<String> ips = parseContextParamSomehow(context.getInitParam("ips")); 
    Manager manager = new Manager(); 
    manager.setIps(ips); 
    context.setAttribute("manager", manager); 
} 

ELコンテキストでは#{manager}で利用可能になります。また、仲裁JSFマネージドBeanのマネージプロパティとしても使用できます。もう1つの方法は、アプリケーションスコープのJSFマネージドBeanを作成し、そのコンストラクタでジョブを実行することですが、Beanを含む最初のHTTPリクエストにその構築を延期します。

+0

シングルトンはキャッシュ実装用です(はい、ehcacheや他のフレームワークはありません)が、これは悪い解決策でしたので、このフレームワークを追加する代わりに、私の上司は私たちがプログラムしたクラスでこの問題を解決してください。ところで、あなたのソリューションは面白そうですが、HTTPリクエストで呼び出されないメソッドで 'context'にアクセスするにはどうすればいいですか? –

+0

答えに示されているように 'イベント 'だけで? – BalusC