読者です 読者をやめる 読者になる 読者になる

はしくれエンジニアもどきのメモ

情報・Web系技術の勉強メモ・備忘録です。

Java Servlet & JSP スコープについて

Java JavaEE Tomcat

Java Servlet & JSP スコープについて

Java Servlet & JSP のスコープについてのメモ。

環境

  • Windows7

    • Java 8.0.6001

    • NetBeans 8.02

    • Tomcat 8

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: 暗黙的オブジェクトである requstsessionapplication に各スコープのカウント(値)が 保存されているので、 読み出して表示する。

動作的には、 リクエストスコープは、リクエストする度に新しくなるので カウント無し。
セッションスコープは、 同じブラウザかつセッションタイムアウト内であれば カウントアップされる。
アプリケーションスコープは、 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>

Java Servlet Scopeのサンプル

実行結果

form に名前を入力
formに入力(scope.jsp)

requst1回目なので、どのスコープも値は保存されてなく、カウントアップ無し。

request 1回目
request(1回目)

セッションタイムアウト以内のリクエストなので、 セッションスコープとアプリケーションスコープが有効。

request(2回目)
request(2回目)

セッションタイムアウトしたので、 アプリケーションスコープのみ有効。

request(3回目 1分後)
request(3回目 1分後)

セッションの比較

 リクエスとスコープセッションスコープアプリケーションスコープ
作成タイミング リクエスト リクエスト後、Servlet内で設定 アプリケーション起動時
消滅のタイミング レスポンス セッションタイムアウト アプリケーション休止時
利用範囲 同一リクエスト 同一ブラウザ 同一アプリケーション
Servletで使用する場合のインスタンス HttpServletRequest HttpSession ServletContext
JSPで使用する場合のインスタンス(暗黙obj) request session application