
サーブレット&JSPの基本|サーブレットの基本と作り方
ブラウザから届いたリクエストをJavaで処理し、変化するWebページを作る第一歩を踏み出そう
サーブレットは、Javaを使ってWebアプリケーションの処理を作るための重要な技術です。
これまでに作成したHTMLファイルは、あらかじめ記述された内容をそのままブラウザへ表示するものでした。誰がアクセスしても、基本的には同じ内容が表示されます。
一方、サーブレットでは、ブラウザから届いたリクエストをJavaプログラムで処理できます。アクセスした時刻を表示したり、入力された名前に応じてメッセージを変えたり、データベースから取得した情報を一覧表示したりすることが可能です。
サーブレットには、専用のクラスやメソッド、リクエストとレスポンスを扱うための仕組みがあります。最初は見慣れない記述が多く、少し難しそうに感じるかもしれません。
しかし、基本となる形はほぼ決まっています。まずはサーブレットクラスを作成し、ブラウザから実行する流れを繰り返しながら、少しずつ役割を理解していきましょう。
サーブレットとは
サーブレットは、Javaでサーバー側の処理を作るための仕組みです。正式にはJakarta Servletと呼ばれます。
サーバー側で動くプログラムは、サーバーサイドプログラムとも呼ばれます。サーブレットクラスは、Apache Tomcatなどのアプリケーションサーバー上で実行されます。
通常のJavaプログラムでは、mainメソッドから処理が始まります。一方、サーブレットは、ブラウザからリクエストが届いたタイミングでTomcatによって呼び出されます。
サーブレットが実行される基本的な流れは、次のとおりです。
| 順番 | 処理内容 |
|---|---|
| 1 | ブラウザからTomcatへリクエストを送る |
| 2 | TomcatがURLに対応するサーブレットを探す |
| 3 | Tomcatがサーブレットクラスのメソッドを呼び出す |
| 4 | サーブレットがJavaで必要な処理を行う |
| 5 | サーブレットがレスポンスとして返す内容を作る |
| 6 | Tomcatが処理結果をブラウザへ返す |
| 7 | ブラウザが受け取った内容を画面に表示する |
サーブレットは、自分から勝手に動き始めるわけではありません。ブラウザなどのクライアントからリクエストを受け取ったTomcatが、適切なサーブレットを呼び出します。
この関係を理解することが、サーブレット学習の第一歩です。
静的なHTMLとサーブレットの違い
HTMLファイルとサーブレットは、どちらも最終的にはブラウザにWebページを表示できます。しかし、ページの内容が作られる方法には大きな違いがあります。
| 比較項目 | HTMLファイル | サーブレット |
|---|---|---|
| 内容の作られ方 | あらかじめファイルに書かれている | リクエストを受けたあとにJavaで作る |
| 実行する処理 | 基本的にない | 条件分岐、繰り返し、計算などを実行できる |
| 表示内容 | 基本的に固定 | リクエストやデータによって変えられる |
| データベース連携 | HTML単体ではできない | Javaの処理を通して実現できる |
| 実行環境 | ブラウザで直接開くこともできる | Tomcatなどのサーバーが必要 |
たとえば、現在時刻を表示するページをHTMLだけで作成した場合、ファイルに書かれた時刻は自動的には変化しません。
サーブレットでは、リクエストを受け取った時点の時刻をJavaで取得して出力できます。そのため、ページを再読み込みするたびに異なる結果を表示できます。
このように、アクセスした状況に応じて内容が変化するページを動的なWebページと呼びます。
図1:サーブレットが実行される基本的な流れ

