fc2ブログ

血液型プログラム





ラジオボタンで血液型を選択して実行ボタンを押すと、JSPファイルからサーブレットに指令が飛ばされて、選択された血液型の画面(JSPファイル)に遷移するプログラムを作成します。

今回の課題は、画面遷移です。

画面遷移は、HTMLやJSPのハイパーリンクで作成できますが、これでは複雑な処理をするのは難しいです。サーブレットが間に入ると、柔軟なアプリケーションを作成できるようになります。

血液型プログラムで言うと、1つの実行ボタンでも、ラジオボタンでどの血液型を洗濯したかによって違う処理をしなければなりません。そんな複雑な処理も、サーブレットが間に入ることでスムーズにできるようになります。

今回覚えるべき用語は「ディスパッチ」です。これは、サーブレットから他のリソース(サーブレット、JSP、HTMLなど)にリクエストを転送することをいいます。ディスパッチは、javax.servlet.RequestDispatcherインタフェースを利用します。

遷移先の定義は、getRequestDispatcher()メソッドで行います。そして、forward()メソッドでリクエストの転送を行います。

今回の例では、最初のJSPファイルに入力された血液型情報を、サーブレットがgetParameter()メソッドで取得し、RequestDispatcherオブジェクトをgetRequestDispatcher()メソッドで取得し、forward()メソッドで遷移の実行を行います。

[ ファイル構成 ]
[ siroto ]
├ [ form_entry ]  ・・・ここにJSPファイル作成
└ WEB-INF/src
    └ [ form_entry ]・・・ここにサーブレット作成
└ WEB-INF
    └ web.xml・・・ここにweb.xml作成
※[ ]はフォルダ

JSPファイルは、
  • bloodType.jsp
  • aType.jsp
  • bType.jsp
  • oType.jsp
  • abType.jsp
  • errorType.jsp
とします。

サーブレットは、bloodType.javaとします。


web.xmlを記述する



JSPファイルを記述する



bloodType.jsp

<%@page contentType="text/html; charset=Windows-31J" %>

<html><body>

<h3>血液型</h3>

血液型を選択してください。

<form action="../bloodType">

<p>
<input type="radio" name="bloodtype" value=1>A型<br>
<input type="radio" name="bloodtype" value=2>B型<br>
<input type="radio" name="bloodtype" value=3>O型<br>
<input type="radio" name="bloodtype" value=4>AB型<br>

<p>
<input type="submit" value="選択">

</form>

</body></html>



aType.jsp
<%@page contentType="text/html; charset=Windows-31J" %>

<html><body>

<h3>A型</h3>

堅実で協調性が高い。

</body></html>



bType.jsp
<%@page contentType="text/html; charset=Windows-31J" %>

<html><body>

<h3>B型</h3>

楽天的でマイペース。

</body></html>



oType.jsp
<%@page contentType="text/html; charset=Windows-31J" %>

<html><body>

<h3>O型</h3>

おおらかで負けず嫌い。

</body></html>



abType.jsp
<%@page contentType="text/html; charset=Windows-31J" %>

<html><body>

<h3>AB型</h3>

個性的で2面性を持つ。

</body></html>



errorType.jsp
<%@page contentType="text/html; charset=Windows-31J" %>

<html><body>

<h3>エラー</h3>

血液型を選択してください。

</body></html>



ファイルがたくさんあって大変ですね。ソースの中身自体は問題ないと思います。

小さなテクニックとして、血液型選択の各ラジオボタンの名前は、int型になるように数字にしておくとswitch文が使えます(if文でもかまわないのですが)。


サーブレットを記述する



package form_entry;

import java.io.IOException;

import javax.servlet.RequestDispatcher; //(1)
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class bloodType extends HttpServlet{

public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {

common(request,response);
}

public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {

common(request,response);
}

private void common(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {

request.setCharacterEncoding("Windows-31J");

//血液型の入力パラメータを取得
String bloodtypeStr=request.getParameter("bloodtype");

//血液型番号(1:A型 2:B型 3:O型 4:AB型 0:その他)
int bloodtype=0;

//画面遷移先
String path=null;

try{
//血液型を数字に変換し数値チェック
bloodtype = Integer.parseInt(bloodtypeStr);
}catch(NumberFormatException e){
bloodtype = 0;
}

//画面遷移先を取得
path = getPath(bloodtype);

// RequestDispatcherオブジェクトの取得
RequestDispatcher dispatcher = request.getRequestDispatcher(path); //(2)

// フォワードの実行
dispatcher.forward(request, response); //(3)
}

private String getPath(int bloodtype){

// 遷移先場面のパス
String path = null;

// 数値によって遷移先のJSPを設定
switch (bloodtype) {
case 1:// A型
path = "/form_entry/aType.jsp";
break;
case 2:// B型
path = "/form_entry/bType.jsp";
break;
case 3:// O型
path = "/form_entry/oType.jsp";
break;
case 4:// AB型
path = "/form_entry/abType.jsp";
break;
default:// その他(エラー)
path = "/form_entry/errorType.jsp";
break;
}
return path;
}
}


では、ゆるゆると解説を。

ディスパッチはRequestDispatcherインタフェースを用いるので、これをインポートする必要があります。
  import javax.servlet.RequestDispatcher; //(1)

定義すべき変数は、血液型bloodtype(初期値は「その他」の0、int型)と遷移先のURLのpath(初期値はnull、String型)です。

bloodType.jspから送られてきた入力パラメータbloodtypeは、getParameter()メソッドでString型の変数bloodtypeStrに変換し、さらにint型の変数blodtypeに代入します。

pathは、getPath()メソッドによって変化させます。getPath()メソッドは、switch文でbloodtypeごとに遷移先を変えます。

RequestDispatcherオブジェクトは画面の遷移先を定義するオブジェクトであり、HttpServletRequestクラスのgetRequestDispatcher()メソッドにより取得します。
  RequestDispatcher dispatcher = request.getRequestDispatcher(path); //(2)

getRequestDispatcher()メソッドの引数には、サーブレットの相対パスを指定します。パスの指定方法は、「/」で始めて、Webアプリケーションのルートからの相対パスを指定します。今回の例で言うと、「siroto」の下のフォルダから記述します。
  /form_entry/xxx.jsp

フォワードの実行は、たいてい以下の形で大丈夫です。
  dispatcher.forward(request, response); //(3)

以外に引っかかるのは相対パスの指定です。JSPとサーブレットで指定の仕方が微妙に違いますので、以下に分かりやすくまとめておきます。

[ siroto ]
├ [ フォルダ1 ]
    └ JSPファイル(xxx.jsp)
└ [ フォルダ2 ]
    └ サーブレット(yyy.java)

xxx.jspからyyy.javaの指定 ; ../yyy
yyy.javaからxxx.jspの指定 ; /フォルダ1/xxx.jsp

※[ ]はフォルダ。web.xmlの指定あり。

もちろん、ファイル構成が上と違えば指定方法も違ってきます。
スポンサーサイト



タグ :

Return to page top

Comments:

Comment Form
Only inform the site author.

Trackback+Pingback:

TrackBack URL for this entry
http://servletmania.blog137.fc2.com/tb.php/25-01262017
月別アーカイブ
カテゴリ
リンク
RSSリンクの表示
QRコード
QR