1

などのJava EEフレームワークを使用しない通常のWeb アプリケーションを使用しています。この Web アプリケーションでは、そのアプリケーションに固有の構成のリストを含むカスタム XML ( ) ファイルを使用しています。この構成情報をファイルで言及したくありません。ここで、コンテナが最初にサーブレットを初期化するときに、ファイルに記載されている構成情報を読み取る必要があります。これを達成するために、カスタム サーブレット クラスを作成しました。これは、から拡張され、すべてのサーブレットは thisから拡張されます。そのため、サーベット クラスが読み込まれると、私のクラスも読み込まれます。StrutsJSFcustom-config.xmlweb.xmlcustom-config.xmlCustomServletHttpServletCustomServletCustomServlet

私のクラスでは、ファイルCustomServletをロードし、これに記載されている構成を理解することが期待される静的メソッドがあります。custom-config.xml

2つ質問があります。これは正しい方法ですか?それとも、これをクラスのinit()メソッドに入れる必要がありますか? クラスパスからファイルCustomServletをロードするにはどうすればよいですか? 静的メソッドから読み込もうとしているためにcustom-config.xml使用できません。ServletConfig.getResourceAsStream()custom-config.xml

4

2 に答える 2

2

静的メソッドでそれを行うことは意味がありません。そこからたどり着けないでしょうServletContext。メソッドで行う必要がありますinit()。を使用しstatic AtomicBooleanて、現在の JVM にすでにロードされているかどうかを確認できます。

public abstract class CustomServlet extends HttpServlet {

    private static AtomicBoolean loaded = new AtomicBoolean();

    @Override
    public void init() throws ServletException { 
        if (!loaded.getAndSet(true)) {
            InputStream input = getServletContext().getResourceAsStream("/WEB-INF/custom-config.xml");
            // ...
        }
    }

    // ...
}

または、 を使用しServletContextListenerます。

@WebListener
public class Config implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent event) {
        InputStream input = event.getServletContext().getResourceAsStream("/WEB-INF/custom-config.xml");
        // ...
    }

    // ...
}

解析された XML 結果をアプリケーション スコープに配置して、すべてのサーブレットで利用できるようにすることができます。

以下も参照してください。

于 2012-09-14T14:43:05.813 に答える
-1

まず第一に、なぜあなたはxmlファイルをロードするための静的メソッドを持っているのですか?静的メソッドは、オブジェクトではなくクラスに属します。スーパークラスにデフォルトのコンストラクターを設定し、xmlをロードするようにします。

public abstract class BaseServlet extends HttpServlet{

public Base(){
loadXml();
}
private void loadXml(){
...
}
}

public class Servlet1 extends BaseServlet {
...
}

xmlがクラスパスの場合、FileInputStream()を使用してxmlファイルをロードできます。

于 2012-09-14T11:58:09.913 に答える