この図から分かること
ブラウザは、サーブレットクラスを直接実行するわけではありません。ブラウザから送られたリクエストは、最初にTomcatが受け取ります。
TomcatはリクエストされたURLを確認し、対応するサーブレットクラスを実行します。サーブレットが作成した処理結果も、Tomcatを経由してブラウザへ返されます。
つまり、Tomcatはブラウザとサーブレットの間に立ち、リクエストの受付、サーブレットの実行、レスポンスの返却を管理しています。
サーブレットはJavaで処理を担当し、TomcatはWebアプリケーションの実行環境を担当していると考えると分かりやすいでしょう。
サーブレットクラスの基本形
サーブレットはJavaのクラスとして作成します。ただし、通常のJavaクラスとは異なり、サーブレットとして動作するための決まった書き方があります。
基本的なルールは、次の3つです。
| ルール | 内容 |
|---|---|
| ルール1 | サーブレットに必要なクラスをインポートする |
| ルール2 | HttpServletクラスを継承する |
| ルール3 | doGetメソッドをオーバーライドする |
これらは、サーブレットクラスを作成するための基本的な形です。
すべてを最初から暗記する必要はありません。Eclipseのサーブレット作成機能を利用すると、必要なimport文やメソッドの形が自動的に作成されます。
最初の段階では、それぞれの記述が何のためにあるのかを理解することを目標にしましょう。
サーブレットクラスの基本形の例
ファイル名:WelcomeServlet.java
import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public class WelcomeServlet extends HttpServlet {
@Override
protected void doGet(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
}
}このサーブレットは、まだブラウザへ内容を出力する処理を持っていません。サーブレットとして動作するための基本的な骨組みだけを定義しています。
今後、このdoGetメソッドの中に、計算、条件分岐、データの取得、HTMLの出力などの処理を記述していきます。
ルール1:必要なクラスをインポートする
サーブレットの機能は、主にjakarta.servletパッケージとjakarta.servlet.httpパッケージに用意されています。
WelcomeServlet.javaでは、次のクラスをインポートしています。
| クラス | 主な役割 |
|---|---|
| IOException | 入出力処理で発生する可能性がある例外を表す |
| ServletException | サーブレットの処理で発生する可能性がある例外を表す |
| HttpServlet | HTTPに対応したサーブレットの基本機能を提供する |
| HttpServletRequest | ブラウザから届いたリクエストを扱う |
| HttpServletResponse | ブラウザへ返すレスポンスを扱う |
Javaでは、別のパッケージにあるクラスを短い名前で使用するためにimport文を記述します。
たとえば、HttpServletの正式な名前はjakarta.servlet.http.HttpServletです。import文を書いておくことで、クラス定義ではHttpServletと短く記述できます。
サーブレットを作成するときに必要になるクラスは、Eclipseが自動的にインポートしてくれることがあります。赤い波線などのエラー表示が出た場合も、Eclipseの修正機能を使ってimport文を追加できます。
javax.servletではなくjakarta.servletを使用する
古いサーブレットの教材やWebサイトでは、次のようなパッケージ名が使われていることがあります。
javax.servlet
javax.servlet.http
Tomcat 10以降の環境では、基本的に次のパッケージ名を使用します。
jakarta.servlet
jakarta.servlet.http
今回使用するTomcat 11環境でも、jakarta.servletから始まるクラスを使用します。
| 環境 | 主に使用するパッケージ |
|---|---|
| 古いTomcat環境 | javax.servlet |
| Tomcat 10以降 | jakarta.servlet |
| 今回のTomcat 11環境 | jakarta.servlet |
javax.servletとjakarta.servletを混在させると、クラスを正しく認識できず、コンパイルエラーや実行時エラーの原因になります。
サンプルを参考にするときは、パッケージ名が現在の学習環境に合っているかを確認しましょう。
ルール2:HttpServletクラスを継承する
サーブレットクラスは、HttpServletクラスを継承して作成します。
WelcomeServletでは、次の部分が継承を表しています。
public class WelcomeServlet extends HttpServlet
extends HttpServletと記述することで、WelcomeServletはHttpServletが持っているサーブレット向けの機能を引き継ぎます。
HttpServletには、HTTP通信を扱うための基本的な仕組みが用意されています。ブラウザから届いたリクエストの種類を判断し、対応するメソッドを呼び出す機能なども含まれています。
もしHttpServletを継承しなければ、通常のJavaクラスとして扱われます。TomcatがHTTPリクエストに対応するサーブレットとして実行することはできません。
継承する理由
| 継承しない場合 | HttpServletを継承した場合 |
|---|---|
| 通常のJavaクラスになる | サーブレットの基本機能を利用できる |
| HTTPリクエストを処理する仕組みを自分で用意する必要がある | doGetやdoPostなどを利用できる |
| Tomcatからサーブレットとして扱われない | Tomcat上で実行できる |
HttpServletは、サーブレットを作るための土台となるクラスです。
すべての機能を一から作るのではなく、すでに用意されているHttpServletを継承し、必要な部分だけを書き換えることでサーブレットを作成します。
ルール3:doGetメソッドをオーバーライドする
doGetメソッドは、主にブラウザからGET形式のリクエストが届いたときに実行されるメソッドです。
たとえば、ブラウザのアドレスバーへURLを入力してアクセスした場合は、通常GETリクエストが送られます。そのリクエストを受け取ったTomcatが、対象となるサーブレットのdoGetメソッドを呼び出します。
doGetはHttpServletクラスに用意されているメソッドです。サーブレットクラス側で同じ形のメソッドを定義し、独自の処理に置き換えます。この仕組みをオーバーライドと呼びます。
doGetメソッドの構成
| 記述 | 役割 |
|---|---|
| protected | 同じパッケージや継承したクラスから利用できるようにする |
| void | 戻り値を返さないことを表す |
| doGet | GETリクエストに対応するメソッド名 |
| HttpServletRequest request | リクエストを扱う引数 |
| HttpServletResponse response | レスポンスを扱う引数 |
| throws ServletException, IOException | 処理中に発生する可能性がある例外を表す |
doGetの宣言は長く見えますが、基本的な形は決まっています。最初のうちは、この部分を無理に変更しないようにしましょう。
引数の型や並び、例外の宣言を誤ると、HttpServletのdoGetを正しくオーバーライドできません。
doGetとmainメソッドの違い
doGetは、サーブレットの処理が始まる場所という点では、通常のJavaプログラムにおけるmainメソッドに近い役割を持っています。
ただし、doGetとmainメソッドは同じものではありません。
| 比較項目 | mainメソッド | doGetメソッド |
|---|---|---|
| 呼び出すもの | Javaの実行環境 | Tomcat |
| 実行されるタイミング | Javaプログラムを開始したとき | GETリクエストが届いたとき |
| 主な用途 | 一般的なJavaアプリケーションの開始地点 | Webリクエストの処理 |
| 受け取る情報 | String配列など | リクエストとレスポンス |
| 実行環境 | Java仮想マシン | Tomcatなどのアプリケーションサーバー |
サーブレットでは、開発者がdoGetを直接呼び出すのではありません。ブラウザからリクエストが送られると、TomcatがdoGetを呼び出します。
そのため、サーブレットクラスにmainメソッドを作成する必要はありません。
@Overrideが表していること
doGetメソッドの上にある@Overrideは、このメソッドがスーパークラスのメソッドをオーバーライドしていることを示すアノテーションです。
@Overrideを付けることで、メソッド名や引数の型を間違えた場合に、EclipseやJavaコンパイラが誤りを見つけやすくなります。
たとえば、doGetを誤ってdogetと記述した場合、Javaでは大文字と小文字が区別されるため、別のメソッドとして扱われます。
@Overrideがあれば、正しくオーバーライドできていないことをエラーとして知らせてもらえます。
必ずしもサーブレットを動かすための命令ではありませんが、安全にプログラムを作るために付けておくとよいでしょう。
図2:サーブレットクラスを構成する3つのルール

