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 で指定した処理系に対して、パラメタを入力するものであり、標準入力への入力になります。
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||