この記事ではサーブレットによって特定のWebページへジャンプさせるための「リダイレクト」について説明する。
リダイレクトの設定の仕方
リダイレクトの設定とは、異なるURLにクライアントのあて先を変更するために適切なヘッダーとコンテンツを設定することである。sendRedirectメソッドを使ってURLパスを指定する。この時相対URLパスを使ってメソッドを呼ぶことも可能である。コンテナが相対パスを完全なURLパスに変換してくれる。
例えば下の図にあるように、リダイレクトを使えばサーブレットが別のWebページ(ここではGoogle検索)を呼び出すことが可能になる。
書き方の基本は簡単だ。
HttpServletResponseオブジェクト. sendRedirect (URLパス);
実際のコードはこうなる。
response.sendRedirect("http://www.google.com");
リダイレクトの設定API仕様
void sendRedirect(java.lang.String location)
戻り値の型 |
void |
内容 |
指定されたリダイレクトロケーションURLを使用してクライアントに一時的なリダイレクトレスポンスを送る。このメソッドは、相対的なURLを受け取ることができる;サーブレットコンテナは、レスポンスをクライアントに送る前に、相対的なURLを絶対的なURLに変えなければならない。 もしロケーションの先頭に「/」がないならば、コンテナはそれを現在のリクエストURLに相対的なものとして解釈する。 もしロケーションの先頭に「/」があるならば、コンテナはサーブレットコンテナルートに相対的なものとして解釈する。 もしレスポンスがすでにコミットされているならば、このメソッドはIllegalStateException例外を発生させる。このメソッドを使用した後に、レスポンスはコミットされたとみなされるべきであり、書き込まれるべきではない。 引数:location - リダイレクトロケーションURL 例外: java.io.IOException - もし、インプットもしくはアウトプットの例外が起こるならば。 java.lang.IllegalStateException – もし、レスポンスがコミットされたか、もしくは、URLの一部が与えられて、正しいURLに変換できなければ。 |
sendRedirectを使用したサンプルプログラム
このサンプルプログラムは、水曜日を英語で入力することを要求する。もし正しく英単語が入力されると、「正しく入力されました」が表示される。もし、間違っているとGoogle検索画面を表示する。このGoogle検索画面を表示する時にリダイレクトの設定を使っている。
サーブレットの配置とプログラムのコードは次のようになっている。
最初に単語を入力するHTMLで書かれた入力画面redirect.htmlのコードを示す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <title>リダイレクトサンプル</title> </head> <body> <p>水曜日を英語で入力してください。間違えるとGoogle検索が表示されます。</p> <form action="/Servlet/ServletRedirect" method="get"> <p>言葉:<input type="text" name="word"></p> <p><input type="submit" value="検索" style="WIDTH: 200px; HEIGHT: 20px"></p> </form> </body> </html> |
次に、HTML画面からリクエストを受け取るサーブレットのコードを示す。
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 |
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/ServletRedirect")//[1] public class ServletRedirect extends HttpServlet {//[2] protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//[3] response.setContentType("text/html; charset=UTF-8");//[4] String word = request.getParameter("word");//[5] if (!checkWord(word)) {//[6] response.sendRedirect("http://www.google.com");//[7] return;//[8] } PrintWriter out = response.getWriter();//[9] out.println("<html><head></head><body>");//[10] out.println("<p>正しく入力されました。</p>");//[11] out.println("<p>水曜日は英語でWednesdayです。</p>");//[12] out.println("</body></html>");//[13] } boolean checkWord(String word) {//[20] if (word == null)//[21] return false;//[22] if (word.equals("Wednesday"))//[23] return true;//[24] if (word.equals("wednesday"))//[25] return true;//[26] return false;//[27] } } |
実行結果
ブラウザにURL:http://localhost:8080/Servlet/redirect.htmlを入力し、Enterを押す。
表示されるブラウザ画面:
「Wednesday」と正しく入力し、検索ボタンを押す。
表示されるブラウザ画面:
それ以外の間違った単語を入力し、検索ボタンを押す。
表示されるブラウザ画面:
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1] アノテーションの宣言をする。
- [2] HttpServletを継承して、ServletRedirectクラスを定義する。
- [3] doGet()メソッドをオーバーライドして定義する。
- [4] Content Typeを設定する。
- [5] 入力された単語を取得し、変数wordに代入する。
- [6] 単語をチェックするメソッドcheckWordを呼び出す。
- [7]-[8] もし、チェックがNGならば、メソッドsendRedirectによってGoogle検索を呼び出す。そして、処理を終了する。
- [9] HTMLを出力するためのPrintWriterオブジェクトを取得する。
- [10]-[13] PrintWriterオブジェクトに「正しく入力されました。」と「水曜日は英語でWednesdayです。」を表示するHTMLコードを出力する。
- [20] メソッドcheckWordを定義する。
- [21]-[22] 引数wordがnullならば、戻り値falseで終了する。
- [23]-[24] 引数wordがWednesdayならば、戻り値trueで終了する。
- [25]-[26] 引数wordがwednesdayならば、戻り値trueで終了する。
- [27] 戻り値trueで終了する。
まとめ
リダイレクトの動作自体は単純なものだが、例えば様々なURLを行き来するための分岐に利用することもできる。まずはサンプルプログラム内のリダイレクト先URLを変更したり、様々な改造にトライしてみよう。