<%@variable%>
SYNOPSIS
| 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 されるかが明確になるという
利点があるため、なるべくこのディレクティブを使用することをお勧めします。
属 性
設定する変数の名前をタグファイルの中で固定的に決定する場合にその変数名を指定します。
他の <%@variable%> や <%@attribute%>
と同じ名前を使用することは出来ません。
設定する変数の名前を属性の値に基づいて決定します
(これは呼び出し元の JSP で変数名を決定する事を意味します)。
この属性を使用した場合は alias 属性も指定する必要があります。
ここで指定した属性は必須 (required="true") 及び実行時評価なし
(rtexprvalue="false") で宣言する必要があります。
他の <%@variable%> や <%@attribute%>
と同じ名前を使用することは出来ません。
このタグファイル内で該当変数を格納するための振り替え変数名です。
name-from-attributeを指定した場合は必須です。
この変数の値はscope 属性の値に応じたタイミングで
name-from-attribute で指定された変数に反映されます。
他の <%@variable%> や <%@attribute%>
と同じ名前を使用することは出来ません。
この変数を呼び出し側 JSP から参照可能にするタイミングです。 以下のいずれかを指定することが出来ます。
-
AT_BEGIN- タグの開始位置以降から参照可能。 -
AT_END- タグの終了位置以降から参照可能。 -
NESTED- タグの Body 内でのみ参照可能。
それぞれ具体的にどのような動きになるかはサンプルを参照してください。
使用例
x, y に設定します。
タグファイル内の変数 s は仮的なものであり、結果の最終的な反映先変数は呼び出し側の
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 属性がどのように作用するかを試行します。
<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}
<%@ 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 から見えるようになります。