16

私はこのコードを持っています、

@WebServlet(value="/initializeResources", loadOnStartup=1)
public class InitializeResources extends HttpServlet {

  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
      System.out.println("HEREEEE");
  }

}

しかし、Web アプリケーションを起動してもサーブレットは起動しません。

サーブレットアノテーションで起動時の負荷をどのように使用しますか?

私のサーブレット API は 3.0 で、Tomcat 7 を使用しています

4

3 に答える 3

17

現在のコードでは、出力を表示するために GET リクエストを実行する必要がありますHEREEEE

サーブレットの起動時に何かをしたい場合 (つまり、loadOnStartupゼロ以上の値を持つ要素0)、init メソッドまたはサーブレットのコンストラクターにコードを配置する必要があります。

@Override
public void init() throws ServletException {
    System.out.println("HEREEEE");
}

リスナーを使用してアプリケーション スコープ( 内)でリソースを開始する方が便利な場合がありますServletContext

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class InitializeListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("On start web app");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("On shutdown web app");
    }

}

例については、 Share variables between JAX-RS requestsという質問に対する私の回答を参照してください。

于 2013-09-15T04:28:36.420 に答える
6
@WebServlet(name="InitializeResources", urlPatterns="/initializeResources", loadOnStartup=1)

urlPatterns を使用して、Web コンテナがサーブレット パスを確実に見つけられるようにします。

于 2015-09-09T11:32:19.657 に答える
1

サーブレットに対して が指定されている場合loadOnStartup、コンテナはサーブレットのインスタンスをロードして事前インスタンス化するだけで、来る可能性のある GET/POST リクエストを処理する準備が整います。実際のクライアント要求がまだ処理のために来ていないため、これ自体では発生したり、発生しdoGet()たりすることはありません。doPost()それで、その用途は何ですか?

まあ、loadOnStartup通常、重い初期化コードを持つサーブレットに使用されます。たとえば、JNDI 呼び出しを行ってリソースを取得したり、データベース呼び出しを行ってローカル データ構造にバックエンド値を設定したりできます。最初のクライアント リクエストがない場合、loadOnStartupこの余分な初期化が原因で非常に遅くなる可能性があるため、事前にインスタンス化することは理にかなっています。

ここで、カスタム初期化コード (JNDI、JDBC) はオーバーライドされたGenericServlet#init()メソッドに入ります。このメソッドは、サーブレット コンテナーによって呼び出され、サーブレットがサービスを開始することをサーブレットに示します。

于 2013-09-15T05:14:01.197 に答える