JSP 仕様

属性のスコープ

属性スコープ

JSP で使用できる属性は 4 種類のスコープのいずれかに所属しています。

page (PageContext.PAGE_SCOPEJava™ API リファレンス)

処理中の JSP 内からのみアクセス可能な変数スコープです。 このスコープに格納されているオブジェクトは JSP の処理が終了すれば 自動的に開放される (他に参照がなければ GC の対象となる) ため、JSP 内でのローカル変数と同じように使用することができます。

より具体的には JSP からコンパイルされたサーブレットの service() が終了する時に開放されます。これは JSP が送信処理を完了するか、forward を行う までということを意味しています。

同じ JSP が複数のリクエストを同時に処理している場合でもスコープ領域は 個別に用意されるためオブジェクトが共用されることはありません。また forwardinclude による呼び出し先/呼び出し元の page スコープに影響を与える事はありません。

request (PageContext.REQUEST_SCOPEJava™ API リファレンス)

リクエストスコープは同一のリクエスト処理で共用される領域です。 include や forward で複数のサーブレット/ JSP が実行されたとしても、 同一のリクエスト内であればスコープ内の変数を共有することができます。 また複数のリクエストが同時に処理されている状況でもそれらはすべて 独立したリクエストスコープを持っています。

このスコープの変数はリクエストに対するすべての処理が終了したときに 開放されます。このため forward 先との一時的なデータ受け渡し領域と して使用されます。

session (PageContext.SESSION_SCOPEJava™ API リファレンス)

セッションスコープはユーザのセッションに関連付けられた領域です。 いくつものリクエストが実行され、複数のサーブレット / JSP が実行されたとしても それが同じユーザによるものであれば (なおかつタイムアウトしたり無効化されなければ) 同じセッションスコープ内の変数を共有できます。

このスコープに格納されたオブジェクトはユーザのセッションが終了するまで維持されます。 このためデータベースなどに保存されているユーザ固有の情報などをメモリ上にキャッシュして おいたり、確定前の入力情報を一時的に保持しておくような目的で使用します。

<%@page%> 命令で session="false" を指定している JSP からセッションにオブジェクトを設定することはできません。

application (PageContext.APPLICATION_SCOPEJava™ API リファレンス)

アプリケーションスコープは Web アプリケーション (サーブレットコンテキスト) が 起動してから終了するまで有効な領域です。このスコープに格納したオブジェクトは 全ユーザの全リクエストで共有されるため、システム全体で共有する情報 (メッセージ リソースデータソースなど) が設定されます。

<%@page%> 命令で session="false" とした JSP からでもアプリケーションスコープを参照することができます。

検索順序

同じスコープ内に同じ名前を持つオブジェクトは一つしか存在できません。 しかしスコープが異なれば同じ名前のオブジェクトを保持することができます。 JSP アクションタグや JSTL でスコープを省略して変数を参照した場合、 PageContext#findAttribute()Java™ API リファレンス を使用してオブジェクトを参照します。このメソッドは page, request, session (もしあれば), application の順に名前に該当するオブジェクトを 探してゆき、最初に見つかったものを返します。 また変数のオブジェクトを削除する場合でもこの優先順位で行われます。

スコープの異なる同名の変数を使用していてもそれらが正しく扱われている限りは問題ありません。 しかし session スコープから削除するつもりのオブジェクトが既に存在して おらず application スコープの同名のオブジェクトが削除されてしまったり、 page スコープのマップにメッセージを設定したつもりが application スコープのメッセージマップを変更してしまった、などという 状況は非常に分かりにくいバグとして現れると予想されます。スコープの異なる同名のオブジェクト を扱う場合は面倒でもスコープを明示しながら使用する事をお勧めします。

暗黙オブジェクト

JSP 内のスクリプトレットで宣言なしで使用できる暗黙オブジェクトです (EL の暗黙オブジェクトとは別物です)。 これらは JSP からコンパイルされたサーブレットの中でローカル変数宣言されています。 なお、スクリプトレットで使用する変数を新たに宣言場合、jsp, _jsp, jspx, _jspx から始まる変数名は 大文字小文字区別せず予約されています。

request (ServletRequestJava™ API リファレンス)

現在の処理を行っているリクエストです。仕様上の型は ServletRequest であり、 サブクラスが何であるかの規定はありませんが、ほぼすべてのサーブレットコンテナで HttpServletRequestJava™ API リファレンス にキャストすることができます。

リクエストスコープ変数の格納先としても使用されています。

response (ServletResponseJava™ API リファレンス)

リクエストに対するレスポンスです。レスポンスヘッダや Cookie を設定するような場合に 使用します。request と同様にほぼすべてのサーブレットコンテナで HttpServletResponseJava™ API リファレンス にキャストすることができます。

pageContext (PageContextJava™ API リファレンス)

JSP で扱えるあらゆるのオブジェクトへアクセスできるオブジェクトです。 スコープ変数へのアクセスはなるべくこのオブジェクトに対して行うようにしてください (そのほうが EL や JSTL を覚える時に多少楽です)。 page スコープのオブジェクトを管理しています。

page オブジェクトと紛らわしいですが、こちらは JSP の処理を行うたびに 新しく用意されるオブジェクトと考えてください。

session (HttpSessionJava™ API リファレンス)

HTTP セッションです。セッションスコープのオブジェクトを管理しています。 <%@page%> ディレクティブで session="false" を指定している JSP ではこの暗黙変数を使用 することはできません。

application (ServletContextJava™ API リファレンス)

getServletConfig().getServletContext() で得られたサーブレットコンテキストです。 このオブジェクトは Web アプリケーションの起動から終了まで有効です。 アプリケーションスコープのオブジェクトを管理しています。

out (JspWriterJava™ API リファレンス)

この JSP の出力先ストリームです。タグハンドラの処理のためバッファリング用の ストリームに差し替えられることもありますが、サーブレットコンテナが暗黙的に 行うことなので意識する必要はありません。

config (ServletConfigJava™ API リファレンス)

この JSP に対するサーブレット設定です。

page (ObjectJava™ API リファレンス)

現在のリクエストを処理している JSP の実装クラスのインスタンスです。 これは JSP からコンパイルされたサーブレットのインスタンスと考えてもらってかまいません。 ページ内での this の代用品として用意されています。 LoggerJava™ API リファレンス 用のクラス名を参照したり、 SingleThreadModelJava™ API リファレンス のように同期化に使用するくらいしか用途が思いつきません。

ちなみにこの JSP の page オブジェクトは org.apache.jsp.recipes.java.jsp.misc_jsp クラスです。

exception (ThrowableJava™ API リファレンス)

<%@page%> ディレクティブで isErrorPage="true" を指定している JSP がエラー発生時に呼び出された 時にのみ使用できる暗黙オブジェクトです。元のサーブレットや JSP で発生した 例外を参照するために使用します。