シリーズJavaの画面表示のつづきです。
今、JSPで表示画面を作成し、サーブレットで処理部分を書くということをやっていて、前回までで、フォワードを使って、つなぐことをやっていました。今回は、もうひとつのやり方、リダイレクトを使ってやってみたいと思います。
■リダイレクトとフォワードの違い
リダイレクトとフォワードの違いは、
ここ
http://www.atmarkit.co.jp/fjava/javatips/062jspservlet029.html
にあるように、
フォワードは、サーバー内での処理(そのため、サーバーのクラス内のJSP,サーブレットにジャンプできる)のに対し、
リダイレクトは、いったんクライアントにもどして、クライアントのブラウザが、表示先にジャンプします
そのため、リダイレクトの場合には、まったく違ったサーバーにも、移動できます。
ただし、違ったサーバーに移動する場合は、セッションは使えません(セッションは、そのサーバー内でしか、値は参照できない)。そのため、GET型、URLに引数の値を設定して、移転先に渡す形になります。
今回は、サーバーを変えないので、セッションでもいいのですが、サンプルということで、URLの引数に結果をセットする形でやってみたいと思います。
■変更内容の仕様と概要
<仕様>
以下の2点が変わります
(1)入力結果、エラーメッセージ、正解率の受け渡しが、
セッションから、URLの引数にかわります。
(2)フォワードからリダイレクトに変わります
<仕様変更対象ファイル>
以下のファイルが変更対象になります
・index.jsp
・kekka.jsp
・shori.java
<変更の概要>
(1)セッションからURLの引数へ
JSPで、
String msg = (String)session.getAttribute("msg");
のようにセッションから取得していたところが、
String msg = request.getParameter("msg");
のように、パラメータを取得するように変わります。
なお、Javaのほうも変わりますが、それについては(2)
でやっています。
(2)フォワードからリダイレクトに変わります
shori.javaで、いままで、
getServletContext().getRequestDispatcher("/jsp/index.jsp").forward(request,response);
のようにやっていたところを
response.sendRedirect("http://127.0.0.1:8080/test/jsp/index.jsp?msg=NoData");
のように変えます。
■JSPソース
では、JSP側のソースindex.jspとkekka.jspを以下に載せます。
●ソース index.jsp
<html> <head> <% //==============================================// // 画面用の部分 // //==============================================// // 変数を受け取る String msg = request.getParameter("msg"); if ( msg == null ) { msg = ""; } //==============================================// // 以下、画面表示 // //==============================================// %> <title>早打ちの練習</title> </head> <body> <h1><font color=red><%=msg%></font></h1> <H1>早うちの練習</H1> 以下の文を打とう!<BR> <B>This is a pen</B><BR> <form method=get action="http://127.0.0.1:8080/test/servlet/shori"> <input type=text name=nyuryoku size=20><P> <input type=submit name=do value=打ち終わった!><P> </form> </html> |
(上記< > ¥ は本当は半角です。赤字は、今回変わったところ)
●ソース kekka.jsp
<html> <head> <% //==============================================// // 画面用の部分 // //==============================================// // 変数を受け取る String ritu = request.getParameter("ritu"); //==============================================// // 以下、画面表示 // //==============================================// %> <title>早打ちの練習</title> </head> <body> <H1>結果</H1> 正解率 = <%=ritu%><BR> </html> |
(上記< > ¥ は本当は半角です。赤字は、今回変わったところ)
■ Javaのソース
●ソースshori.java
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class shori extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //セッション開始 HttpSession session = request.getSession(true); //==============================// // データの取得 // //==============================// //Fromの引数取得 String nyuryoku = request.getParameter("nyuryoku"); if ( nyuryoku == null ) { response.sendRedirect("http://127.0.0.1:8080/test/jsp/index.jsp?msg=NoData"); } else if ( nyuryoku.length() == 0 ) { response.sendRedirect("http://127.0.0.1:8080/test/jsp/index.jsp?msg=NoData"); } // 処理 int i,atari; atari = 0; String chk = "This is a pen"; for(i = 0 ; i < nyuryoku.length() ; i ++ ) { if ( i >= chk.length() ) { break; } else if ( chk.charAt(i) == nyuryoku.charAt(i) ) { atari++; } } //==============================// // ビューにフォワード // //==============================// // 結果の設定 String sendPara = ""; sendPara = sendPara + "?msg=%20"; sendPara = sendPara + "&ritu=" + Integer.toString(atari*100/chk.length()); // 結果 response.sendRedirect("http://127.0.0.1:8080/test/jsp/kekka.jsp"+sendPara); } } |
(上記< > ¥ は本当は半角です。赤字は、今回変わったところ)
ということで、今回はここまで。