転職を繰り返したサラリーマンの多趣味ブログ

30才未経験でSEに転職した人の多趣味ブログ

【技術書メモ】基礎からのサーブレット⑨

フォワード

あるサーブレットJSPから、他のサーブレットJSPに処理を以降する機能。

フォワードの組み合わせ
1:サーブレットサーブレット
2:サーブレットJSP(実際のWebアプリケーションでよく利用される)
3:JSPサーブレット
4:JSPJSP

フォワード先に処理が移ったあとは、フォワード元には戻らない。
サーブレット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/");

	}
}