Java Bean から web.xml プロパティにアクセスする方法はありますか?
質問
サーブレット API で、Web コンテナにまったく関連付けられていない Bean または Factory クラス内から web.xml で指定されたプロパティ (初期化パラメータなど) にアクセスする方法はありますか?
たとえば、Factory クラスを作成しているのですが、Factory 内にいくつかのロジックを組み込んで、ファイルの階層と構成の場所をチェックして、どの実装クラスをインスタンス化するかを決定するために使用できるものがあるかを確認したいと考えています。たとえば、次のようにします。
- クラスパス内のプロパティ ファイル、
- web.xml パラメータ、
- システムプロパティ、または
- 他に利用可能なものがない場合のデフォルトのロジック。
への参照を挿入せずにこれを実行できるようにしたいのですが、 ServletConfig
または私のファクトリーに似たもの - コードはサーブレットコンテナの外でも問題なく実行できるはずです。
これは少し珍しいように聞こえるかもしれませんが、私が取り組んでいるこのコンポーネントは、Web アプリの 1 つとパッケージ化でき、また、コマンドライン ツールの一部とパッケージ化できるほど多用途であることを望んでいます。自分のコンポーネント専用の新しいプロパティ ファイルが必要なので、web.xml などの他の構成ファイルに便乗したいと考えていました。
私の記憶が正しければ、.NETには次のようなものがあります Request.GetCurrentRequest()
現在実行中のへの参照を取得するには Request
- しかし、これは Java アプリなので、アクセスするために使用できる類似のものを探しています。 ServletConfig
.
解決
これを行う 1 つの方法は次のとおりです。
public class FactoryInitialisingServletContextListener implements ServletContextListener {
public void contextDestroyed(ServletContextEvent event) {
}
public void contextInitialized(ServletContextEvent event) {
Properties properties = new Properties();
ServletContext servletContext = event.getServletContext();
Enumeration<?> keys = servletContext.getInitParameterNames();
while (keys.hasMoreElements()) {
String key = (String) keys.nextElement();
String value = servletContext.getInitParameter(key);
properties.setProperty(key, value);
}
Factory.setServletContextProperties(properties);
}
}
public class Factory {
static Properties _servletContextProperties = new Properties();
public static void setServletContextProperties(Properties servletContextProperties) {
_servletContextProperties = servletContextProperties;
}
}
そして、web.xml に以下を含めます
<listener>
<listener-class>com.acme.FactoryInitialisingServletContextListener<listener-class>
</listener>
アプリケーションが Web コンテナーで実行されている場合、コンテキストが作成されると、リスナーはコンテナーによって呼び出されます。この場合、_servletContextProperties は、web.xml で指定された任意の context-params に置き換えられます。
アプリケーションが Web コンテナの外で実行されている場合、_servletContextProperties は空になります。
他のヒント
これに Spring フレームワークの使用を検討しましたか?こうすることで、Bean に余分な負荷がかからず、Spring が構成セットアップを処理します。
ServletConfig (または ServletContext) への参照を取得し、それらの値を Factory クラスに転記する、関連するブートストラップ クラスを追加する必要があると思います。少なくともこの方法で個別にパッケージ化できます。
@ツールキット:素晴らしい、とても謙虚な気持ちです - これは私がしばらくの間やろうとしていたことです