Servlet のサンプル

Revised: 16th/June/2002

ここでは、 HTML フォームから半径を受け取って、面積と円周を計算するサーブレットを作成してみます。必要な作業は次の通りです。

  1. ドキュメント・ルートの設定
  2. HTML フォームからの要求を受け取って、計算した結果を返すサーブレットの作成
  3. サーブレットの別名と URL パターンの設定
  4. HTML フォームの作成

ドキュメント・ルートの作成

ここでは、新しいドキュメント・ルートを作って、手順をおさらいしましょう。

C:\java\Circle をドキュメントルート /circle にマッピングしましょう。

Tomcat がインストールされたディレクトリの、conf ディレクトリのなかの server.xml をテキストエディタで開いて編集します。Tomcat インストール時に特に選ばなければ、 C:\Program Files\Apache Tomcat 4.0\conf

特に編集していなければ、202行目(全体の中ほど)に次のような記述があります。

        <!-- Tomcat Manager Context -->
        <Context path="/manager" docBase="manager"
         debug="0" privileged="true"></Context>

これに続いて、次の内容を挿入します。

        <!-- Circle Examples Context -->
        <Context path="/circle" docBase="C:/java/circle" debug="0"
                 reloadable="true" crossContext="true"/>

サーブレットの作成

ソースコード

クライアントから半径を受け取って、円の面積と円周を計算するためのサーブレットを作成します。 GET メソッド要求で半径がパラメタ名 hankei で送られてくることを想定すれば、例えば次のように書けます。

CircleCalcuration.java:

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

public class CircleCalcuration extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse res)
		throws ServletException, IOException {

		// 要求文字コードのセット
		req.setCharacterEncoding("Shift_JIS");
		// 応答文字コードのセット
		res.setContentType("text/html; charset=Shift_JIS");
		// 出力ストリームの取得
		PrintWriter out = res.getWriter();

		double radius = Double.parseDouble(req.getParameter("hankei"));
		double pi = Math.PI;
		double area = pi * radius * radius;
		double circum = 2.0 * pi * radius;

		// クライアント(ブラウザ)への出力
		out.println("<html lang=\"ja\">");
		out.println("<head><title>円の面積と円周</title>");
		out.println("</head><body>");
		out.println("<h1>円の面積と円周</h1>");
		out.println("<table border=\"1\">");
		out.println("<tr><th>半径</th><td>" + radius + "</td></tr>");
		out.println("<tr><th>円周</th><td>" + circum + "</td></tr>");
		out.println("<tr><th>面積</th><td>" + area + "</td></tr>");
		out.println("</table>");
		out.println("</body></html>");

		// 出力ストリームを閉じる
		out.close();

	}
}

POST 要求からも受け取りたい場合は、上記サンプルの doGet() メソッドのメソッド名だけ doPost() に書き換えたものを、 doGet() メソッドと重複して書けばよいのですが、全く同じコードが重複して現れるのはメンテナンスが悪くなります。処理は別のメソッドに分離した方が良いでしょう。そうすると、次のように書けます。

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

public class CircleCalcuration extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse res)
		throws ServletException, IOException {
		processRequest(req, res);
	}

	public void doPost(HttpServletRequest req, HttpServletResponse res)
		throws ServletException, IOException {
		processRequest(req, res);
	}

	private void processRequest(HttpServletRequest req, HttpServletResponse res)
		throws ServletException, IOException {

		// 要求文字コードのセット
		req.setCharacterEncoding("Shift_JIS");
		// 応答文字コードのセット
		res.setContentType("text/html; charset=Shift_JIS");
		// 出力ストリームの取得
		PrintWriter out = res.getWriter();

		double radius = Double.parseDouble(req.getParameter("hankei"));
		double pi = Math.PI;
		double area = pi * radius * radius;
		double circum = 2.0 * pi * radius;

		// クライアント(ブラウザ)への出力
		out.println("<html lang=\"ja\">");
		out.println("<head><title>円の面積と円周</title>");
		out.println("</head><body>");
		out.println("<h1>円の面積と円周</h1>");
		out.println("<table border=\"1\">");
		out.println("<tr><th>半径</th><td>" + radius + "</td></tr>");
		out.println("<tr><th>円周</th><td>" + circum + "</td></tr>");
		out.println("<tr><th>面積</th><td>" + area + "</td></tr>");
		out.println("</table>");
		out.println("</body></html>");

		// 出力ストリームを閉じる
		out.close();

	}
}

コンパイル

これをコンパイルして、クラスファイルをドキュメント・ルートのなかの WEB-INF/classes に保存します。

C:\>cd java\Circle\WEB-INF\classes

C:\java\Circle\WEB-INF\classes>javac -classpath "C:\Program Files\Apache Tomcat 4.0
\common\lib\servlet.jar" CircleCalcuration.java

