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定数をロードできません。
正確に必要な理由は何ですか?なぜあなたは 'ServletContextListener'自体で仕事をしないのですか? 'FacesContext'は、' FacesServlet'のURLパターンとURLが一致し、それを呼び出したHTTP要求ごとに初期化されます。 – BalusC
@BalusC web.xmlにcontext-paramを使用して静的メソッドでロードされる定数Stringがあります。これを行うには、 'ServletContext#getInitParameter'が必要です。これに対する実際の回避策は、ServletContextListener'を実装するクラスでこれらの値をロードするが、メモリの問題を生成するSingletonクラスを作成することでした。そのため、クラスのインスタンスを作成し、ServletContextの属性としてロードする必要があります静的メソッドではアクセスできません。 –
*「ServletContextListenerを実装するクラスでこれらの値をロードするSingletonクラスを作成する」*どのように意味があるのでしょうか。機能要件は何ですか?あなたは 'public static'変数で終わる必要がありますか?どうして? – BalusC