いくつかの JSP ページとサーブレットを含む JSP/サーブレット Web アプリケーションがあります。次の質問を読みました。
それらは非常に役に立ちましたが、新しい質問があります。使用するすべてのサーブレットを初期化する必要がありますか? それともinit()
、Web アプリケーションで呼び出される最初のサーベットだけが必要ですか?
いくつかの JSP ページとサーブレットを含む JSP/サーブレット Web アプリケーションがあります。次の質問を読みました。
それらは非常に役に立ちましたが、新しい質問があります。使用するすべてのサーブレットを初期化する必要がありますか? それともinit()
、Web アプリケーションで呼び出される最初のサーベットだけが必要ですか?
サーブレット コンテナーはサーブレットの初期化を制御するため、init()
メソッドを使用して、サーブレットが必要とするインスタンス フィールドを初期化する以外に選択肢はありません。たとえば、サーブレットがリソースと対話するために Service クラスに依存している場合、次のようにすることができます。
public class MyServlet extends HttpServlet {
private MyService myService;
public void init() {
myService = new MyService();
myService.setSomeProperty("propertyValue");
}
...
}
このようにして、任意のフィールドを初期化できます。必要な場合は、init(ServletConfig)
代わりに メソッドを使用するか、 を呼び出して、他のサーブレットまたは から追加された属性を含む可能性があるgetServletConfig()
にアクセスできます。サーブレットを初期化する順序を設定できることに注意してください。ServletContext
init()
ServletContextListener
サーブレットの の目的を完全に誤解しているようです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.
}
}