サーブレットと Tomcat

最終更新: 2025-07-31 23:33:22 +0800 +0800
tags: Java | Servlet | Tomcat
原文は英語で書かれています。あなたはAI翻訳版を読んでいます。

Jakarta Servlet API はサーバー側のリクエストとレスポンスのモデルを定義します。 Apache Tomcat はその API を実装し、Catalina サーブレットコンテナー、HTTP および AJP コネクター、セッション管理、デプロイメント、運用ツールを提供します。 Tomcat 11 は Jakarta Servlet 6.1 を実装し、Java 17 を必要とします。javax.servlet.* を import する古いアプリケーションは、jakarta.servlet.* 名前空間へ移行するか、 互換性のある古いコンテナーを使用する必要があります。

Web アプリケーションの構成 #

デプロイ可能な Web アプリケーションは、展開されたディレクトリまたは WAR アーカイブ にできます。

text
orders.war
|-- index.html
`-- WEB-INF
    |-- web.xml
    |-- classes/com/example/OrdersServlet.class
    `-- lib/orders-domain.jar

WEB-INF/ 以下のリソースはクライアントから直接アドレス指定できません。 WEB-INF/classes/ にはアプリケーションのクラスとリソースが含まれ、WEB-INF/lib/ には依存 JAR が含まれます。WEB-INF/web.xml はデプロイメント記述子です。Servlet 3.0 以降はアノテーションベースの登録と、ServletContainerInitializer による プログラム登録もサポートするため、デプロイメントで記述子のメタデータや順序が必要 でない限り web.xml は省略できます。

マッピングとリクエストディスパッチ #

サーブレットマッピングは URL パターンからサーブレットを選択します。完全一致 マッピングが最長パスマッピングより優先され、その後に拡張子マッピング、デフォルト の / マッピングが続きます。フィルターは対象の前後でリクエストとレスポンスを ラップでき、リスナーはコンテキスト、セッション、リクエストのライフサイクル イベントを監視します。

ディスパッチには個別の DispatcherType 値があります。

  • REQUEST は元のコンテナーディスパッチを表します。
  • FORWARD はクライアントとの往復なしで処理を移します。
  • INCLUDE は別のリソースの出力を挿入します。
  • ERROR は設定されたエラー処理を呼び出します。
  • ASYNC は非同期リクエストを継続します。
java
request.getRequestDispatcher("/WEB-INF/views/order.jsp")
       .forward(request, response);

リダイレクトは代わりに 3xx レスポンスを送り、その後クライアントが新しいリクエスト を開始します。通常のディスパッチでは、コネクターがリクエストを解析し、Catalina が 仮想ホストと Web コンテキストを選択し、フィルターチェーンが実行され、1 つの サーブレットインスタンスが呼び出しを処理します。コンテナーはサーブレットを並行 して呼び出すため、可変のインスタンスフィールドには同期が必要であり、できれば 排除するべきです。

セッションは Cookie または URL 書き換えによって識別されます。セッション属性は 並行リクエストからアクセスされる可能性があるため、スレッドに閉じたものとして 扱ってはなりません。非同期処理はリクエストスレッドを解放しますが、アプリケーション は AsyncContext を完了し、必要なセキュリティまたはロギングコンテキストを保持 しなければなりません。

Tomcat’s Container Model #

org.apache.catalina.startup.Bootstrap starts a standalone installation. catalina.home points to the shared Tomcat binaries, while catalina.base points to an instance’s configuration, logs, temporary files, work directory, and deployed applications. Multiple instances can thus share one installation.

Catalina composes these elements:

  1. A Server owns the Tomcat instance.
  2. A Service associates one or more Connectors with one Engine.
  3. An Engine routes requests to a Host.
  4. A Host contains one or more web application Contexts.
  5. A Wrapper represents an individual servlet.

Connectors own protocol processing and worker threads. Blocking servlet work occupies those threads, so connector limits, downstream timeouts, and application executor limits must form one capacity plan.

Class Loaders and Shutdown #

Tomcat separates bootstrap, system, common, and per-web-application class loaders. A web application sees its own WEB-INF/classes and WEB-INF/lib but not another application’s classes. Tomcat’s web loader uses local-first lookup for application classes, with mandatory delegation for Java, Jakarta Servlet, and container implementation APIs. Duplicate API JARs in WEB-INF/lib do not override container APIs and can cause linkage failures.

For graceful shutdown, stop accepting new traffic, allow in-flight work to finish within a deadline, and then stop the Server. Servlet context listeners and managed resources receive shutdown callbacks, but application-created executors and threads still need explicit termination. Session persistence depends on the configured manager and must not be assumed across a restart.

Primary References #

コメント

GitHub で閲覧・コメントする(投稿にはログインが必要です)