C:\java\Circle\WEB-INF\classes>dir /B
CircleCalcuration.java
CircleCalcuration.class

C:\java\Circle\WEB-INF\classes>

サーブレット名と URL パターン

このサーブレットにアクセスするためのサーブレット名と URL パターンを設定しましょう。この作業は必須ではありませんが、実際に稼動するものの場合は、 Java コードはパッケージとして作成するでしょから、パッケージ階層を表に出してしまうフル・パスでのアクセスよりも、 URL パターンを設定するほうが普通です。

Web アプリケーションの設定は、そのコンテナで設定したドキュメント・ルートの WEB-INF/web.xml に記述します。

web.xml の最初限の具体例を挙げます:

<?xml version="1.0" encoding="Shift_JIS"?>

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
</web-app>

この文書型は web-app がルート要素になっているので、この中に設定を記述していきます。とりあえず、上のソースをテキスト・エディタにコピーして、ドキュメント・ルートの WEB-INF の中に web.xml として保存してください。

web.xml
図:web.xml

今作ったサーブレット C:\java\Circle\WEB-INF\classse\CircleCalcuration.class へは、何も設定しなければ http://localhost:8080/circle/servlet/CircleCalcuration で参照されます。これを、 http://localhost:8080/circle/calc でアクセスできるように別名、 URL パターンを設定します。上記の C:\java\Circle\WEB-INF\web.xml を次のように編集します。

<?xml version="1.0" encoding="Shift_JIS"?>

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
	<!-- サーブレット名 -->
	<servlet>
		<servlet-name>circle</servlet-name>
		<servlet-class>CircleCalcuration</servlet-class>
	</servlet>

	<!-- URL パターン -->
	<servlet-mapping>
		<servlet-name>circle</servlet-name>
		<url-pattern>/calc</url-pattern>
	</servlet-mapping>
</web-app>

HTML 文書の作成

以上作ってきたサーブレットにデータを送るための HTML 文書を作成します。これは POST メソッドと GET メソッドを受け取れるように作られていますが、ここでは POST メソッドで送ってみます。

form 要素の action 属性の値にサーブレットを指定しますが、 "http://〜" のようにフル URL で指定する事も出来ますが、ここではサーブレットと同じドキュメントルートから、サーバ内リソースのフルパスで指定することにします。特に、 web.xml で URL パターンを設定したので、そちらを使って指定してみます。

次の HTML ソースをドキュメント・ルートに circle.html で保存してください。

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" >
<head>
<meta http-equiv="content-type" content="text/html; charset=Shift_JIS" />
<title>円の面積と円周</title>
</head>
<body>
<h1>円の面積と円周</h1>

<form action="/circle/calc" method="POST">
<p>半径:
	<input type="text" name="hankei" size="10" />
	<input type="submit" value="計算" /></p>
</form>
</body>
</html>

上の例は文字コードが Shift_JIS の例です。他の文字コードで保存した場合は、適宜書き換えてください。

動作確認

上記の手順が全て上手くいったか確かめます。

Tomcat を停止して開始してください。

Tomcat は、他のサブシステムと同様に、開始時に構成ファイルを読み込んで反映します。稼動中に構成ファイルが変更されても、稼動中の Tomcat プロセスには影響を与えません。実際の稼動現場では、サーバの停止は避けるのですが、ここではアプリケーション開発環境と言うことで、再起動することにします。Windows での正式な停止/開始は、「スタート」メニューの「プログラム」から "Stop Tomcat", "Start Tomcat" をクリックすることです。コマンドラインからの実行方法は、これらのショート・カットアイコンを右クリックして、「プロパティ」を見てください。

Tomcat が開始したら、ブラウザのアドレス窓に次の URL を入力して、実行してください。これは、上の HTML フォームを要求する URL です。

http://localhost:8080/circle/circle.html
HTML フォームの表示例
図:HTML フォームの表示例

このフォームに半径を入力して、ボタンを押して実行します。

POST メソッドの実行例
図:POST メソッドの実行例

このサーブレットは GET メソッドからの要求も受け取れるように作れました。 URL に URL パラメタをつなげて要求してみます。ここでは、次の URL で要求してみます:

http://localhost:8080/circle/calc?hankei=1.0
GET メソッドの実行例
図:GET メソッドの実行例

HTTP プロトコルで実装されている GET メソッドは、指定したリソースをゲットするための要求であり、要求するリソースに対して指定するパラメタを URL につなげて送信し、環境変数にセットします。

一方、POST メソッドは、URL で指定した処理系に対して、パラメタを入力するものであり、標準入力への入力になります。



Copyright © 2002 SUGAI, Manabu. All Rights Reserved.
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送