4

サーブレット API で、web.xml で指定されたプロパティ (初期化パラメーターなど) に、Web コンテナーにまったく関連付けられていない Bean または Factory クラス内からアクセスする方法はありますか?

たとえば、Factory クラスを作成していて、Factory 内にいくつかのロジックを含めて、ファイルの階層と構成の場所をチェックし、どの実装クラスをインスタンス化するかを決定するために利用できるかどうかを確認したいと考えています。たとえば、

  1. クラスパスのプロパティ ファイル、
  2. web.xml パラメータ、
  3. システム プロパティ、または
  4. 他に何も利用できない場合は、いくつかのデフォルトロジック。

ServletConfigFactory への参照や類似のものを挿入せずにこれを実行できるようにしたいと考えています。コードは、サーブレット コンテナの外部で正常に実行できる必要があります。

これは少し珍しいように聞こえるかもしれませんが、私が取り組んでいるこのコンポーネントを、Web アプリケーションの 1 つと一緒にパッケージ化できるようにしたいと考えています。私のコンポーネントのためだけに新しいプロパティ ファイルが必要なので、web.xml などの他の構成ファイルの上に便乗したいと考えていました。

私の記憶が正しければ、.NETRequest.GetCurrentRequest()には現在実行中の への参照を取得するようなものがありますRequestが、これは Java アプリであるため、.NET へのアクセスに使用できる類似のものを探していますServletConfig

4

3 に答える 3

5

これを行う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は空になります。

于 2008-09-03T14:36:25.657 に答える
1

これにSpringフレームワークを使用することを検討しましたか?そうすれば、Beanに余分な問題が発生することはなく、Springが構成のセットアップを処理します。

于 2008-09-03T14:20:45.197 に答える
0

ServletConfig(またはServletContext)への参照を取り、それらの値をFactoryクラスに転記する関連するブートストラップクラスを追加する必要があると思います。少なくともこの方法では、個別にパッケージ化できます。

@toolkit:素晴らしい、最も謙虚な-これは私がしばらくやってきたことです

于 2008-09-03T14:24:03.410 に答える