はじめに
この記事では、Tomcat の概要を整理します。
Tomcatとは
Tomcat は Java で書かれたWebアプリケーションを動かすためのサーブレットコンテナです。
サーブレットコンテナはWebブラウザからのリクエストを受け取り、Javaのプログラム(Servlet)を実行し、その結果をHTMLなどにしてブラウザに返す役割を担います。
Tomcat は「HTTP サーバー機能」と「Java コードを動かす実行環境」を1つにまとめて提供してくれます。だからこそ、Java で動的なWebサイト(ログイン機能のあるサイトやAPIなど)を作るときの土台としてよく使われます。
Servlet / JSP とは
Tomcat を理解するには、その上で動く「Servlet」と「JSP」を知っておく必要があります。これらは Java で動的なWebページを作るための仕組みです。
Servlet(サーブレット)
Servlet は、HTTP リクエストを受け取って処理し、レスポンスを返す Java のクラスです。Webのために書かれた Java プログラムです。
たとえば「/hello にアクセスされたら "Hello" という文字を返す」といった処理を、Javaのコードとして書きます。
JSP(JavaServer Pages)
JSP は、HTML の中に Java のコードを埋め込めるようにした仕組みです。PHPを触ったことがある方なら、感覚としては近いです。HTML が主体で、動的に変えたい部分だけ Java を書く、というスタイルに向いています。
ざっくり整理すると、こういう違いです。
| 仕組み | 主体 | 向いている用途 |
|---|---|---|
| Servlet | Javaコード | リクエストの処理、API、ロジック中心の部分 |
| JSP | HTML | 画面(ビュー)の生成 |
現在の実務では、JSP を直接書く機会はかなり減っています。Spring Boot のようなフレームワークや React 等のフロントエンドが画面を担当することが多いためです。ただ、Tomcat が Servlet/JSP を動かす土台であるという構造自体は今も変わっていません。
誕生の経緯
Tomcat は、1998年に誕生しました。当時 Sun Microsystems のソフトウェアアーキテクトだった James Duncan Davidson 氏が、Servlet の「リファレンス実装」(仕様を示すための見本となる実装)として開発したのが始まりです。
その後、このプロジェクトはオープンソース化され、Sun から Apache Software Foundation に寄贈されました。現在まで続く Apache プロジェクトの1つとなっています。
ちなみに、ビルドツールとして有名な「Apache Ant」は、このTomcatをオープンソースプロジェクトとして開発する過程で副産物として生まれたものです。
Tomcatが得意なこと
- 軽量でシンプル: 必要最低限の機能に絞られているため動作が軽く、起動も速いです。学習用途でも扱いやすい
- 導入が簡単: ダウンロードして展開し、スクリプトを実行すれば起動できる
- 利用実績: 20年以上にわたり世界中で使われており、情報も豊富
Tomcat が苦手なこと
- Jakarta EE のフル機能は持たない: Tomcat が実装しているのはServletやJSPなど一部の仕様だけで、EJB や JMS といったエンタープライズ向けのフル機能が必要な場合、Tomcat 単体では足りない
- 静的ファイルの大量配信は本職ではない: 画像や CSS など静的ファイルを高速・大量に配信する用途は、Nginx などの専用Webサーバーの方が得意
- 大規模な分散構成はそのままだと弱い: ロードバランシングやクラスタリングは、別のミドルウェアと組み合わせて構成するのが一般的
類似サービスとの比較
| 種類 | 代表例 | Tomcatとの違い |
|---|---|---|
| Webサーバー | Nginx、Apache HTTP Server | 静的配信やリバースプロキシが本職。Java実行環境は持たない |
| サーブレットコンテナ | Jetty、Undertow | Tomcatと同じ立ち位置。より軽量・組み込み向けという特徴 |
| アプリケーションサーバー | WildFly、WebLogic、GlassFish | Jakarta EEのフル機能を持つ高機能版。その分重い |
ハンズオン:Tomcat を起動して Servlet を動かす
ここからは実際に手を動かします。Tomcat 11を起動し、自作の Servlet をブラウザから呼び出すところまでやってみます。仕組みが見えるよう、フレームワークを使わず生の Servlet を書きます。
開発環境
開発環境は以下のとおりです。
- OS: Windows 11
- エディタ: Visual Studio Code
- JDK: 21
- Tomcat: 11.0.22
手順1. JDKのインストール確認
まず JDK が入っているか確認します。
java -version
openjdk version "21..." のように17以降のバージョンが表示されればOKです。インストールされていない場合は、Adoptium(Eclipse Temurin)などからJDK 21を入れておきます。
手順2. Tomcatのダウンロードと展開
Tomcat公式のダウンロードページ から「Core」の zip(apache-tomcat-11.0.22.zip)をダウンロードし、任意の場所に展開します。ここでは C:\tomcat に展開したものとします。
展開すると、中身はおおよそこういう構成になっています。
C:\tomcat
├── bin/ 起動・停止スクリプト
├── conf/ 設定ファイル(server.xml など)
├── lib/ Tomcat本体のライブラリ
├── logs/ ログ出力先
└── webapps/ Webアプリの配置場所
手順3. Tomcatを起動する
bin/ にある起動スクリプトを実行します。
cd C:\tomcat\bin
startup.bat
起動したら、ブラウザで http://localhost:8080 にアクセスします。Tomcatのトップページ(猫のロゴが描かれた画面)が表示されれば成功です。
停止するときは shutdown.bat を実行します。
shutdown.bat
手順4. Servlet を書く
自作の Servlet を書きます。/hello にアクセスされたら挨拶を返す、シンプルなものです。
まず、適当な作業フォルダに以下のファイルを作ります。
import java.io.IOException;
import java.io.PrintWriter;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
// "/hello" というURLにこのServletを紐づける
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
// GETリクエストが来たときに呼ばれるメソッド
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws IOException {
res.setContentType("text/html; charset=UTF-8");
PrintWriter out = res.getWriter();
out.println("<h1>Hello, Tomcat!</h1>");
}
}
ポイントは2つです。
-
@WebServlet("/hello")で、この Servlet をどのURLに割り当てるかを指定 -
doGetメソッドが、ブラウザからのGETリクエストに対する処理
import jakarta.servlet... の部分に注目してください。Tomcat 10以降は、パッケージ名が以前の javax.servlet から jakarta.servlet に変わっています。
手順5. コンパイルする
Servlet のコンパイルには、Tomcat が持つ Servlet API のライブラリ(servlet-api.jar)が必要です。-cp でそのパスを指定してコンパイルします。
javac -cp "C:\tomcat\lib\servlet-api.jar" -d classes src\HelloServlet.java
classes フォルダに HelloServlet.class が生成されればOKです。
手順6. Webアプリの形に配置する
Tomcat は決まったフォルダ構成でファイルを置く必要があります。webapps/ の下に、以下の構成を作ります。
C:\tomcat\webapps\myapp\
└── WEB-INF\
└── classes\
└── HelloServlet.class
myapp がアプリの名前(=URLの一部)になります。WEB-INF/classes/ の下にコンパイル済みの .class を置くのがルールです。手順5で作った HelloServlet.class をここにコピーします。
手順7. 動作確認
Tomcat を起動した状態で、ブラウザから次のURLにアクセスします。
http://localhost:8080/myapp/hello
URLの構造はこうなっています。
-
myapp…webapps/下に作ったフォルダ名 -
hello… Servletの@WebServlet("/hello")で指定したパス
画面に Hello, Tomcat! と表示されれば成功です。ブラウザのリクエストがTomcatに届き、自作のServletが実行され、その結果が返ってくる。冒頭の図で説明した流れが、実際に動いたことになります。
まとめ
Tomcat は Java のコードをWeb上で動かすための土台であり、軽量でシンプル、それでいて20年以上の実績がある手堅いソフトウェアだと思います。普段Spring Bootを使っていると意識しませんが、その内側ではTomcatが動いていることも多いです。
今回は生のServletを書いて仕組みを追いましたが、実際の開発ではSpring Bootのようなフレームワークが面倒な部分を引き受けてくれます。土台の仕組みを一度知っておくと、フレームワークが何をやってくれているのかが見えてくるので、遠回りなようで近道になると思います。