この図から分かること
サーブレットクラスは、通常のJavaクラスを自由に書くだけでは作れません。
必要なクラスをインポートし、HttpServletを継承し、GETリクエストを受け取るdoGetメソッドをオーバーライドするという基本ルールがあります。
これらの記述は、サーブレットをTomcat上で正しく動作させるための土台です。
ただし、すべてを一文字ずつ暗記する必要はありません。Eclipseを使ってサーブレットクラスを作成すると、基本形の多くが自動的に記述されます。
まずは、import文、extends HttpServlet、doGetの3か所を見分けられるようになりましょう。
HttpServletRequestとは
doGetメソッドの1つ目の引数には、HttpServletRequest型のrequestが渡されます。
HttpServletRequestは、ブラウザからTomcatへ送られてきたリクエストに関する情報と機能を持つオブジェクトです。
リクエストには、単にどのURLへアクセスしたかという情報だけでなく、フォームに入力された値、リクエスト方法、ブラウザに関する情報などが含まれることがあります。
HttpServletRequestから扱える主な情報
| 情報 | 内容 |
|---|---|
| リクエストパラメータ | フォームやURLから送信された値 |
| リクエスト方法 | GETやPOSTなど |
| リクエストURL | アクセスされたURL |
| ヘッダー | ブラウザの種類や受け取り可能なデータ形式など |
| Cookie | ブラウザから送られたCookie情報 |
| セッション | 同じ利用者の操作を継続して管理するための情報 |
たとえば、名前を入力するフォームからnameという値が送られてきた場合、requestを使ってその値を取得できます。
取得した内容を条件分岐や計算に使うことで、利用者ごとに異なる結果を作れます。
HttpServletRequestは、ブラウザから届いた情報を受け取るための道具と考えると分かりやすいでしょう。
HttpServletResponseとは
doGetメソッドの2つ目の引数には、HttpServletResponse型のresponseが渡されます。
HttpServletResponseは、サーブレットからブラウザへ返すレスポンスを設定するためのオブジェクトです。
サーブレットで処理した結果は、Javaの変数に入れただけではブラウザに表示されません。responseを使って、どのような内容を返すのかを設定する必要があります。
HttpServletResponseで行う主な処理
| 処理 | 内容 |
|---|---|
| コンテンツタイプの指定 | HTMLやJSONなど、返すデータの種類を指定する |
| 文字コードの指定 | 日本語を正しく表示するための文字コードを指定する |
| 本文の出力 | HTMLや文字列をブラウザへ送る |
| ステータスコードの設定 | 200、404などのHTTPステータスを設定する |
| リダイレクト | ブラウザを別のURLへ移動させる |
| ヘッダーの設定 | レスポンスに追加情報を設定する |
responseを使うと、HTMLを出力するだけでなく、別のページへの移動やエラー情報の返却なども行えます。
HttpServletResponseは、ブラウザへ処理結果を送り返すための道具です。
requestとresponseはTomcatが用意する
HttpServletRequestとHttpServletResponseは、サーブレットクラスの中でnewを使って作成するものではありません。
ブラウザからリクエストが届くと、Tomcatがリクエストを表すオブジェクトとレスポンスを表すオブジェクトを準備します。
そのあと、Tomcatは次のような形でdoGetを呼び出します。
doGet(request, response)
サーブレットは、Tomcatから渡されたrequestを使ってリクエストの内容を確認し、responseを使って返却する内容を作ります。
| オブジェクト | 用意するもの | サーブレットでの役割 |
|---|---|---|
| HttpServletRequest | Tomcat | ブラウザから届いた情報を読み取る |
| HttpServletResponse | Tomcat | ブラウザへ返す内容を設定する |
サーブレット開発では、この2つのオブジェクトを何度も使用します。
フォーム入力の取得、ログイン状態の確認、画面への出力、別ページへの移動など、Webアプリケーション特有の多くの処理がrequestとresponseを通して行われます。
requestとresponseの名前は変更できる
HttpServletRequest requestのrequestと、HttpServletResponse responseのresponseは変数名です。
Javaの命名規則に従っていれば、別の名前に変更することもできます。しかし、通常はrequestとresponseという名前が広く使用されています。
| 型 | 一般的な変数名 |
|---|---|
| HttpServletRequest | request |
| HttpServletResponse | response |
教材やサンプルコードでも、この名前がよく使われます。特別な理由がなければ、requestとresponseのまま使用すると分かりやすいでしょう。
重要なのは変数名ではなく、型です。
HttpServletRequest型のオブジェクトがリクエストを扱い、HttpServletResponse型のオブジェクトがレスポンスを扱います。
図3:HttpServletRequestとHttpServletResponseの役割

