<c:forEach>
xmlns:c="http://java.sun.com/jsp/jstl/core"

SYNOPSIS

<c:forEach
items="コレクションオブジェクト"
begin="数値"
end="数値"
step="1|数値"
var="変数名"
varStatus="変数名"
>
ループして評価する内容.
</c:forEach>

説 明

コレクション要素の列挙または回数指定のループを行います。

items 属性を指定した場合、コレクション (マップ、リスト、セット等) や配列の一つ一つを要素を列挙します。省略した場合は begin, end による回数指定のループを行います。

ただし Java のループと異なり break で途中終了したり continue で続行することはできません。どうしても必要であれば スクリプトレットを使用してください。

属 性

items="コレクションオブジェクト"
optional

列挙する要素のコレクションを指定します。値には以下のいずれかを指定することができます。

文字列型はコンマ区切りのトークンとして列挙されます。しかし EL の記述ミスで文字列を渡してしまうバグもよくあります。トークン列挙が意図した記述であることを明示する意味で、なるべく <c:forTokens> を使用してください。

begin, end, step 属性を指定することで特定の位置の要素だけが列挙の対象となります。 items 属性を省略した場合は begin, end, step 属性による回数指定のループとなります。

begin="数値"
optional

ループの開始位置を指定します。 items 属性が指定されている場合、この属性を省略するとインデックス 0 から列挙を行います。 items 属性を省略した場合はこの属性は必須です。

値は 0 以上を指定する必要があります。

end="数値"
optional

ループの終了位置を指定します。 items 属性が指定されている場合、この属性を省略するとコレクションの最後まで列挙を行います。 items 属性を省略した場合はこの属性は必須です。

値は 0 以上を指定する必要があります。

step="1|数値"
optional

ループのステップ数を指定します。値は 1 以上を指定する必要があります。

var="変数名"
optional

列挙中の要素を格納する変数名です。ループ内の処理でこの変数名を用いて要素にアクセスすることができます (スコープは page 固定になります)。

items 属性を指定している場合は、そのコレクションの現在の位置の要素が格納されます。 items を省略した場合は begin, end の範囲の現在の数値が java.lang.Integer として格納されます。

varStatus="変数名"
optional

ループ内の処理からループの状態を参照するための変数名を指定します。この変数名には LoopTagStatusJava™ API リファレンス のインスタンスが格納されます。

varStatus="status" としたループの中では以下のプロパティを参照することができます。

LoopTagStatus
${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 回出力します。
JSP
<c:forEach begin="1" end="3">
hello, world
</c:forEach>
実行結果
hello, world hello, world hello, world
var 属性で指定した変数を使用して現在の値を参照することができます。以下の例は 1 月から 12 月までのすべての略称を出力します。
JSP
<% 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
varStatuscount 要素は列挙の開始位置やステップに影響されないループの回数を表します。以下は上記と同様のコレクションで 2 月から 8 月までの偶数月を番号付きで出力します。
JSP
<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 属性に MapJava™ API リファレンス を指定した場合は Map.EntryJava™ API リファレンス の列挙となります。このインスタンスからは key, value というプロパティが参照できます。

JSP
<% 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> を使用した方が明示的です。
JSP
<% 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] 
CVS 2008/03/09