サーブレット&JSPの基本|サーブレットの基本と作り方

ブラウザから届いたリクエストをJavaで処理し、変化するWebページを作る第一歩を踏み出そう

サーブレットは、Javaを使ってWebアプリケーションの処理を作るための重要な技術です。

これまでに作成したHTMLファイルは、あらかじめ記述された内容をそのままブラウザへ表示するものでした。誰がアクセスしても、基本的には同じ内容が表示されます。

一方、サーブレットでは、ブラウザから届いたリクエストをJavaプログラムで処理できます。アクセスした時刻を表示したり、入力された名前に応じてメッセージを変えたり、データベースから取得した情報を一覧表示したりすることが可能です。

サーブレットには、専用のクラスやメソッド、リクエストとレスポンスを扱うための仕組みがあります。最初は見慣れない記述が多く、少し難しそうに感じるかもしれません。

しかし、基本となる形はほぼ決まっています。まずはサーブレットクラスを作成し、ブラウザから実行する流れを繰り返しながら、少しずつ役割を理解していきましょう。

サーブレットとは

サーブレットは、Javaでサーバー側の処理を作るための仕組みです。正式にはJakarta Servletと呼ばれます。

サーバー側で動くプログラムは、サーバーサイドプログラムとも呼ばれます。サーブレットクラスは、Apache Tomcatなどのアプリケーションサーバー上で実行されます。

通常のJavaプログラムでは、mainメソッドから処理が始まります。一方、サーブレットは、ブラウザからリクエストが届いたタイミングでTomcatによって呼び出されます。

サーブレットが実行される基本的な流れは、次のとおりです。

順番処理内容
1ブラウザからTomcatへリクエストを送る
2TomcatがURLに対応するサーブレットを探す
3Tomcatがサーブレットクラスのメソッドを呼び出す
4サーブレットがJavaで必要な処理を行う
5サーブレットがレスポンスとして返す内容を作る
6Tomcatが処理結果をブラウザへ返す
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サーブレットに必要なクラスをインポートする
ルール2HttpServletクラスを継承する
ルール3doGetメソッドをオーバーライドする

これらは、サーブレットクラスを作成するための基本的な形です。

すべてを最初から暗記する必要はありません。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サーブレットの処理で発生する可能性がある例外を表す
HttpServletHTTPに対応したサーブレットの基本機能を提供する
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戻り値を返さないことを表す
doGetGETリクエストに対応するメソッド名
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を使って返却する内容を作ります。

オブジェクト用意するものサーブレットでの役割
HttpServletRequestTomcatブラウザから届いた情報を読み取る
HttpServletResponseTomcatブラウザへ返す内容を設定する

サーブレット開発では、この2つのオブジェクトを何度も使用します。

フォーム入力の取得、ログイン状態の確認、画面への出力、別ページへの移動など、Webアプリケーション特有の多くの処理がrequestとresponseを通して行われます。

requestとresponseの名前は変更できる

HttpServletRequest requestのrequestと、HttpServletResponse responseのresponseは変数名です。

Javaの命名規則に従っていれば、別の名前に変更することもできます。しかし、通常はrequestとresponseという名前が広く使用されています。

一般的な変数名
HttpServletRequestrequest
HttpServletResponseresponse

教材やサンプルコードでも、この名前がよく使われます。特別な理由がなければ、requestとresponseのまま使用すると分かりやすいでしょう。

重要なのは変数名ではなく、型です。

HttpServletRequest型のオブジェクトがリクエストを扱い、HttpServletResponse型のオブジェクトがレスポンスを扱います。

図3:HttpServletRequestとHttpServletResponseの役割

この図から分かること

HttpServletRequestとHttpServletResponseは、ブラウザとサーブレットをつなぐ重要なオブジェクトです。

HttpServletRequestには、ブラウザから届いた入力値やリクエスト方法などの情報が入っています。サーブレットはrequestを使って、利用者が何を要求しているのかを読み取ります。

HttpServletResponseは、サーブレットがブラウザへ返す内容を作るために使います。HTML、文字コード、ステータスコードなどを設定し、処理結果をレスポンスとして送り返します。

Tomcatは、ブラウザからリクエストを受け取ると、この2つのオブジェクトを準備してdoGetへ渡します。サーブレットはrequestから情報を受け取り、responseを使って結果を返すという流れで処理を進めます。

サーブレットクラスを読むときの順番

初めてサーブレットクラスを見ると、import文や長いdoGetの宣言に圧倒されるかもしれません。

その場合は、すべてを一度に理解しようとせず、次の順番で確認すると読みやすくなります。

確認する順番見る部分確認内容
1class宣言HttpServletを継承しているか
2doGetGETリクエストを処理するメソッドがあるか
3requestブラウザから届いた情報を扱う引数
4responseブラウザへ返す情報を扱う引数
5import文使用しているクラスが読み込まれているか

最初から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で返すという考え方をしっかり身につけておきましょう。