JSPのスコープをちゃんと使いこなせてますか?:やり直し「JSPとTomcat」(9)(2/2 ページ)
Javaを途中までかじったが挫折した。やはりJavaプログラマにスキルチェンジしたい! という読者のために、Tomcatの最新バージョンを使いながらJSPを基礎から解説していく。(編集部)
requestスコープはMVCをまたに掛ける
requestスコープは、「スクリプティング変数の有効範囲がHTTPリクエスト内である」ことを表します。つまり、
- Webブラウザから届いたHTTPリクエストをWebコンテナが受信する
- WebコンテナがJSPやサーブレットを呼び出し、HTTPリクエストを処理する
- 処理結果のHTTPレスポンスをWebブラウザに送信する
この一連の処理が、requestスコープのスクリプティング変数の有効範囲となります。
HTTPリクエストの処理が1枚のJSPページだけで済んでしまう場合は、requestスコープとpageスコープに違いはありません。しかし、以下のようなケースではrequestスコープが意味を持ちます。
- サーブレットからJSPページを呼び出す場合(MVCモデルなど)
- あるJSPからほかのJSPを呼び出す場合(JSPページのインクルードなど)
requestスコープのスクリプティング変数が最もよく用いられるケースは、MVCモデルを構成する場合です。
MVCモデルでは、HTTPリクエストを、まずサーブレット(コントローラ)で受け付け、JavaBeans(モデル)でビジネス・ロジックを実行したのち、その結果をJSPページ(ビュー)で表示する、という流れで実行が進みます。このとき、サーブレットやJavaBeansからJSPページへ処理結果を渡す手段として、requestスコープのスクリプティング変数が利用されます。
sessionスコープはPCごと
sessionスコープとは、「スクリプティング変数の有効範囲がHTTPセッション内である」ことを意味します。
ここでいう「HTTPセッション」とは、クライアントごとに用意されるオブジェクトのことです。よって、sessionスコープのスクリプティング変数を利用することで、クライアントごとに異なる状態を保持できます。
sessionスコープは、例えば、ショッピングカード内容を保存したり、各ユーザーのログイン/ログアウト状態を記録したりするなど、いわゆるセッション情報を保持するために利用します。
例えば、冒頭のコード例のuseBeanタグに「scope="session"」という記述を追加してみます。この状態でWebブラウザからJSPページを開き、リロードボタンをクリックします。すると、pageスコープのときとは違い、日時が更新されないことが分かります。なぜなら、useBeanタグによって作成されたnow変数がHTTPセッションに保存されるため、同じクライアントからの2回目以降のアクセスでは、HTTPセッションに保存された既存のnow変数をそのまま再利用するからです。
また、続いてほかのPCのWebブラウザから同じJSPページを開いてみます。すると、先ほどとは異なる日時が表示されます。これはつまり、クライアントを識別して、それぞれに別々のnow変数を作成しているからです。
なお、sessionスコープのスクリプティング変数は、Webブラウザからのアクセスが一定時間以上(Tomcatのデフォルトでは、15分)途切れると、HTTPセッションとともに破棄されます。
applicationスコープはみんなのもの
applicationスコープとは、「スクリプティング変数の有効範囲がWebアプリケーション内である」ことを表します。つまり、Webアプリケーション全体で1つの変数を共有できることを意味します。
例えば、コード例のuseBeanタグに「scope="application"」という記述を追加します。この状態で、sessionスコープの例のように、複数のPCから同じJSPページにアクセスします。sessionスコープのときとは異なり、今度はPCの違いを識別せずに、両方とも同じ日時が表示されることが分かります。
こうした振る舞いから、applicationスコープは、Webアプリケーション全体で共有したいデータ、例えばマスターデータのキャッシュやアクセスカウント数などを保持する目的で利用できます。ちなみに、applicationスコープに保存された変数の値は、WebアプリケーションをWebコンテナからアンロード(削除)するまでメモリ上に存在し続けます。
以上、今回はuseBeanタグとスクリプティング変数の機能について説明しました。
Copyright © ITmedia, Inc. All Rights Reserved.