簡単なサーブレットを作成してみよう

3.1 簡単なサーブレットを作成してみよう

 本節では簡単なサーブレットを作成し、サーブレットの構造や動きについて学習します。

3.1.1 サーブレットの作成から実行までの流れ

 EclipseのTomcatプロジェクトでサーブレットを作成して実行するまでの流れは、以下のようになります。

① Javaファイルの作成
 「WEB-INF/src」フォルダ内にJavaファイルを作成し、ソースコードを記述する。

② web.xmlファイルの作成
 「WEB-INF」フォルダ内にweb.xmlファイルを作成し、サーブレットの情報を記述する。web.xmlファイルがすでに存在する場合は、既存のweb.xmlファイルにサーブレットの情報を追記する。

③ Webアプリケーションの実行
 作成したWebアプリケーションのURLにアクセスする。

 それぞれの手順の詳細は、次の項以降で順番に学習します。

3.1.2 Hello Servlet!プログラムを作ってみよう

 まずは、図3.1.1のように、Webブラウザに「Hello Servlet!」と表示する簡単なサーブレットを作成し、プログラミングの手順を学習しましょう。

実行結果

 以下の手順でHello Servlet!プログラムを作成していきます。各Stepの指示に従って進めてください。

 Step1:サーブレットファイルの準備
 Step2:サーブレットファイルへの記述
 Step3:web.xmlファイルの準備
 Step4:web.xmlファイルへの記述
 Step5:プログラムの実行

 このHello Servlet!プログラムは、以下のような構成で作成します。

アプリケーション構成

 Step1:サーブレットファイルの準備

 サーブレットとなるJavaファイルは「WEB-INF/src」フォルダ内に配置します。通常のJavaファイルの作成方法とは少し異なる点がありますので、以下の手順を参考にして、「HelloServlet.java」ファイルを作成してください。

① 新規Javaクラス作成ウィザードの起動
 「web_basic」プロジェクトを右クリック > 新規 > クラス を選択すると作成ウィザードが起動します。このウィザードの起動は通常のJavaクラスの作成と変わりません。

図 3.1.1: 新規Javaクラス作成ウィザードの起動

② 新規Javaクラスの作成
 表示された新規Javaクラス作成ウィザードの各項目に、次の①から③の設定を行い、「完了」ボタンを押下します。パッケージ・エクスプローラ内にJavaファイルが増えれば作成成功です。

① パッケージ :ch03
② ファイル名 :HelloServlet
③ スーパークラス :javax.servlet.http.HttpServlet

 通常のJavaクラスの作成と異なる点は、スーパークラスの指定と、main()メソッドの作成の有無です。
通常のJavaクラスではスーパークラスを変更せずデフォルトのままで作成していましたが、サーブレットの場合は、スーパークラスに「javax.servlet.http.HttpServlet」を指定します。また、サーブレットにはmain()メソッドが必要ないため、メソッド・スタブの選択項目は特に変更しません。

図 3.1.2: HelloServlet.javaファイルの作成

 これでJavaファイルの作成は完了です。次のStepでは作成したJavaファイルにソースコードを記述します。

 Step2:サーブレットファイルへの記述

① ソースコードの記述
 Step1で作成した「HelloServlet.java」ファイルに以下のソースコードを記述します。

➢ HelloServlet.java
package ch03;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloServlet extends HttpServlet {

	public 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.xmlファイルの準備

 サーブレットとなるJavaファイルが完成したら、web.xmlを作成します。web.xmlファイルの作成は2.2節で学習した「新規ファイル作成ウィザード」を利用します。

① 新規ファイル作成ウィザードの起動
 「WEB-INF」フォルダを右クリック > 新規 > ファイル を選択すると作成ウィザードが起動します。

図 3.1.5: 新規フォルダ作成画面の起動

② 新規ファイルの作成
 表示された新規フォルダ作成画面のフォルダ名に「web.xml」と入力し、「完了」ボタンを押下します。パッケージ・エクスプローラ内にweb.xmlファイルが増えていれば作成成功です。

図 3.1.6: 新規ファイルの作成

 Step4:web.xmlファイルへの記述

① XMLエディタの切り替え
 xmlファイルへの記述は、「XMLエディタ」で行います。このエディタは下部に「デザイン」と「ソース」という2つのタブが用意されていて、記述方法を選択することができます。初めて利用する場合は「デザイン」が開かれていますので、「ソース」タブを選択してコードを記述しましょう。

図 3.1.7: XMLエディタの入力方法の切り替え

② ソースコードの記述
 Step3で作成した「web.xml」ファイルに以下のソースコードを記述し、保存します。

➢ web.xml
<web-app>
	<servlet>
		<servlet-name>HelloServletMapping</servlet-name>
		<servlet-class>ch03.HelloServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>HelloServletMapping</servlet-name>
		<url-pattern>/HelloServlet</url-pattern>
	</servlet-mapping>
</web-app>

図 3.1.8: HelloServlet.javaプログラムの記述

 Step5:WebブラウザからJavaファイルの内容を確認

 Tomcatを起動しWebブラウザから以下のURLにアクセスします。Tomcatの起動方法を忘れてしまった場合は、2.2.2項を参照してください。

 http://localhost:8080/web_basic/HelloServlet

図 3.1.9: HelloServletプログラムの実行画面

 HTMLのファイルを指定するときは、フォルダ名などをすべて含んだURLを指定していましたが、サーブレットを実行する場合は、指定するURLが異なります。指定するURLの仕組みについては3.1.5項のweb.xmlファイルの説明の際に詳しく解説します。

3.1.3 helloServletの内容

 「HelloServlet.java」ファイルの内容は以下のようになっています。

package ch03;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException {

		PrintWriter out = response.getWriter();
		out.println("Hello Servlet!");

	}

}

 このファイルは次の3つの条件をもとに作成されます。

