簡単なサーブレットを作成してみよう
3.1 簡単なサーブレットを作成してみよう
本節では簡単なサーブレットを作成し、サーブレットの構造や動きについて学習します。
3.1.1 サーブレットの作成から実行までの流れ
Eclipseの動的Webプロジェクトでサーブレットを作成して実行するまでの流れは、以下のようになります。
① Javaファイルの作成
「src/main/java」フォルダ内にJavaファイルを作成し、ソースコードを記述する。
② Webアプリケーションの実行
作成したWebアプリケーションのURLにアクセスする。
それぞれの手順の詳細は、次の項以降で順番に学習します。
3.1.2 Hello Servlet!プログラムを作ってみよう
まずは、図3.1.1のように、Webブラウザに「Hello Servlet!」と表示する簡単なサーブレットを作成し、プログラミングの手順を学習しましょう。
実行結果
以下の手順でHello Servlet!プログラムを作成していきます。各Stepの指示に従って進めてください。
Step1:サーブレットファイルの準備
Step2:サーブレットファイルへの記述
Step3:プログラムの実行
このHello Servlet!プログラムは、以下のような構成で作成します。
アプリケーション構成
Step1:サーブレットファイルの準備
サーブレットとなるJavaファイルは「src/main/java」フォルダ内に配置します。通常のJavaファイルの作成方法とは少し異なる点がありますので、以下の手順を参考にして、「HelloServlet.java」ファイルを作成してください。
① 新規Javaクラス作成ウィザードの起動
「web_basic」プロジェクトを右クリック > 新規 > クラス を選択すると作成ウィザードが起動します。このウィザードの起動は通常のJavaクラスの作成と変わりません。
図 3.1.1: 新規Javaクラス作成ウィザードの起動
② 新規Javaクラスの作成
表示された新規Javaクラス作成ウィザードの各項目に、次の①から③の設定を行い、「完了」ボタンを押下します。パッケージ・エクスプローラ内にJavaファイルが増えれば作成成功です。
① パッケージ :ch03
② ファイル名 :HelloServlet
③ スーパークラス :jakarta.servlet.http.HttpServlet
通常のJavaクラスの作成と異なる点は、スーパークラスの指定と、main()メソッドの作成の有無です。
通常のJavaクラスではスーパークラスを変更せずデフォルトのままで作成していましたが、サーブレットの場合は、スーパークラスに「jakarta.servlet.http.HttpServlet」を指定します。また、サーブレットにはmain()メソッドが必要ないため、メソッド・スタブの選択項目は特に変更しません。
図 3.1.2: HelloServlet.javaファイルの作成
これでJavaファイルの作成は完了です。次のStepでは作成したJavaファイルにソースコードを記述します。
Step2:サーブレットファイルへの記述
① ソースコードの記述
Step1で作成した「HelloServlet.java」ファイルに以下のソースコードを記述します。
package ch03; import jakarta.servlet.http.HttpServlet; public class HelloServlet extends HttpServlet { }こちらのソースコードに対して、必要なクラスのインポートと、@WebServletアノテーション、doGet()メソッドを追加します。
➢ HelloServlet.java(書き換え後)
package ch03; import java.io.IOException; import java.io.PrintWriter; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @WebServlet("/HelloServlet") public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println("Hello Servlet!"); } }
図 3.1.3: HelloServlet.javaプログラムの記述
② ファイルの保存
画面左上のフロッピーのアイコンをクリックして、ソースコードを保存します。2章でHTMLのプログラムを作成した際にも説明しましたが、ソースコードのタブ部分に「*(アスタリスク)」がついているときは、そのファイルがまだ保存されていない状態であることを表しています。
図 3.1.4:Javaファイルの保存
Step3:WebブラウザからJavaファイルの内容を確認
「実行」ボタンからTomcatを起動しWebブラウザで以下のURLにアクセスします。Tomcatの起動方法を忘れてしまった場合は、2.2.2項を参照してください。
また、実行する際に再起動をするか確認する画面が表示されますが、これは必ず再起動を選んでください。
サーブレットを作成・修正した時は、Tomcatを再起動しないとWebサイトの内容に反映されないからです。
http://localhost:8080/web_basic/HelloServlet
図 3.1.5: HelloServletプログラムの実行画面
HTMLのファイルを指定するときは、フォルダ名などをすべて含んだURLを指定していましたが、サーブレットを実行する場合は、指定するURLが異なります。指定するURLの仕組みについては3.1.3項の@WebServletアノテーションの説明の際に詳しく解説します。
もし、都度Tomcatの再起動を選択することが面倒な方については、一度、プロジェクト・エクスプローラーの一番上にあるServersフォルダ内にある「Tomcat10_Java17-config」フォルダを開き、server.xmlを開きます。
一度でもそのプロジェクトでTomcatサーバを起動していれば、source属性の末尾がそのプロジェクト名になっているContextタグがあります。そのタグの中に「reloadable=”true”」を追記すると、自動的に再起動するようになります。
図 3.1.6: server.xmlの記述
3.1.3 helloServletの内容
「HelloServlet.java」ファイルの内容は以下のようになっています。
package ch03; import java.io.IOException; import java.io.PrintWriter; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @WebServlet("/HelloServlet") public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println("Hello Servlet!"); } }
このファイルは次の4つの条件をもとに作成されます。
①HttpServletクラスを継承
サーブレットは「jakarta.servlet.http.HttpServlet」クラスを継承して作成します。Javaのクラスをサーブレットとして作成する場合は、必ずこのクラスを継承する必要があります。
②doGet()メソッドをオーバーライド
doGet()メソッドは、ブラウザからサーブレットを呼び出したときや、GET送信されたアクセスの場合に実行されるメソッドです。GET送信されたアクセスについては第8章で説明しますので、ここでは、通常のJavaプログラムで記述していたmain()メソッドの代わりのように動くメソッドと考えてください。
なお、継承したHttpServletクラスからオーバーライドするメソッドなので、メソッド名や引数などは正確に記述する必要があります。
メソッドの引数は「jakarta.servlet.http.HttpServletRequest」と「jakarta.servlet.http.HttpServletResponse」の2つで、Webブラウザからのリクエスト(要求)とWebブラウザへのレスポンス(結果)を表すオブジェクトです。
doGet()メソッドで発生する例外は、レスポンスの書き込みを行う際に発生する「IOException」と、その他の例外として発生する「ServletException」の2つで、throwsを利用してスローしています。
③doGet()メソッド内に処理を記述
サーブレットの処理はdoGet()メソッド内に記述します。
このプログラムでは、getWriter()メソッドを利用して、文字列出力用のPrintWriterクラスのオブジェクトを生成し、「Hello Servlet」のメッセージをHTMLに出力しています。
④@WebServletアノテーションで呼び出すURLパターンを定義
サーブレットを呼び出す際に指定するURLの定義に@WebServletアノテーションを使います。アノテーションというのはプログラムに注釈を付ける機能ですが、それを応用して、このサーブレットを呼び出すためにはどういうURLで呼び出すのかを設定することができます。配列を利用して複数のURLパターンから同じサーブレットを呼び出すこともできます。URLパターンを指定する値は「/」から始まることに注意してください。
web_basicプロジェクトでのURLパターンとブラウザで入力するURLの関係は、以下の図のようになります。
表 3.1.1: <url-pattern>の値とURLの関係