連載
» 2007年01月20日 00時00分 公開

やり直し「JSPとTomcat」(9):JSPのスコープをちゃんと使いこなせてますか? (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固有の機能であることに注意してください。

編集部注:EL(Expression Language)について詳しく知りたい読者は、@IT XML & SOAフォーラムの記事「XULとJSFでリッチクライアント ?JSF編? Page 2」を参照してください。

 上記のコード例では、まず、id属性で指定したスクリプティング変数「now」がスコープ内(これについては、後述します)で作成済みかどうか調べます。作成済みでない場合は、class属性で指定した「Date」クラスのオブジェクトを1つ生成し、now変数にセットします。その後、JSPページの後半にある「<%= now %>」というスクリプトレットにより、now変数にセットされたDateオブジェクトを文字列に変換したもの、すなわち現在の日時がブラウザに表示される仕組みです。

図 useBeanタグの実行例 図 useBeanタグの実行例

スクリプティング変数の「スコープ」を理解する

 さて、上述のコード例では省略していましたが、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ページ内での処理結果を一時的に保持するなど)に使用します。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。