<c:forEach>
SYNOPSIS
説 明
コレクション要素の列挙または回数指定のループを行います。
items 属性を指定した場合、コレクション (マップ、リスト、セット等)
や配列の一つ一つを要素を列挙します。省略した場合は begin, end
による回数指定のループを行います。
ただし Java のループと異なり break で途中終了したり continue で続行する ことはできません。どうしても必要であれば スクリプトレットを使用してください。
属 性
列挙する要素のコレクションを指定します。値には以下のいずれかを 指定することができます。
文字列型はコンマ区切りのトークンとして列挙されます。しかし EL の記述ミスで
文字列を渡してしまうバグもよくあります。トークン列挙が意図した記述である
ことを明示する意味で、なるべく
<c:forTokens>
を使用してください。
begin, end, step 属性を指定することで
特定の位置の要素だけが列挙の対象となります。
items 属性を省略した場合は begin, end,
step 属性による回数指定のループとなります。
ループの開始位置を指定します。
items 属性が指定されている場合、この属性を省略するとインデックス 0 から列挙を行います。
items 属性を省略した場合はこの属性は必須です。
値は 0 以上を指定する必要があります。
ループの終了位置を指定します。
items 属性が指定されている場合、この属性を省略するとコレクションの最後まで列挙を行います。
items 属性を省略した場合はこの属性は必須です。
値は 0 以上を指定する必要があります。
列挙中の要素を格納する変数名です。
ループ内の処理でこの変数名を用いて要素にアクセスすることができます
(スコープは page 固定になります)。
items 属性を指定している場合は、そのコレクションの現在の位置の要素が格納されます。
items を省略した場合は begin, end の範囲の現在の数値が
java.lang.Integer として格納されます。
ループ内の処理からループの状態を参照するための変数名を指定します。
この変数名には LoopTagStatus
のインスタンスが格納されます。
varStatus="status" としたループの中では以下のプロパティを参照することができます。
${status.current} … 現在の要素 (varで参照できるものと同じ)
${status.index} … begin/end/step による現在のインデックス
${status.count} … 最初のループを 1 とする現在のループ回数
${status.first} … 最初のループの場合 true
${status.end} … 最後のループの場合 true
${status.begin} … ループの開始インデックス
${status.end} … ループの終了インデックス
内 容
使用例
begin, end 属性の値は共にループ回数に含まれます。
以下の例は hello, world を 3 回出力します。
<c:forEach begin="1" end="3"> hello, world </c:forEach>
hello, world hello, world hello, world
var 属性で指定した変数を使用して現在の値を参照することができます。
以下の例は 1 月から 12 月までのすべての略称を出力します。
<% pageContext.setAttribute("col", new String[]{
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
}); %>
<c:forEach var="mon" items="${col}">
<c:out value="${mon}" />
</c:forEach>
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
varStatus の count 要素は列挙の開始位置やステップに影響されない
ループの回数を表します。
以下は上記と同様のコレクションで 2 月から 8 月までの偶数月を番号付きで出力します。
<c:forEach var="mon" begin="1" end="7" step="2" items="${col}" varStatus="s"> <c:out value="${s.count}" />.<c:out value="${mon}" /> </c:forEach>
1.Feb 2.Apr 3.Jun 4.Aug
番号を 0 から始めたい場合は ${s.count-1} としてください。
items 属性に
Map
を指定した場合は
Map.Entry
の列挙となります。このインスタンスからは key, value というプロパティが参照できます。
<% Map map = new HashMap();
map.put("Jan", "1月");
map.put("Feb", "2月");
map.put("Mar", "3月");
pageContext.setAttribute("map", map); %>
<c:forEach var="entry" items="${map}">
<c:out value="${entry.key}" />=<c:out value="${entry.value}" />
</c:forEach>
Feb=2月 Mar=3月 Jan=1月
items 属性に文字列を指定した場合はコンマ区切りのトークンを列挙しますが、
この場合は <c:forTokens>
を使用した方が明示的です。
<% pageContext.setAttribute("tokens",
"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec"
);%>
<c:forEach var="mon" items="${tokens}">
[<c:out value="${mon}" />]
</c:forEach>
[Jan] [Feb] [Mar] [Apr] [May] [Jun] [Jul] [Aug] [Sep] [Oct] [Nov] [Dec]