当コーナーはJavaの基本的な事項を紹介していくものです。
サーブレットを使う
今回はサーブレットを利用したwebアプリケーションを作成します。
掛け算webアプリケーションを作る。
今日のWebアプリケーションではJSPのみでシステムを実現することはまずありません。
通常は
- 処理の流れを制御するサーブレット(コントローラー)
- 業務処理(実際のロジック)をおこなうモデル
- 結果を表示するためのJSP(ビュー)
に役割を分担させます。
これをMVC(モデル・ビュー・コントローラー)構成と呼びます。
この証ではMVC構成に沿った構成で掛け算アプリケーションを作成します。
まず、ビューとなるjspファイルを作ります。
aiosl-tec-JSPフォルダにビューの機能を持ったjspファイルを以下の内容で作成します。
各ビューの説明は以下のとおりです。
- sampleJsp04.jsp ・・・ 入力エリアに数字を二つ入力する画面。
- sampleJsp05.jsp ・・・ 計算結果を出力する画面。
- err.jsp ・・・ 入力エラーがあった際に表示される画面。
sampleJsp04.jsp
<%@ page contentType="text/html;charset=Windows-31J" pageEncoding="Windows-31J" %> <html> <title> アイオステクノロジーのJSPサンプルその4 </title> <head> </head> <body> <b>掛け算プログラムです。</b> <form action = "SampleServlet01" method="POST"> <input type = "text" name="value01" size=10 maxlength="4" /> × <input type = "text" name="value02" size=10 maxlength="4" /> <input type = "submit" value="実行" /> </form> </body> </html>
sampleJsp05.jsp
<%@ page contentType="text/html;charset=Windows-31J" pageEncoding="Windows-31J" %> <% request.setCharacterEncoding("Windows-31J"); Integer result = (Integer)request.getAttribute("Rusult"); %> <html> <title> アイオステクノロジーのJSPサンプルその5 </title> <head> </head> <body> <font color = "#0000ff"><b>計算結果は</b></font><br> <%= result %>です!! <form action = "sampleJsp04.jsp" method="POST"> <input type = "submit" value="戻る" /> </form> </body> </html>
err.jsp
<%@ page contentType="text/html;charset=Windows-31J" pageEncoding="Windows-31J" %> <% request.setCharacterEncoding("Windows-31J"); String errMsg = (String)request.getAttribute("ErrMsg"); %> <html> <title> アイオステクノロジーのJSPサンプルエラーページ </title> <head> </head> <body> <font color = "#ff0000"><b>入力エラーです。</b></font><br> 【<%= errMsg %>】 <form action = "sampleJsp04.jsp" method="POST"> <input type = "submit" value="戻る" /> </form> </body> </html>
次に実際に計算するJavaのクラスとコントローラーとなるサーブレットを作成します。
今回は便宜的にaiosl-tec-JSP\WEB-INFの直下にclassesフォルダを作成しここに
javaのクラスを配置します。
- AioslBizSample01.java ・・・ 掛け算を実行するメソッドを持つクラス
- SampleServlet01.java ・・・ 掛け算アプリケーションのコントローラー
AioslBizSample01.java
/* * クラス名 :AioslBizSample01.java * * 作成日 :2006/12/01 * 作成者 :アイオステクノロジー * 最終更新日:2006/12/01 * 最終更新者:アイオステクノロジー * */ /** * 簡単な掛け算クラスです。 */ public class AioslBizSample01{ public Integer multiple(int value01,int value02){ int i = value01 * value02; Integer result = new Integer(i); return result; } }
SampleServlet01.java
/* * クラス名 :SampleServlet01.java * * 作成日 :2006/12/01 * 作成者 :アイオステクノロジー * 最終更新日:2006/12/01 * 最終更新者:アイオステクノロジー * */ import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * 簡単なサーブレットです。 */ public class SampleServlet01 extends HttpServlet{ public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RequestDispatcher rd = null; //jspから送られたリクエストパラメータの文字コードをWindows-31Jに設定します。 request.setCharacterEncoding("Windows-31J"); try{ int value01 = Integer.parseInt(request.getParameter("value01")); int value02 = Integer.parseInt(request.getParameter("value02")); AioslBizSample01 sample01 = new AioslBizSample01(); Integer result = sample01.multiple(value01,value02); //出力用のjspへ渡す為リクエストに格納 "Rusult"という名前で //rusultオブジェクトを格納します。 request.setAttribute("Rusult", result); //jspに転送するためにgetRequestDispatcherを定義。 rd = request.getRequestDispatcher("/sampleJsp05.jsp"); }catch(NumberFormatException e){ //エラー用のjspへ渡す為リクエストに格納 "ErrMsg"という名前で //"整数で入力してください。"オブジェクトを格納します。 request.setAttribute("ErrMsg", "整数で入力してください。"); rd = request.getRequestDispatcher("/err.jsp"); }finally{ //正常/例外にかかわらず、それぞれの遷移先ページに飛ばす。 rd.forward(request,response); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } }
サーブレットのコンパイルには環境変数のCLASSPATHにサーブレットのAPIを指定する必要があります。
以下の内容を、CLASSPATHの\;%JAVA_HOME%\lib\tools.jar;の後に記述して下さい。
「.;%CATALINA_HOME%\common\lib\servlet-api.jar;%CATALINA_HOME%\common\lib\jsp-api.jar;」
コマンドプロンプトを起動し、コンパイルします。
先ほど、作成されたclassファイルが出来上がります。
Webアプリケーションでコンパイルされたclassは原則的にclassesフォルダに配置します。
Webアプリケーションではclassesを参照してクラスをjavaを動かします。
*サーブレットでもHTMLタグを利用しwebページを生成できますが可読性が落ちるので当コーナーでは触れません。
web.xmlを編集します。
<?xml version="1.0" encoding="ISO-8859-1"?> <!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>SampleServlet01</servlet-name> <servlet-class>SampleServlet01</servlet-class> </servlet> <servlet-mapping> <servlet-name>SampleServlet01</servlet-name> <url-pattern>/SampleServlet01</url-pattern> </servlet-mapping> </web-app>
掛け算アプリケーションを起動する。
以上で、準備が整いました。Tomcatを再起動して、http://localhost:8080/aiosl-tec-JSP/にアクセスして下さい。
sampleJsp04.jspをクリックすると以下のようなページが表示されます。
適当な数字を入れて、実行ボタンを押してください。
計算結果を表示するjspに移動しました!「戻るボタン」で元の画面に戻ります。
今度は数字以外の文字を入れてみます。
実は整数以外を入力すると例外を発生させる仕様になっていますので入力エラーを表すerr.jspに移動しました。
この掛け算アプリケーションでは
sampleJsp04.jspから入力された情報をSampleServlet01.javaが受け取り
受け取った二つの情報をAioslBizSample01.javaで掛け算をしてもらった後にsampleJsp05.jspに計算結果を渡しています。
もし、入力された情報が整数ではない場合は例外を発生させ、err.jspに移動する様に コントロールしています。
このように表示にかかわる仕組みはjspでおこない、複雑な処理仕組みはビジネスロジックでおこない、その橋渡しをサーブレットでコントロールすること、つまり MVC構成を利用する事によってスッキリとしたWebアプリケーションの実装が実現できます。