この図から分かること
HttpServletRequestとHttpServletResponseは、ブラウザとサーブレットをつなぐ重要なオブジェクトです。
HttpServletRequestには、ブラウザから届いた入力値やリクエスト方法などの情報が入っています。サーブレットはrequestを使って、利用者が何を要求しているのかを読み取ります。
HttpServletResponseは、サーブレットがブラウザへ返す内容を作るために使います。HTML、文字コード、ステータスコードなどを設定し、処理結果をレスポンスとして送り返します。
Tomcatは、ブラウザからリクエストを受け取ると、この2つのオブジェクトを準備してdoGetへ渡します。サーブレットはrequestから情報を受け取り、responseを使って結果を返すという流れで処理を進めます。
サーブレットクラスを読むときの順番
初めてサーブレットクラスを見ると、import文や長いdoGetの宣言に圧倒されるかもしれません。
その場合は、すべてを一度に理解しようとせず、次の順番で確認すると読みやすくなります。
| 確認する順番 | 見る部分 | 確認内容 |
|---|---|---|
| 1 | class宣言 | HttpServletを継承しているか |
| 2 | doGet | GETリクエストを処理するメソッドがあるか |
| 3 | request | ブラウザから届いた情報を扱う引数 |
| 4 | response | ブラウザへ返す情報を扱う引数 |
| 5 | import文 | 使用しているクラスが読み込まれているか |
最初からimport文を一行ずつ暗記する必要はありません。
まず、サーブレットはHttpServletを継承し、doGetの中に処理を書くという大きな構造をつかみます。そのあと、requestとresponseが何を担当しているのかを確認すると理解しやすくなります。
Eclipseを使って基本形を作成する
実際の開発では、サーブレットクラスの基本形を毎回すべて手入力する必要はありません。
Eclipseにはサーブレットを新規作成する機能があり、クラス名やパッケージ名などを指定すると、必要な基本コードを自動的に生成できます。
自動生成によって、次のような入力ミスを減らせます。
| 入力ミス | 起こり得る問題 |
|---|---|
| HttpServletの綴りを間違える | クラスを継承できない |
| doGetの大文字と小文字を間違える | オーバーライドできない |
| 引数の型を間違える | 正しいdoGetとして認識されない |
| import文が不足する | クラスを認識できない |
| throwsの記述が不足する | コンパイルエラーになる場合がある |
Eclipseが生成したコードは、単なる便利なひな型ではありません。サーブレットとして動作するための基本ルールに従ったコードです。
自動生成された部分をすぐに削除せず、それぞれがどの役割を持っているのか確認しながら処理を追加していきましょう。
サーブレットクラスの作成手順
サーブレットクラスを作成する動的Webプロジェクトを選択して右クリック →「新規」→「その他」を選択します。

