こんにちは。「Javaを復習する初心者」です。
JSPでJSTLというライブラリを使ってみました。今回はforEachタグを試しました。
このタグはfor文のような使い方、拡張for文のような使い方両方があります。また、特別な場合としてカンマ区切り文字列の各区切りで繰り返し処理を実行することが可能です。
begin属性とend属性
forEachタグではfor文と同じような使い方ができます。begin属性とend属性を使うと繰り返し処理ができます。例えば、以下のような記述です。
ソース
<c:forEach begin="1" end="3">
Hello.
</c:forEach>
結果
Hello. Hello. Hello.
brタグを出力していないので、「Hello.」が続けて表示されます。上記ではbeginが1、endが3なので3回表示されます。
step属性
step属性があり、繰り返しカウンタの値をstep属性に設定することができます。以下のように使います。
ソース
<c:forEach begin="1" end="8" step="2">
Hello.
</c:forEach>
結果
Hello. Hello. Hello. Hello.
上記ではbeginが1でstepが2なので、繰り返しカウンタが1, 3, 5, 7で「Hello.」が出力されます。なので4回分出力されています。
varStatus属性
forEachにはvarStatus属性という設定があり、これを使うと繰り返し処理中のステータスを取得することができます。いくつかあるのですが、以下ではindexとcountを表示させてみました。
ソース
<c:forEach begin="1" end="8" step="3" varStatus="status">
Hello. index: <c:out value="${status.index}" />. count: <c:out value="${status.count}" />.<br>
</c:forEach>
結果
Hello. index: 1. count: 1.
Hello. index: 4. count: 2.
Hello. index: 7. count: 3.
indexは繰り返しカウンタ、countは繰り返し回数が表示されました。
拡張for文のような使い方
以上、通常のfor文に似た使い方をしてみましたが、拡張for文のような使い方もできます。その場合、var属性とitems属性を使います。以下ではリクエストスコープのListの要素を順番に出力しています。
ソース
<%
List<String> list = new ArrayList<>();
list.add("Hello 1.");
list.add("Hello 2.");
request.setAttribute("list", list);
%>
<c:forEach var="item" items="${list}">
<c:out value="${item}" />
</c:forEach>
結果
Hello 1. Hello 2.
items属性に集合を指定し、var属性に集合の要素を表す変数を指定します。この属性の組み合わせが拡張for文に似ているところです。var属性に指定した変数の内容は、outタグを使ってを出力することができます。
以下のようにitems属性に配列を指定することも可能です。
ソース
<%
String[] strs = {"a", "b"};
request.setAttribute("strs", strs);
%>
<c:forEach var="item" items="${strs}">
<c:out value="${item}" />
</c:forEach>
結果
a b
カンマ区切り文字列
また、items属性にカンマ区切りのString型変数を指定することも可能です。
ソース
<c:set var="nums" value="11,12,13" />
<c:forEach var="item" items="${nums}">
<c:out value="${item}" /><br>
</c:forEach>
結果
11
12
13
カンマで区切られ、各要素が出力されていることが分かります。