サーブレットとJSP/HTMLのやりとり (4/5)
■リダイレクトを利用して結果を表示する
フォワードの場合、アドレスバーに表示されているアドレスは変更されないため、/mygaeappと表示されたまま、helo.jspの内容が表示されるようになります。まぁ、これでも問題はないのですが、リロードしたりするとサーブレットのdoGetの表示になってしまいます。
helo.jspにきっちりとアドレスを戻すためには、フォワードではなく、「リダイレクト」を利用する必要があります。ただし、リダイレクトを利用する場合には、フォワードとはまた別の形で値を渡す仕組みを考える必要があります。
下のリスト欄に、先ほどのフォワードを使ったサンプルを、リダイレクトを利用する形に書きなおしたものを用意しています。これで動作を確認してみてください。フォームを送信すると再びフォームの表示に戻り、合計が計算され表示されるようになります。このとき、アドレスはちゃんとhelo.jspに戻っています。これなら、リロードしても問題ありませんね。
リダイレクトは、フォワードと違いもっと簡単に利用できます。以下のようなメソッドを呼び出すだけなのです。
HttpServletRequestは、リクエストを管理するものです。フォワードでは、サーバー内で表示される内容が変更されるため、リクエストは途切れることはありません。ところがリダイレクトは、HTTPのヘッダー情報を使ってブラウザに指定のページに移動してもらうものです。つまり、ブラウザが受け取ったヘッダー情報を元に別のページに移動する段階で、リクエストは途切れているのです。このため、HttpServletRequestはそこで消え、新しいHttpServletRequestが改めて用意されることになります。setAttribueで値を保管しても、これでは取り出すことができません。
では、どうするのか。こんなときのためにあるのが「セッション」です。セッションはJSPでも少し使いましたね。セッションは、サーバーとクライアント間の継続した接続を維持するための仕組みでした。
このセッションはHttpSessionというクラスとして用意されています。これはリクエストからとり出すことができます。
helo.jspにきっちりとアドレスを戻すためには、フォワードではなく、「リダイレクト」を利用する必要があります。ただし、リダイレクトを利用する場合には、フォワードとはまた別の形で値を渡す仕組みを考える必要があります。
下のリスト欄に、先ほどのフォワードを使ったサンプルを、リダイレクトを利用する形に書きなおしたものを用意しています。これで動作を確認してみてください。フォームを送信すると再びフォームの表示に戻り、合計が計算され表示されるようになります。このとき、アドレスはちゃんとhelo.jspに戻っています。これなら、リロードしても問題ありませんね。
リダイレクトは、フォワードと違いもっと簡単に利用できます。以下のようなメソッドを呼び出すだけなのです。
《HttpServletRequest》.sendRedirect( リダイレクト先 );フォワードと比べ、とても単純ですね。リダイレクト先のアドレスを引数に指定するだけです。ただし! リダイレクトを使う場合、先の「HttpServletRequestのsetAttributeを使った値の受け渡し」は利用できなくなります。
HttpServletRequestは、リクエストを管理するものです。フォワードでは、サーバー内で表示される内容が変更されるため、リクエストは途切れることはありません。ところがリダイレクトは、HTTPのヘッダー情報を使ってブラウザに指定のページに移動してもらうものです。つまり、ブラウザが受け取ったヘッダー情報を元に別のページに移動する段階で、リクエストは途切れているのです。このため、HttpServletRequestはそこで消え、新しいHttpServletRequestが改めて用意されることになります。setAttribueで値を保管しても、これでは取り出すことができません。
では、どうするのか。こんなときのためにあるのが「セッション」です。セッションはJSPでも少し使いましたね。セッションは、サーバーとクライアント間の継続した接続を維持するための仕組みでした。
このセッションはHttpSessionというクラスとして用意されています。これはリクエストからとり出すことができます。
HttpSession session = request.getSession();リクエストであるHttpServletRequestインスタンスの「getSession」を呼び出すことで、現在のセッションを管理するHttpSessionインスタンスが取得できます。そしてこのインスタンスの「setAttribute」を呼び出すことで、セッションに値を保管することができます。
session.setAttribute("input", param);
session.setAttribute("result", result);後は、JSP側で値を取り出している部分をリクエストからセッションに変更すれば良いのです。以下のような具合ですね。JSPでは、HttpSessionは「session」という暗黙オブジェクトとして用意されています。<%=session.getAttribute("result") %>
<%=session.getAttribute("input") %>セッションは、リクエストが切れてもそのまま維持され続けますから、リダイレクト先のJSPでもちゃんと値をとり出すことができます。これで安心してページの移動が行えますね。(by. SYODA-Tuyano.)
●プログラム・リスト●
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | ※helo.jsp<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Sample jsp</title><style>h1{ font-size: 16pt; background: #AAFFAA; padding: 5px;}</style></head><body> <h1>Hello App Engine!</h1> <p>Result: <%=session.getAttribute("result") %></p> <hr> <p id="msg">※整数を入力:</p> <form method="post" action="/mygaeapp"> <table> <tr> <td>入力</td> <td><input type="text" id="input" name="text1" value="<%=session.getAttribute("input") %>"></td> </tr> <tr> <td></td> <td> <input type="submit" value="送信する"> </td> </tr> </table> </form></body></html>※MyGaeAppServlet.javapackage com.tuyano.libro.mygaeapp;import java.io.*;import java.net.URLDecoder;import javax.servlet.*;import javax.servlet.http.*;@SuppressWarnings("serial")public class MyGaeAppServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/plain"); request.setCharacterEncoding("utf8"); response.setCharacterEncoding("utf8"); PrintWriter out = response.getWriter(); out.println("Hello, world!"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html"); request.setCharacterEncoding("utf8"); response.setCharacterEncoding("utf8"); String param =request.getParameter("text1"); PrintWriter out = response.getWriter(); int result = 0; try { int n = Integer.parseInt(param); for(int i = 1;i <= n;i++){ result += i; } } catch (NumberFormatException e) { out.println(e); } HttpSession session = request.getSession(); session.setAttribute("input", param); session.setAttribute("result", result); response.sendRedirect("/helo.jsp"); }} |