Revised: 16th/June/2002
ここでは、 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 パターンを設定しましょう。この作業は必須ではありませんが、実際に稼動するものの場合は、 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 |
今作ったサーブレット 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 文書を作成します。これは 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 フォームの表示例 |
このフォームに半径を入力して、ボタンを押して実行します。
![]() |
| 図:POST メソッドの実行例 |
このサーブレットは GET メソッドからの要求も受け取れるように作れました。 URL に URL パラメタをつなげて要求してみます。ここでは、次の URL で要求してみます:
http://localhost:8080/circle/calc?hankei=1.0
![]() |
| 図:GET メソッドの実行例 |
HTTP プロトコルで実装されている GET メソッドは、指定したリソースをゲットするための要求であり、要求するリソースに対して指定するパラメタを URL につなげて送信し、環境変数にセットします。
一方、POST メソッドは、URL で指定した処理系に対して、パラメタを入力するものであり、標準入力への入力になります。