フォワード
あるサーブレットやJSPから、他のサーブレットやJSPに処理を以降する機能。
フォワードの組み合わせ
1:サーブレット→サーブレット
2:サーブレット→JSP(実際のWebアプリケーションでよく利用される)
3:JSP→サーブレット
4:JSP→JSP
※フォワード先に処理が移ったあとは、フォワード元には戻らない。
サーブレット:Javaプログラムによる処理を行うのに向いている。サーブレットでリクエストパラメータ処理など。
JSP:HTML出力に向いている。サーブレットから渡ってきたものをレスポンス出力など。
@WebServlet(urlPatterns={"/chapter9/forward"}) public class Forward extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // getRequestDispatcherでRequestDispatcherオブジェクト取得 // 引数はフォワード先のサーブレットやJSPのパス // fowardメソッドでフォワードを行う req.getRequestDispatcher("forward.jsp").forward(req, resp); } }
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // サーブレットにフォワードさせる場合、パスはフォワード先のサーブレットパス(urlPatternsのパス)を記載する。 req.getRequestDispatcher("forwardTo").forward(req, resp);; }
インクルード
フォワード同様、サーブレットやJSPから他のサーブレットやJSPを呼び出す機能。
フォワードと違う点は、呼び出し先の処理が終わると、呼び出し元のサーブレットやJSPに処理が戻る点。インクルードする側のサーブレットやJSPがレスポンス出力を行う。
利点:複数のサーブレットやJSPファイルを組み合わせてレスポンス出力を行うような場面で役に立つ。
@WebServlet(urlPatterns={"/chapter9/include"}) public class Include extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // レスポンス出力のための文字エンコーディングの指定 resp.setContentType("text/html; charset=UTF-8"); // PrintWriterオブジェクト取得 PrintWriter pw = resp.getWriter(); Page.header(pw); // getRequestDispatcherでRequestDispatcherオブジェクト取得 // includeメソッドで、includeの実行 // レスポンス出力はサーブレット側で行っている req.getRequestDispatcher("include1.jsp").include(req, resp); req.getRequestDispatcher("include2.jsp").include(req, resp); Page.footer(pw); } }
リダイレクト
サーブレットやJSPがレスポンス出力をする代わりに、指定したWebページをブラウザに開かせる機能。
リダイレクトを行うと、リダイレクト先のURLがブラウザに送信され、ブラウザはリダイレクト先にリクエストを送信する。
※リダイレクト(一般的):最初に指定したURLとは別のURLにブラウザを誘導すること。Webサイトの引っ越しなどに用いられる。
リダイレクトは、Webサーバやアプリケーションサーバが、ブラウザに特別なステータスコードを返却することで実現する。
HTTPでよく使われるリダイレクトを表すステータスコード
301:リクエストしたWebページなどが、恒久的に移動しているときに使うステータスコード。
302:リクエストしたWebページなどが、一時的に移動しているときに使うステータスコード。(サーブレットのリダイレクト機能では、このステータスコードが返却される。)
リダイレクトの使用例
外部のリソースを利用する際。フォワードやインクルードでは、アプリケーションサーバ内部のリソースしか利用できないため。
@WebServlet(urlPatterns={"/chapter9/redirect"}) public class Redirect extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.sendRedirect("http://tomcat.apache.org/"); } }