スコープについて
当連載の説明でスコープという言葉を使用します。文字どおり「範囲」を指していますが、それはWebコンポーネントからアクセス可能な変数の範囲を指しています。意外と間違った指定の仕方を見かけますので、JSPの本題に入る前に説明します。スコープには表1の4種類が存在します。
| スコープ名 | JSPの暗黙オブジェクト | 型 |
| application | application | ServletContext |
| session | session | HttpSession |
| request | request | HttpServletRequest |
| page | pageContext | PageContext |
以下で、表内に記載されているスコープの概要を説明します。
application
型がServletContextのためよく誤解されるスコープです。あたかも1つのサーブレット内を指すように考えてしまいがちですが、型で判断するよりスコープ名称で判断すべきです。しかし、アプリケーションという非常に一般的な言葉が、JavaのWebアプリケーションの場合、どの範囲を指すのかが理解できなければ、applicationスコープの理解もできません。結論を言うと、コンテキストルート配下で構成されるアプリケーションを指します。Tomcatをご存知の方にはwebapps配下に配置するwarファイルを指すと言った方が分かりやすいでしょう。「Java EE 5 Tutorial」のp83のWebモジュール構造に従えば、Assembly Rootがコンテキストに相当します。つまりAssembly Root配下にあるWebコンポーネントすべてからアクセス可能な範囲をapplicationスコープと呼びます。
session
セッションという言葉は、クライアントとサーバの一連のやり取りを指します。セッション中、他のクライアント同士の変数やオブジェクトが見えてしまうと何かと不都合です。セッションの間、クライアント同士を隔離する範囲がsessionスコープです。第2回のServletの説明で、Servletにフィールド変数を定義すると、スレッド同士がその変数を奪い合い、期待した結果を得られない状況について解説しました。実はセッションの中に変数を格納すると、このような状況を回避できます。ただし、何も考えずにすべてのオブジェクトをセッションに入れると非常に重いアプリケーションになるため、他のスコープに格納しても大丈夫か検討する必要があります。
request
リクエストはクライアントからWebコンポーネントに要求が送られる間のみ保持されるスコープです。このスコープもクライアント同士を隔離しますが、1回のリクエスト内で保持されるのがrequestスコープです。
page
pageとは名前どおりJSP pageを指します。先述のとおり、JSPを記述するということは第2回のServletの説明のprocessRequestメソッドに相当するメソッドを記述するのと同義です。JSPで記述しているものはServletのメソッドを記述していることになるため、そこで定義したものはローカル変数となります。つまり、JSP内部のみからアクセスできる範囲がpageスコープです。
JSPの暗黙オブジェクトとはJSPにimportすることなしに、後述するスクリプトレットの中で使用できるオブジェクトです。上記4つのオブジェクトに加え、config、exception、out、page、responseがあります。
