<%@variable%>
JSP 2.0 以降

SYNOPSIS

<%@variable
name-given†1="変数名"
name-from-attribute†1="変数名"
alias="変数名"
variable-class="java.lang.String|クラス完全限定名"
declare="true|false"
scope="AT_BEGIN|AT_END|NESTED"
description="説明"
%>

説 明

このタグファイル中で使用した変数を呼び出し元の JSP からも参照できるようにします (Unix シェルの export に似ています)。 <%@attribute%> を IN パラメータ宣言とするなら、この <%@variable%> は OUT パラメータ宣言に相当します。

同等の効果は request 以上のスコープ変数に直接値を設定しても得られますが、ディレクティブを見ればこのタグファイルでどのような変数が Export されるかが明確になるという利点があるため、なるべくこのディレクティブを使用することをお勧めします。

属 性

name-given="変数名"
selective required 1

設定する変数の名前をタグファイルの中で固定的に決定する場合にその変数名を指定します。

他の <%@variable%><%@attribute%> と同じ名前を使用することは出来ません。

name-from-attribute="変数名"
selective required 1

設定する変数の名前を属性の値に基づいて決定します (これは呼び出し元の JSP で変数名を決定する事を意味します)。この属性を使用した場合は alias 属性も指定する必要があります。

ここで指定した属性は必須 (required="true") 及び実行時評価なし (rtexprvalue="false") で宣言する必要があります。

他の <%@variable%><%@attribute%> と同じ名前を使用することは出来ません。

alias="変数名"
optional

このタグファイル内で該当変数を格納するための振り替え変数名です。 name-from-attributeを指定した場合は必須です。この変数の値はscope 属性の値に応じたタイミングで name-from-attribute で指定された変数に反映されます。

他の <%@variable%><%@attribute%> と同じ名前を使用することは出来ません。

variable-class="java.lang.String|クラス完全限定名"
optional

変数のクラス名です。int などのプリミティブ型は指定できません。

declare="true|false"
optional

この変数が既に宣言されているかどうかを指定します。

scope="AT_BEGIN|AT_END|NESTED"
optional

この変数を呼び出し側 JSP から参照可能にするタイミングです。以下のいずれかを指定することが出来ます。

  • AT_BEGIN - タグの開始位置以降から参照可能。
  • AT_END - タグの終了位置以降から参照可能。
  • NESTED - タグの Body 内でのみ参照可能。

それぞれ具体的にどのような動きになるかはサンプルを参照してください。

description="説明"
optional
この変数の説明用テキストを記述する属性です。

使用例

タグファイルの処理結果を変数 x, y に設定します。タグファイル内の変数 s は仮的なものであり、結果の最終的な反映先変数は呼び出し側の JSP で指定している点に注目してください。
JSP
<sample:circle var="x" r="1" />
<sample:circle var="y" r="2" />
x := ${x}
y := ${y}

--- タグファイル
<%@ tag language="java" pageEncoding="UTF-8" body-content="empty" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ attribute name="r" required="true" type="java.lang.Double" %>
<%@ attribute name="var" required="true" rtexprvalue="false" %>
<%@ variable name-from-attribute="var" alias="s" scope="AT_END" %>
<c:set var="s" value="${3.14 * r * r}" />

--- 実行結果
x := 3.14
y := 12.56
タグの開始/終了に対して scope 属性がどのように作用するかを試行します。
JSP
<c:set var="at_begin" value="タグ前の設定値" />
<c:set var="at_end"   value="タグ前の設定値" />
<c:set var="nested"   value="タグ前の設定値" />
<c:set var="parent"   value="タグ前の設定値" />
at_begin = ${at_begin}
at_end   = ${at_end}
nested   = ${nested}
parent   = ${parent}
body     = ${body}
child    = ${child}
<sample:test>
<c:set var="body"     value="Body 内の設定値" />
at_begin = ${at_begin}
at_end   = ${at_end}
nested   = ${nested}
parent   = ${parent}
body     = ${body}
child    = ${child}
</sample:test>
at_begin = ${at_begin}
at_end   = ${at_end}
nested   = ${nested}
parent   = ${parent}
body     = ${body}
child    = ${child}
タグファイルの中ではそれぞれの変数にスコープを設定して上書き設定しています。
JSP
<%@ variable name-given="at_begin" scope="AT_BEGIN" %>
<%@ variable name-given="at_end" scope="AT_END" %>
<%@ variable name-given="nested" scope="NESTED" %>
--- タグ内 (開始前) ---
at_begin = ${at_begin}
at_end   = ${at_end}
nested   = ${nested}
parent   = ${parent}
body     = ${body}
child    = ${child}
<c:set var="at_begin" value="タグ中の設定値" />
<c:set var="at_end"   value="タグ中の設定値" />
<c:set var="nested"   value="タグ中の設定値" />
<c:set var="child"    value="タグ中の設定値" />
--- タグの開始位置 ---
<jsp:doBody />
--- タグの終了位置 ---
at_begin = ${at_begin}
at_end   = ${at_end}
nested   = ${nested}
parent   = ${parent}
body     = ${body}
child    = ${child}
--- タグ内 (終了後) ---
実行結果は以下のようになりました (余分な空行は削除)。
実行結果
at_begin = タグ前の設定値
at_end   = タグ前の設定値
nested   = タグ前の設定値
parent   = タグ前の設定値
body     = 
child    = 
--- タグ内 (開始前) ---
at_begin = 
at_end   = 
nested   = 
parent   = 
body     = 
child    = 
--- タグの開始位置 ---
at_begin = タグ中の設定値
at_end   = タグ前の設定値
nested   = タグ中の設定値
parent   = タグ前の設定値
body     = Body内の設定値
child    = 
--- タグの終了位置 ---
at_begin = タグ中の設定値
at_end   = タグ中の設定値
nested   = タグ中の設定値
parent   = 
body     = 
child    = タグ中の設定値
--- タグ内 (終了後) ---
at_begin = タグ中の設定値
at_end   = タグ中の設定値
nested   = タグ前の設定値
parent   = タグ前の設定値
body     = Body内の設定値
child    = 

AT_BEGIN は Body とそれ以降で、 AT_END はタグ以降で、NESTED は Body 内のみで有効になります (さらに NESTED はちゃんと以前の値を復元してくれました)。

また JSP で使用している変数はタグファイル内から見えず、タグファイルで使用している変数は JSP から見えないことも確認できます (いずれも page スコープ変数)。Body 内で設定した値もタグが終了すればまた JSP から見えるようになります。

CVS 2008/03/09