Revised: 22nd/June/2002
前節で見たとおり、 bean は、再利用可能性、独立性を高めたオブジェクトの設計規約であり、 Sun Microsystems から仕様書が公開されています。実際のコーディングは、他のクラスのコーディングと同じです。Web アプリケーションでの利用を見るに当たって、これもまたクラスの一つとしてコーディングするサーブレットからの利用を見てみましょう。
bean と、それを使うサーブレットを作ってみましょう。
http://localhost:8080/beans/ でアクセスできるように、新しいドキュメント・ルートを設定しましょう。ディレクトリは C:\java\BeanDemo にします。このディレクトリを、ドキュメントルートとしてサーバに登録するためには、サーバのインストールディレクトリにある、 conf/server.xml に記述します。
202 <!-- Tomcat Manager Context --> 203 <Context path="/manager" docBase="manager" 204 debug="0" privileged="true"></Context> 205 206 <!-- BeanDemo Examples Context --> 207 <Context path="/beans" docBase="C:/java/BeanDemo" debug="0" 208 reloadable="true" crossContext="true"/>
参考のために行番号を付しましたが、実際には記述しないでください。
サーブレットや bean などのクラスファイルは、ドキュメントルートの /WEB-INF/classes/ 以下に配置します。今回は、サーブレットは servlet パッケージ、bean は model パッケージとして作ります。従って、サーブレットは /WEB-INF/classes/servlet/、bean は /WEB-INF/classes/model/ の中に作成します。
![]() |
| 図:ディレクトリ配置 |
bean を C:\java\BeansDemo ディレクトリ内に作成します。今回作るのは、半径を受け取って、円の面積と円周を計算するためのものです。
bean 名は model.CircleCalcurationBean とします。
C:\java\BeansDemo\WEB-INF\classes\model\CircleCalcurationBean.java:
package model;
public class CircleCalcurationBean {
private double radius, area, circum;
public void calc(double hankei) {
radius = hankei;
area = Math.PI * radius * radius;
circum = 2.0 * Math.PI * radius;
}
public double getRadius() {
return radius;
}
public double getArea() {
return area;
}
public double getCircum() {
return circum;
}
}
C:\>cd C:\java\BeanDemo\WEB-INF\classes\mod el C:\java\BeanDemo\WEB-INF\classes\model>javac -classpath "C:\Program Files\Apa che Tomcat 4.0\common\lib\servlet.jar" CircleCalcurationBean.java C:\java\BeanDemo\WEB-INF\classes\model>
前の手順で作った bean を利用し、クライアントの要求/応答を制御するサーブレットを作ります。
サーブレットのクラス名は servlet.CircleCalcuration とします。また、別名を /circle/Servlet でアクセスできるようにマッピングします。
C:\java\BeansDemo\WEB-INF\classes\servlet\CircleCalcuration.java:
package servlet;
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 {
double radius = 0.0, area = 0.0, circum = 0.0;
// 要求文字コードのセット
req.setCharacterEncoding("Shift_JIS");
// 応答文字コードのセット
res.setContentType("text/html; charset=Shift_JIS");
// 出力ストリームの取得
PrintWriter out = res.getWriter();
// bean の利用
model.CircleCalcurationBean bean = new model.CircleCalcurationBean();
radius = Double.parseDouble(req.getParameter("hankei"));
bean.calc(radius);
area = bean.getArea();
circum = bean.getCircum();
// クライアント(ブラウザ)への出力
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();
}
}
パッケージを使っているので、 CLASSPATH をセットします。セット方法はOSよって異なります。Windows 2000 の場合は次の手順でセットします。「CLASSPATH のセット方法」を参照ください。
;C:\java\BeanDemo\WEB-INF\classes を追加する(冒頭のセミコロンは他の値との区切り文字)。;C:\Program Files\Apache Tomcat 4.0\common\lib\servlet.jar を追加する。これで、 model パッケージを探し出せるようになりました。
C:\>cd C:\java\BeanDemo\WEB-INF\classes\servlet C:\java\BeanDemo\WEB-INF\classes\servlet>javac CircleCalcuration.java C:\java\BeanDemo\WEB-INF\classes\servlet>
web.xmlサーブレット名と URL パタンをマッピングします。 /WEB-INF/web.xml に記述します。
C:\java\BeanDemo\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>CircleCalc</servlet-name>
<servlet-class>servlet.CircleCalcuration</servlet-class>
</servlet>
<!-- URL パターン -->
<servlet-mapping>
<servlet-name>CircleCalc</servlet-name>
<url-pattern>/Servlet</url-pattern>
</servlet-mapping>
</web-app>
これで、ドキュメントルートの /WEB-INF/classes/servlet/CircleCalcuration.class に対して、 http://localhost:8080/beans/Servlet でアクセスできるようになりました。
前の手順で作ったサーブレットへ半径を渡すための HTML 文書を作成します。ここでは、POST メソッドで渡します。
HTTP POST メソッドは、処理系に引数を渡すためのものでした。ここでは POST メソッドでサーブレットに半径を渡す HTML 文書を作ります。
C:\java\BeanDemo\ServletForm.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="/beans/Servlet" method="POST"> <p>半径: <input type="text" name="hankei" size="10" /> <input type="submit" value="計算" /></p> </form> </body> </html>
以上で Web アプリケーションが完成したので、ここで稼動を確認しましょう。
http://localhost:8080/beans/ServletFormindex.html を入力して実行![]() |
| 図:入力フォームの表示例 |
![]() |
| 図:結果 |
このサーブレットは GET メソッドも受け取れるので、これも試してみましょう。HTTP GET メソッドはリソース要求と共にパラメタを渡すためのものです。アドレスの入力欄に http://localhost:8080/beans/Servlet?hankei=1.0 と入力して実行してください。GET 要求が発行されて、 POST 要求と同様にサーブレットが実行されます。