【Servlet & JSP】フォワードとリダイレクト

サーブレット&JSPを利用したアプリケーションにおいて
ファイル間の連携と画面遷移を実現するためのフォワードとリダイレクトの方法についてまとめます。

データの受け渡しを実現するためのリクエストスコープについても解説します。

サーブレットクラスとJSPファイルの役割分担や基本についてはこちらの記事を参照ください。

フォワード(サーブレットクラスからJSPへ)

コントローラーとしてリクエストを受け付ける役割を持ったサーブレットクラスから
ページの表示を担当するjspファイルへ処理を遷移させる。

(サーブレットクラスのdoGet、doPostメソッド内)

	RequestDispatcher dispatcher = 
			request.getRequestDispatcher("/WEB-INF/jsp/main.jsp");
	dispatcher.forward(request, response);

requestインスタンスのgetRequestDispatcherメソッドの引数に
遷移先であるjspファイルのパスを指定してRequestDispatcherクラスのインスタンスとして扱い、
forwardメソッドを実行する事でフォワードを実現します。

※forwardメソッドの引数にrequest、responseのインスタンスを渡すことが決まっています。

(javax.servlet.RequestDispatcherをインポートしておきます)

遷移先パスの指定

request.getRequestDispatcher(“/WEB-INF/パスとファイル名”);

遷移先であるjspファイルのパスの指定は動的WebプロジェクトのWebContentディレクトリ以下からとなります。
サーブレットクラスからのフォワードを介して表示させるjspファイルはブラウザから直接リクエストできないよう
WEB-INFディレクトリ以下に配置することが基本となります。

サーブレットクラスから他のサーブレットクラスへフォワードさせる

サーブレットクラスからはJSPファイルだけではなく
他のサーブレットクラスへフォワードさせて処理を移すことも出来ます。
その場合は当該のサーブレットクラスで指定しているURLパターンを遷移先として指定します。
※同じアプリケーション内である事が前提です

	RequestDispatcher dispatcher = 
			request.getRequestDispatcher("/Other");
	dispatcher.forward(request, response);

リクエストスコープへデータを保存(遷移先からデータを利用)

サーブレットクラスからリクエストスコープを利用してデータを保存すると
遷移先のjspファイルからそのデータを利用することが出来ます。

 

リクエストスコープへインスタンスを保存

request.setAttribute(“スコープ変数名”, インスタンス);

requestインスタンスのsetAttributeメソッドを利用する。
最初の引数には文字列で変数名を、二つ目の引数には保存するインスタンスを指定する。
(あらゆるオブジェクト型のインスタンスを保存できる)

最初の引数が同じ名前の場合、後から保存したインスタンスで上書きされる。

– サーブレットクラス –

	if(hasError) {
		request.setAttribute("errorMsg", "投稿が空です。");
	}
	RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/main.jsp");
	dispatcher.forward(request, response);

 

リクエストスコープからインスタンス値を取得

String errorMsg = (String)request.getAttribute(“スコープ変数名”);

requestインスタンスのgetAttributeメソッドを利用する。
値として取得する際、元の型へキャストする。

– jspファイル –

  <%
  String errorMsg = (String)request.getAttribute("errorMsg");
  if(errorMsg != null){
  %>
	<p><%= errorMsg%></p>
  <%
  }
  %>

リクエストスコープへ保存したインスタンスの保存期間は一度のレスポンスまでとなり、
それ以降のリクエストでは消えてしまいます。

(リクエストをまたいで使用することが出来ません)

リクエストをまたいでもデータが消えないよう
状態を保っておきたい場合はセッションを利用します。

また、リクエストスコープへ保存できるのはインスタンスのみで
intなど基本データ型の変数を保存する事は出来ません。

Follow me!