JSP で使用できる属性は 4 種類のスコープのいずれかに所属しています。
-
page
(PageContext.PAGE_SCOPE
)
-
処理中の JSP 内からのみアクセス可能な変数スコープです。
このスコープに格納されているオブジェクトは JSP の処理が終了すれば
自動的に開放される (他に参照がなければ GC の対象となる) ため、JSP
内でのローカル変数と同じように使用することができます。
より具体的には JSP からコンパイルされたサーブレットの service()
が終了する時に開放されます。これは JSP が送信処理を完了するか、forward を行う
までということを意味しています。
同じ JSP が複数のリクエストを同時に処理している場合でもスコープ領域は
個別に用意されるためオブジェクトが共用されることはありません。また
forward や include による呼び出し先/呼び出し元の
page スコープに影響を与える事はありません。
-
request
(PageContext.REQUEST_SCOPE
)
-
リクエストスコープは同一のリクエスト処理で共用される領域です。
include や forward で複数のサーブレット/ JSP が実行されたとしても、
同一のリクエスト内であればスコープ内の変数を共有することができます。
また複数のリクエストが同時に処理されている状況でもそれらはすべて
独立したリクエストスコープを持っています。
このスコープの変数はリクエストに対するすべての処理が終了したときに
開放されます。このため forward 先との一時的なデータ受け渡し領域と
して使用されます。
-
session
(PageContext.SESSION_SCOPE
)
-
セッションスコープはユーザのセッションに関連付けられた領域です。
いくつものリクエストが実行され、複数のサーブレット / JSP が実行されたとしても
それが同じユーザによるものであれば (なおかつタイムアウトしたり無効化されなければ)
同じセッションスコープ内の変数を共有できます。
このスコープに格納されたオブジェクトはユーザのセッションが終了するまで維持されます。
このためデータベースなどに保存されているユーザ固有の情報などをメモリ上にキャッシュして
おいたり、確定前の入力情報を一時的に保持しておくような目的で使用します。
<%@page%> 命令で session="false"
を指定している JSP からセッションにオブジェクトを設定することはできません。
-
application
(PageContext.APPLICATION_SCOPE
)
-
アプリケーションスコープは Web アプリケーション (サーブレットコンテキスト) が
起動してから終了するまで有効な領域です。このスコープに格納したオブジェクトは
全ユーザの全リクエストで共有されるため、システム全体で共有する情報 (メッセージ
リソースデータソースなど) が設定されます。
<%@page%> 命令で session="false" とした JSP
からでもアプリケーションスコープを参照することができます。
同じスコープ内に同じ名前を持つオブジェクトは一つしか存在できません。
しかしスコープが異なれば同じ名前のオブジェクトを保持することができます。
JSP アクションタグや JSTL でスコープを省略して変数を参照した場合、
PageContext#findAttribute()
を使用してオブジェクトを参照します。このメソッドは page, request,
session (もしあれば), application の順に名前に該当するオブジェクトを
探してゆき、最初に見つかったものを返します。
また変数のオブジェクトを削除する場合でもこの優先順位で行われます。
スコープの異なる同名の変数を使用していてもそれらが正しく扱われている限りは問題ありません。
しかし session スコープから削除するつもりのオブジェクトが既に存在して
おらず application スコープの同名のオブジェクトが削除されてしまったり、
page スコープのマップにメッセージを設定したつもりが
application スコープのメッセージマップを変更してしまった、などという
状況は非常に分かりにくいバグとして現れると予想されます。スコープの異なる同名のオブジェクト
を扱う場合は面倒でもスコープを明示しながら使用する事をお勧めします。
JSP 内のスクリプトレットで宣言なしで使用できる暗黙オブジェクトです
(EL の暗黙オブジェクトとは別物です)。
これらは JSP からコンパイルされたサーブレットの中でローカル変数宣言されています。
なお、スクリプトレットで使用する変数を新たに宣言場合、jsp,
_jsp, jspx, _jspx から始まる変数名は
大文字小文字区別せず予約されています。
-
request
(ServletRequest
)
-
現在の処理を行っているリクエストです。仕様上の型は ServletRequest であり、
サブクラスが何であるかの規定はありませんが、ほぼすべてのサーブレットコンテナで
HttpServletRequest
にキャストすることができます。
リクエストスコープ変数の格納先としても使用されています。
-
response
(ServletResponse
)
-
リクエストに対するレスポンスです。レスポンスヘッダや Cookie を設定するような場合に
使用します。request と同様にほぼすべてのサーブレットコンテナで
HttpServletResponse
にキャストすることができます。
-
pageContext
(PageContext
)
-
JSP で扱えるあらゆるのオブジェクトへアクセスできるオブジェクトです。
スコープ変数へのアクセスはなるべくこのオブジェクトに対して行うようにしてください
(そのほうが EL や JSTL を覚える時に多少楽です)。
page スコープのオブジェクトを管理しています。
page オブジェクトと紛らわしいですが、こちらは JSP の処理を行うたびに
新しく用意されるオブジェクトと考えてください。
-
session
(HttpSession
)
-
HTTP セッションです。セッションスコープのオブジェクトを管理しています。
<%@page%> ディレクティブで
session="false" を指定している JSP ではこの暗黙変数を使用
することはできません。
-
application
(ServletContext
)
-
getServletConfig().getServletContext() で得られたサーブレットコンテキストです。
このオブジェクトは Web アプリケーションの起動から終了まで有効です。
アプリケーションスコープのオブジェクトを管理しています。
-
out
(JspWriter
)
-
この JSP の出力先ストリームです。タグハンドラの処理のためバッファリング用の
ストリームに差し替えられることもありますが、サーブレットコンテナが暗黙的に
行うことなので意識する必要はありません。
-
config
(ServletConfig
)
-
この JSP に対するサーブレット設定です。
-
page
(Object
)
-
現在のリクエストを処理している JSP の実装クラスのインスタンスです。
これは JSP からコンパイルされたサーブレットのインスタンスと考えてもらってかまいません。
ページ内での this の代用品として用意されています。
Logger
用のクラス名を参照したり、
SingleThreadModel
のように同期化に使用するくらいしか用途が思いつきません。
ちなみにこの JSP の page オブジェクトは org.apache.jsp.recipes.java.jsp.misc_jsp
クラスです。
-
exception
(Throwable
)
-
<%@page%> ディレクティブで
isErrorPage="true" を指定している JSP がエラー発生時に呼び出された
時にのみ使用できる暗黙オブジェクトです。元のサーブレットや JSP で発生した
例外を参照するために使用します。