①HttpServletクラスを継承
 サーブレットは「javax.servlet.http.HttpServlet」クラスを継承して作成します。Javaのクラスをサーブレットとして作成する場合は、必ずこのクラスを継承する必要があります。
   7:public class HelloServlet extends HttpServlet {

②doGet()メソッドをオーバーライド
 doGet()メソッドは、ブラウザからサーブレットを呼び出したときや、GET送信されたアクセスの場合に実行されるメソッドです。GET送信されたアクセスについては第8章で説明しますので、ここでは、通常のJavaプログラムで記述していたmain()メソッドの代わりのように動くメソッドと考えてください。
 なお、継承したHttpServletクラスからオーバーライドするメソッドなので、メソッド名や引数などは正確に記述する必要があります。
 メソッドの引数は「javax.servlet.http.HttpServletRequest」と「javax.servlet.http.HttpServletResponse」の2つで、Webブラウザからのリクエスト(要求)とWebブラウザへのレスポンス(結果)を表すオブジェクトです。
 doGet()メソッドで発生する例外は、レスポンスの書き込みを行う際に発生する「IOException」と、その他の例外として発生する「ServletException」の2つで、throwsを利用してスローしています。
   9:public void doGet(HttpServletRequest request, HttpServletResponse response)
   10:throws ServletException, IOException {

③doGet()メソッド内に処理を記述
 サーブレットの処理はdoGet()メソッド内に記述します。
 このプログラムでは、getWriter()メソッドを利用して、文字列出力用のPrintWriterクラスのオブジェクトを生成し、「Hello Servlet」のメッセージをHTMLに出力しています。
   12:PrintWriter out = response.getWriter();
   13:out.println("Hello Servlet!");

Eclipseの警告「ホット・コード置換に失敗しました」

 Webアプリケーションでソースコードを修正すると、「ホットコード置換に失敗しました」というウィンドウが表示されることがあります。これは、すでに実行されている状態のときに、Webサーバ上で実行中のプログラムの更新を行うことができないために起こります。

 このメッセージが表示されたら、「継続」をクリックしてウィンドウを閉じても問題はありませんが、新しいソースコードがすでに表示されているWebページに反映されないので、Webページの更新を行う必要があります。注意しておきましょう。

3.1.4 web.xmlの内容

 web.xmlファイルは、Webアプリケーションの各種設定を行うことができるファイルです。作成したJavaプログラムはこのファイルにサーブレットとして定義する必要があります。
 ここでは、サーブレットを呼び出す際に指定するURLの定義部分について学習します。

 ブラウザからサーブレットが呼び出されるまでの流れは次の図のようになります。

図 3.1.10:Webブラウザからサーブレットが呼び出されるまでの流れ

①web.xmlからURLと一致する<url-pattern>を探す。
②<url-pattern>とあわせて記述された<servlet-name>を確認する。
③<servlet-name>が一致するサーブレットの定義を探す。
④<servlet-name>とあわせて定義された<servlet-class>を確認する。
⑤<servlet-class>と一致するJavaファイルを呼び出す。

 「HelloServlet」プログラムではweb.xmlファイルに以下のソースコードを記述しました。

 このxmlファイルは、HTMLファイルと同じように開始タグ<~>と閉じタグ</~>で要素を囲って記述します。
1行目と10行目の<web-app></web-app>はweb.xmlで最上位のタグで、web.xml内に1つのみ存在し、設定は全てこのタグの中に記述します。

 <web-app>の中では、大きく分けて以下の2つのブロックで処理が行われます。
  ・ <servlet>(2行目から5行目) :①サーブレットの登録
  ・ <servlet-mapping>(6行目から9行目) :②サーブレットのマッピング

①サーブレットの登録
 ここでは、作成したサーブレットをコンパイルして作られたclassファイルに対して任意の名前を設定し、web.xmlに登録します。子要素である<servlet-class>にサーブレットのクラス名を指定し、そのクラスを呼び出すための名前を<servlet-name>に記述します。

 HelloServletプログラムのweb.xmlで例えると、「ch03.HelloServlet.classはHelloServletMappingという名前である」と定義したことになります。なお、クラスを呼び出す名前は任意で指定することができますが、複数のサーブレットを登録する場合は、全て異なる名前にする必要があります。

図 3.1.11:<servlet>タブの値

②サーブレットのマッピング処理
 <servlet-mapping>では、特定のサーブレットを呼び出す際に指定するURLを定義しています。子要素である<servlet-name>にはサーブレットの登録時に定義したサーブレットの名前を記述し、<url-pattern>には<servlet-name>で指定したにサーブレットをブラウザから呼び出す際のURLパターンを記述します。

 この、特定のサーブレットを呼び出すためにURLを定義することを「サーブレットマッピング」と呼び、HelloServletのweb.xmlで例えると「/HelloServletとURLを指定された場合はHelloServletMappingという名前のクラスを呼び出す」と定義したことになります。

図 3.1.12:サーブレットマッピングの順序

 URLパターンには、WebアプリケーションのURL(コンテキストルート)の後ろに続くURLを記述します。指定する値は「/」から始まることに注意してください。

 web_basicプロジェクトでのURLパターンとブラウザで入力するURLの関係は、以下の図のようになります。

表 3.1.1: <url-pattern>の値とURLの関係

web.xmlの更新とTomcatの再起動

 Tomcat はweb.xmlからアプリケーションの各種設定を読み込んでいます。そのため、Tomcatが起動した状態でweb.xmlを更新した場合は、設定を再度読み込むためにTomcatの再起動が必要となります。


NEXT>> 3.2 サーブレットから別のJavaクラスを利用する