0

いくつかの JSP ページとサーブレットを含む JSP/サーブレット Web アプリケーションがあります。次の質問を読みました。

  1. サーブレット コンストラクターと init() メソッド
  2. 特別な自動起動サーブレットを使用して起動時に初期化し、アプリケーション データを共有する

それらは非常に役に立ちましたが、新しい質問があります。使用するすべてのサーブレットを初期化する必要がありますか? それともinit()、Web アプリケーションで呼び出される最初のサーベットだけが必要ですか?

4

2 に答える 2

0

サーブレット コンテナーはサーブレットの初期化を制御するため、init()メソッドを使用して、サーブレットが必要とするインスタンス フィールドを初期化する以外に選択肢はありません。たとえば、サーブレットがリソースと対話するために Service クラスに依存している場合、次のようにすることができます。

public class MyServlet extends HttpServlet {

    private MyService myService;

    public void init() {
        myService = new MyService();
        myService.setSomeProperty("propertyValue");
    }
    ...
}

このようにして、任意のフィールドを初期化できます。必要な場合は、init(ServletConfig)代わりに メソッドを使用するか、 を呼び出して、他のサーブレットまたは から追加された属性を含む可能性があるgetServletConfig()にアクセスできます。サーブレットを初期化する順序を設定できることに注意してください。ServletContextinit()ServletContextListener

于 2013-08-06T13:53:33.743 に答える
0

サーブレットの の目的を完全に誤解しているようですinit()。あなたはそれをオーバーライドしなければならないとどういうわけか考えているようです。これは完全に真実ではありません。アプリケーションの起動中のサーブレットの初期化で一度だけ呼び出される必要があるサーブレット メソッドを宣言する機会を与えるだけです。通常、いくつかのサービス、構成ファイル、またはサーブレット独自の に基づいて、いくつかのローカル変数を初期化します<init-param>ローカル変数に注意してください。つまり、サーブレット インスタンス自体に固有の変数であり、宣言され、サーブレット以外の場所で共有/アクセスさprivateれることはありません。

特に次の発言

または、Web アプリケーションで呼び出される最初のサーベットのみを init() する必要がありますか?

アプリケーションの起動時に呼び出されるアプリケーション全体のフックを実際に探していることを示唆しています。その場合、特別な自動開始サーブレットを使用して起動時に初期化し、アプリケーション データを共有する質問で回答されているServletContextListenerように、サーブレットの代わりに使用する必要があります。にエントリを追加する必要のない Servlet 3.0 互換のキックオフの例を次に示します。init()<listener>web.xml

@WebListener
public class Config implements ServletContextListener {

    public void contextInitialized(ServletContextEvent event) {
        // Do stuff during webapp's startup.
    }

    public void contextDestroyed(ServletContextEvent event) {
        // Do stuff during webapp's shutdown.
    }

}
于 2013-08-06T14:01:13.090 に答える