Java Servlet & JSP スコープについて
Java Servlet & JSP スコープについて
Java Servlet & JSP のスコープについてのメモ。
環境
Webアプリケーションの情報管理
スコープとは
スコープとは、 データ保持するための概念
例えば、以下のように使う。
request.getParameter("id");
<jsp:useBean id="user" scope="request">
スコープ自体は、ただの「データ置き場」。 例えば、(リクエスト)スコープには、 formで入力された値や移動先のパスなどのデータを 置いたりすることができる。
HTTPでのデータ保持の種類
-
Cookie(クッキー)、ローカルストレージ
ブラウザに情報を保存してもらう仕組み。
-
Session(セッション)
クライアントとサーバ間の情報の流れをクッキーを使って実現する仕組み。
スコープに関係しているのはこのセッション。
-
・Cache(キャッシュ)
コンピュータの記憶領域などを使用して、 データを効率よく転送する仕組み。
スコープの種類
スコープは主に4種類ある。
主な違いは、データの保存期間(見ることができる範囲)が違う。
-
・(ページスコープ)
参考:ざっくりJava JSP/サーブレット - Qiita
リクエスト(request)スコープ
リクエストされたタイミングで発生するデータ置き場。 クライアントへレスポンスされると消滅(見えなくなる)する。
リクエストスコープを他のページを使うために
「フォワード」を使用する。
サーバ内で次の画面を準備するため、 スコープを引き継げる。
※リダイレクトでは使えない。
セッション(session)スコープ
リクエストされた後に、サーバが作成するデータ置き場。
セッションが有効な限り、使い続けることが可能。 セッションが有効ならログインし直さくても、 そのWebページにログインできる。
セッションは有効期限があるように、 「タイムアウト」がある。
セッションの仕組み
ブラウザからWebアプリケーションにリクエストがあった場合、 各ブラウザに「セッションID」を割り振る。
セッションID:ブラウザを識別するために使用し、 発行される。
問題
リクエストが多すぎると、 Tomcat側でセッションを管理することが難しくなる。
セッションの仕組み
ブラウザからWebアプリケーションにリクエストがあった場合、 各ブラウザに「セッションID」を割り振る。
セッションID:ブラウザを識別するために使用し、 発行される。
セッションタイムアウト(有効時間)の仕組み
Apache Tomcat のセッションは、 デフォルトでは30分で切れる。 なので、 30分経ったらログインし直さないといけない。
タイムアウトしたセッションは管理しなくていいので、 Apache Tomcat側は楽になる。
アプリケーション(application)スコープ
Webアプリケーション(Tomcat) が起動したタイミングで発生する。 Webアプリケーションが起動し続ける限り有効。
常に有効なデータなので、 基本は共通情報に使う。
forward で出てくる コンテキスト(getServletContest()
)は、 「アプリケーションスコープ」になる。
セッションを使ったサンプル
各スコープのアクセス回数をカウントするもの。 セッションタイムアウトは60秒にしている。
サンプルの構成
-
scope.jsp
: form の入力画面 -
ScopeSetServlet.java
: form(request)から「名前」を受け取り、 リクエストスコープ、 セッションスコープと アプリケーションスコープ に保存してあるカウントを読みだして、 カウントアップして 各スコープに保存。 -
scopeResult.jsp
: 暗黙的オブジェクトであるrequst
、session
とapplication
に各スコープのカウント(値)が 保存されているので、 読み出して表示する。
動作的には、 リクエストスコープは、リクエストする度に新しくなるので カウント無し。
セッションスコープは、 同じブラウザかつセッションタイムアウト内であれば カウントアップされる。
アプリケーションスコープは、 Webアプリケーション(Tomcat)が動作している限り有効なので、 常にカウントアップしてアクセスカウンタのような動きになる。
コード
セッションの取得(servlet側)
// リクエストからセッションを取得
HttpSession http_session = request.getSession();
// セッションから属性値を取得
String session_attr = (String)http_session.getAttribute("access_session");
暗黙オブジェクトから属性値を取得
<p>リクエスト:<%=request.getAttribute("access_request")%></p>
<p>セッション:<%=session.getAttribute("access_session")%></p>
<p>アプリケーション:<%=application.getAttribute("access_application")%></p>
実行結果
requst1回目なので、どのスコープも値は保存されてなく、カウントアップ無し。
セッションタイムアウト以内のリクエストなので、 セッションスコープとアプリケーションスコープが有効。
セッションタイムアウトしたので、 アプリケーションスコープのみ有効。
セッションの比較
リクエスとスコープ | セッションスコープ | アプリケーションスコープ | |
---|---|---|---|
作成タイミング | リクエスト | リクエスト後、Servlet内で設定 | アプリケーション起動時 |
消滅のタイミング | レスポンス | セッションタイムアウト | アプリケーション休止時 |
利用範囲 | 同一リクエスト | 同一ブラウザ | 同一アプリケーション |
Servletで使用する場合のインスタンス | HttpServletRequest | HttpSession | ServletContext |
JSPで使用する場合のインスタンス(暗黙obj) | request | session | application |
参考リンク