潜伏バグからのロングフリーズ

Javaっぽいエンジニアの徒然草

scope属性

jspのscope属性でハマったのでメモ。

 

■参考

http://www.atmarkit.co.jp/ait/articles/0701/20/news017.html

http://struts.wasureppoi.com/jsp/01_scope.html

 

----------------------------------------------------------------------------------------------------

■scope属性

scope属性は、id属性で指定したスクリプティング変数の「スコープ」を指定する。

「変数の有効範囲」を表すもので、下記4種類のスコープが指定できる。

※scope属性を省略した場合は、デフォルトpageとして扱われる。

 

■scopeの種類

 スコープ変数の有効範囲備考
狭い page JSPページ 同一のJSPファイル内で、情報共有する
request HTTPリクエスト 同一クライアント/ブラウザ別に、
1回のリクエスト内で、情報共有する
session HTTPセッション 同一クライアント/ブラウザ別に、
複数のリクエストをまたいで、情報共有する
広い application Webアプリケーション Webアプリケーション全体で、情報共有する

 

■pageスコープ

スクリプティング変数の有効範囲がJSPページ内である」ことを意味する。

Javaのローカル変数と同様の振る舞い。

 

 

■requestスコープ

スクリプティング変数の有効範囲がHTTPリクエスト内である」ことを表す。

つまり、

 1.Webブラウザから届いたHTTPリクエストをWebコンテナが受信する

 2.WebコンテナがJSPサーブレットを呼び出し、HTTPリクエストを処理する

 3.処理結果のHTTPレスポンスをWebブラウザに送信する

この一連の処理が、requestスコープのスクリプティング変数の有効範囲となる。

 

 

■sessionスコープ

スクリプティング変数の有効範囲がHTTPセッション内である」ことを意味する。

 

「HTTPセッション」とは、クライアントごとに用意されるオブジェクトのことを表す。

sessionスコープのスクリプティング変数を利用することで、クライアントごとに異なる状態を保持できる。

 

使用例

・ショッピングカード内容を保存

・各ユーザーのログイン/ログアウト状態を記録

 

 

■applicationスコープ

スクリプティング変数の有効範囲がWebアプリケーション内である」ことを表す。

Webアプリケーション全体で1つの変数を共有する。

 

applicationスコープは、Webアプリケーション全体で共有したいデータ、

例えばマスターデータのキャッシュやアクセスカウント数などを保持する目的で利用する。

applicationスコープに保存された変数の値は、

WebアプリケーションをWebコンテナからアンロード(削除)するまでメモリ上に存在し続ける。

 

まとめは以上。

----------------------------------------------------------------------------------------------------

 

今回ハマった内容。

「scope指定無しで、親でsetしたsessionを見ようとしている」

 

scopeにrequestを指定するだけで解決したものの、中身の動きがいまいちわからない。

 

多分イメージとしてはこんな感じになる(はず)。

f:id:monokurotamago:20140204205559j:plain

 

・scope指定無しの場合はデフォルトpageとなる

・page → request → session → application という順に探す

という点から考えると、

今回の「scope指定無しで、親でsetしたsessionを見ようとしている」動作は不明。

 

後者だけ考えると、

①page見て存在しないと判断

②request見て存在しないと判断

③session見て親でセットした値があったから引っ張ろうとしたが、

 元の画面が違うのでエラーが起きた。

となり納得できる。

 

つまり、

・scope指定無しの場合はデフォルトpageとなる

のはセットする側の話なので読む際は無視。

読む時は、

・page → request → session → application という順に探す

だけ着目していれば良さそう。

 

まとめ。

前画面のsessionを持った状態で別窓にPOP UP出す場合は、

前画面のsession使わないように設定する必要がある。