JSPのスコープをちゃんと使いこなせてますか?:やり直し「JSPとTomcat」(9)(1/2 ページ)
Javaを途中までかじったが挫折した。やはりJavaプログラマにスキルチェンジしたい! という読者のために、Tomcatの最新バージョンを使いながらJSPを基礎から解説していく。(編集部)
useBeanタグとスクリプティング変数
第6回 「JSPのアクションを理解する」で説明したとおり、JSPのアクションには、以下の2種類が存在します。
- 標準アクション
- カスタムタグ
「標準アクション」とは、JSP仕様においてあらかじめ規定されているアクションを指します。今回は、標準アクションの中でも頻繁に用いられる<jsp:useBean>タグの使い方について説明します。
以下のJSPページは、同タグの利用例です。
<%@ page contentType="text/html; charset=Shift_JIS" %> <jsp:useBean id="now" class="java.util.Date" /> <html> <head> <title>JSPサンプル</title> </head> <body> こんにちは、今の日時は <%= now %> です。 </body> </html>
この<jsp:useBean>タグは、以下のような機能を提供します。
- id属性で指定した「スクリプティング変数」が、スコープ内に存在するか確認する
- スクリプティング変数が存在しない場合、class属性で指定したJavaクラスのオブジェクトを生成し、それを格納したスクリプティング変数を作成する
ここでいう「スクリプティング変数(scripting variable)」とは、JSPのスクリプトレットや標準アクション、EL(Expression Language)にて読み書きできる変数です。Java言語の変数と似ていますが、スクリプティング変数はあくまでJSP固有の機能であることに注意してください。
上記のコード例では、まず、id属性で指定したスクリプティング変数「now」がスコープ内(これについては、後述します)で作成済みかどうか調べます。作成済みでない場合は、class属性で指定した「Date」クラスのオブジェクトを1つ生成し、now変数にセットします。その後、JSPページの後半にある「<%= now %>」というスクリプトレットにより、now変数にセットされたDateオブジェクトを文字列に変換したもの、すなわち現在の日時がブラウザに表示される仕組みです。
スクリプティング変数の「スコープ」を理解する
さて、上述のコード例では省略していましたが、useBeanタグでは「scope属性」を指定できます。
<jsp:useBean id="now" class="java.util.Date" scope="request"/>
このscope属性は、id属性で指定したスクリプティング変数の「スコープ」を指定します。このスコープとは、「変数の有効範囲」を表すもので、以下の4種類のスコープのいずれかを指定できます。ちなみに、先ほどのコード例のようにscope属性を省略した場合は、デフォルトのpageスコープが選択されます。
スコープ | 変数の有効範囲 |
---|---|
page | JSPページ |
request | HTTPリクエスト |
session | HTTPセッション |
application | Webアプリケーション |
表 スクリプティング変数の4種類のスコープ |
以下、各スコープの意味と使い方について説明します。
pageスコープはローカル変数と同じ
pageスコープとは、「スクリプティング変数の有効範囲がJSPページ内である」ことを意味します。
例えば、先ほどのコード例において、useBeanタグによって作成されたnow変数は、同じJSPページ内にあるスクリプトレット「<%= now %>」にて参照できますが、同ページの外(例えば、ほかのJSPページ)から参照できません。
pageスコープのスクリプティング変数は、それが作成されたJSPページの処理が終わると有効範囲外となり、メモリから削除されます。
例えば、上記コード例をWebブラウザで表示した後、リロードボタンをクリックしてみると、クリックするたびに日時が更新されることが分かります。つまり、JSPページの処理が繰り返されるごとにnow変数が作り直されているのです。
これはちょうど、Javaのローカル変数と同様の振る舞いです。よって、pageスコープのスクリプティング変数は、ローカル変数的な目的(JSPページ内での処理結果を一時的に保持するなど)に使用します。
Copyright © ITmedia, Inc. All Rights Reserved.