「Web」を展開して →「サーブレット」を選択し、「次へ」をクリックします。

サーブレットクラスが所属するパッケージに「servlet」、クラス名に「WelcomeServlet」と入力、「次へ」をクリックします。

サーブレットの名前やURL マッピングといったサーブレットクラスに関する情報を設定します。デフォルトでは、サーブレットの名前に「クラス名」、URL マッピングは「/クラス名」が設定されています。「次へ」をクリックします。

「スーパークラスからのコンストラクター」のチェックを外し、「継承された抽象メソッド」の中から必要なメソッド、ここでは、「doGet」メッソドだけにチェックを入れて、「完了」をクリックします。

「src/main/java」内にサーブレットクラスが作成されます。

エディタには作成したサーブレットクラスの内容が表示されます。前画面でチェックを入れたメソッドが自動で作成されます。

サーブレット学習で最初に意識したいこと
サーブレットの学習を始めたばかりの段階では、すべてのクラスやメソッドを細かく覚えようとしなくても大丈夫です。
まずは、次の関係を理解することが大切です。
ブラウザがリクエストを送る
Tomcatがリクエストを受け取る
TomcatがサーブレットのdoGetを呼び出す
サーブレットがrequestを使って情報を受け取る
サーブレットがresponseを使って結果を返す
ブラウザに実行結果が表示される
この流れを理解したうえで、実際にサーブレットを作成し、ブラウザから繰り返し実行していくと、それぞれの記述の意味が少しずつ見えてきます。
特にHttpServletRequestとHttpServletResponseは、今後のサーブレット開発で中心となる存在です。フォームから送られた値の取得、ログイン状態の管理、画面の切り替え、レスポンスの出力など、多くの処理で使用します。
まずはサーブレットクラスの基本形と、requestで受け取り、responseで返すという考え方をしっかり身につけておきましょう。
