Java
JSP
servlet

スコープの使い方と処理の引き渡し(サーブレット)

スコープ

スコープとは、サーブレットやJSPを跨いでデータを共有したい場合に用いる保存領域のこと。
共有範囲に応じて以下の3種類がある。

  • リクエストスコープ
  • セッションスコープ
  • アプリケーションスコープ

サーブレットのdoGetやdoPostメソッド内でスコープに保存し、
フォワードメソッドで次に引き渡す使い方が多い。

doGetメソッドとdoPostメソッドの宣言部分のテンプレートは次の通り。

doGet,doPostメソッドの宣言
// doGet
Public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException{
}

// doPostも同じ
Public void doPost(HttpServletRequest request, HttpServletResponse response)
      Throws ServletException, IOException{
}

リクエストスコープ

ブラウザからのリクエスト毎に生成されるスコープのこと。次のリクエストが来た場合やブラウザを閉じたり、アプリケーション・サーバーが再起動した場合は原則保持されない。

使い方

// リクエストスコープに保存する
request.setAttribute("属性名", 保存したいインスタンス);

//リクエストスコープからインスタンスを取得する
 名前 = () request.getAttribute("属性名");


// 属性名とはスコープを指し示すインデックスのこと
// 型とは保存したインスタンスの型のこと
// 名前とは取得したインスタンスにつけたい参照変数のこと

セッションスコープ

ブラウザを閉じない、あるいはタイムアウトしない限り保持されるスコープ。

使い方

// セッションスコープの保存領域を確保
HttpSession session = request.getSession();

// セッションスコープに保存
Session.setAttribute("属性名", 保存したいインスタンス)

// セッションスコープからインスタンスを取得
 名前 = () session.getAttribute("属性名");

アプリケーションスコープ

アプリケーション・サーバーが終了しない限り保持されるスコープ。ブラウザを閉じても保持される。

使い方

// アプリケーションスコープの保存領域を確保
ServletContext sc = getServletContext();

// アプリケーションスコープに保存
sc.setAttribute("属性名", 保存したいインスタンス)

// アプリケーションスコープからインスタンスを取得
 名前 = () sc.getAttribute("属性名");

処理の引き渡し

処理を次のサーブレットやJSPに渡す際、スコープに保存したデータを引き継ぐにはフォワードというメソッドを用いる。データを引き継がない場合、リダイレクトを用いても処理を渡すことができるが外部サイトに引き渡す際に利用されることが多い。フォワードメソッドではサーバー内でしか処理を引き渡せない。

フォワード

スコープに保存したデータを引き継いで、次のページに処理を引き渡す方法のこと。
サーバー側が自動的に次の処理を実行してブラウザに返す。同サーバー内で処理を引き渡す際は、特にデータの引き継ぎがなくてもフォワードを用いることがある。

使い方

RequestDispatcher dispatcher = request.getRequestDispatcher("フォワード先");
dispatcher.forward(request, response);

// 次のパッケージが必要
import javax.servlet.RequestDispatcher;

// フォワード先はディレクトリ構成に従ってパスを書く
// 例えば:
request.getRequestDispatcher("/WEB-INF/jsp/hogehoge.jsp")

リダイレクト

次にどこにアクセスすれば良いかをサーバーからブラウザに返し、ブラウザはその指定先に次の処理をリクエストする。この仕組の都合上、外部サイトへのアクセスに適している。

使い方

request.sendRedirect("リダイレクト先");

// リダイレクト先はURLで指定しても良いし、同サーバー内であればファイル構成に従ったパスでも可
// 例えば:
request.sendRedirect("http://www.hogehoge.com")
request.sendRedirect("/サーブレット名")