Revised: 27th/Oct./2002
前節ではRequestDispatcherクラスのforward(), include()メソッドを使いました。ここでは全く別の仕組みとしてsendRedirect()メソッドを紹介しましょう。
Java のリダイレクトとは、クライアントに別リソースへの再要求を促すものです。一般に、リダイレクトの応答を受け取ったクライアントは、自動的に指定されたリソースへの要求を発行します。ウェッブページで言えば、「別のページへ飛ぶ」という動作になります。最初の要求/応答のトランザクションと、リダイレクト先への要求/応答のトランザクションは、まったく別のものです。
forward() では、一つの要求/応答の処理の過程を、サーバ内で別リソースに振り分けて伊いたのに対して、sendRedirect() では、クライアント/サーバ間で、二組のまったく独立した要求/応答のやり取りを必要とします。このため、フォワードでは、転送先に要求/応答オブジェクトを渡せたのに対して、リダイレクトでは、リダイレクト先に要求/応答オブジェクトを渡すことができません。つまり、一回目の要求オブジェクトに対してセットしたオブジェクトは、二回目の要求オブジェクトには含まれずに失われてしまいます。また、二組の要求/応答の通信が必要なリダイレクトよりも、サーバ内の処理で完結するフォワードのほうが高速であり、データの損失の危険性もありません。
前節と同じリソースを使います。ドキュメント・ルートは "C:\java\dispatchers
" であり、サーバのコンテキスト・ルート "/dispatching
" になるように設定しています。未設定の場合は、前節に戻って設定してください。
Tomcat の server.xml
に次の行が挿入されているはずです(server.xml
の絶対パスは、デフォルトでは "C:\Program Files\Apache Tomcat 4.0\conf\server.xml
" になっているはずです)。
<!-- Dispatching Examples Context --> <Context path="/dispatching" docBase="C:/java/dispatchers" debug="0" reloadable="true" crossContext="true"/>
また、ドキュメントルート配下のディレクトリ構造は次のようになっているはずです。
![]() |
図: C:\java\dispatchers 以下のディレクトリ構造 |
"C:\java\dispatchers\WEB-INF\classes
" に次のファイルを作成してください。
RedirectingServlet.java
:
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class RedirectingServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPerform(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPerform(request, response); } public void doPerform(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 応答をリダイレクト response.sendRedirect("/redirectedJSP.jsp"); } }
これを受け取る JSP は "C:\java\dispatchers\includedJSP.jsp
" です。
redirectedJSP.jsp
:
<?xml version="1.0" encoding="Shift_JIS" standalone="no"?> <!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> <p>この文書はサーブレットからリダイレクトされたJSPによるものです。</p> </body> </html>
例によって、サーブレットをコンパイルするためには、環境変数 CLASSPATH に servlet.jar の絶対パスがセットされている必要があります。"C:\autoexec.bat" (Windows 9x系の場合)やコントロール パネルの「システム」-> 「詳細」-> 「環境変数」(Windows NT系の場合)環境変数に CLASSPATH をセットするか、コマンドラインから一時的にセットしてください。次の二つ目のコマンドは、コマンドラインから一時的に CLASSPATH をセットする場合の例です。本節まで順番に設定してきている方は、既にOSに環境変数を設定しているはずなので、setコマンドによる CLASSPATH の設定は不要です。
C:\>cd C:\java\dispatchers\WBE-INF\classes C:\java\dispatchers\WBE-INF\classes>set CLASSPATH=C:\Program Files\Apache Group\ Tomcat 4.1\common\lib\servlet.jar;.;%PATH% C:\java\dispatchers\WBE-INF\classes>javac IncludingServlet.java
ブラウザのアドレス欄に次のように入力してください。
http://localhost/dispachers/IncludingServlet