JSTLのforEach
タグを使用すると、逆の順序で繰り返すことができますか?
forEach
を使用して整数ループを作成する場合は、前方または後方に移動できますが、いくつかの作業が必要です。たとえば、これは実行できないことがわかります。
<c:forEach var="i" begin="10" end="0" step="-1">
....
</c:forEach>
仕様はステップが正であることを要求するためです。ただし、常に順方向にループしてから、<c:var
を使用して、増加する数値を減少する数値に変換できます。
<c:forEach var="i" begin="0" end="10" step="1">
<c:var var="decr" value="${10-i}"/>
....
</c:forEach>
ただし、任意の種類のコレクションに対してforEach
を実行している場合、オブジェクトを逆の順序にする方法はわかりません。少なくとも、最初に要素を逆順でソートし、forEach
を使用してthenを使用する必要があります。
JSPで次のようなことを実行して、forEach
ループを目的の順序で正常にナビゲートしました。
<%
List list = (List)session.getAttribute("list");
Comparator comp = ....
Collections.sort(list, comp);
%>
<c:forEach var="bean" items="<%=list%>">
...
</c:forEach>
適切なコンパレータを使用すると、アイテムを任意の順序でループできます。これは機能します。しかし、私は、非常に簡単に言うと、提供されたコレクションを逆の順序で反復する方法を知りません。
次のようなものに裏付けられた、リストの逆のコピーを返すカスタムJSTL関数をローリングすることも検討できます。
public static <T extends Object> List<T> reverse(List<T> list) {
List<T> copy = Collections.emptyList();
Collections.copy(copy, list);
Collections.reverse(copy);
return copy;
}
コレクションでは機能しませんが、別の回答で述べたように、一部のコレクションでは順序付けの概念が少しあいまいです。
Eddie によって与えられた答えに基づいて、次のコードを使用してコレクションを逆順で反復しました。
人のリストを格納する「リスト」と呼ばれるコレクションがあるとします。
<%@ taglib uri="http://Java.Sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://Java.Sun.com/jsp/jstl/functions" prefix="fn"%>
<%-- Keep a reference to the size of the collection --%>
<c:set var="num_people" value="${fn:length(list)}" />
<%-- Iterate through items. Start at 1 to avoid array index out of bounds --%>
<c:forEach var="i" begin="1" end="${num_people}" step="1">
<c:set var="person" value="${list[num_people-i]}" />
${person.name}<br />
</c:forEach>
モデルに追加する前に コレクションを元に戻す を行うことができます。
これは、要件を達成するためにビューレイヤーで何もする必要がないことも意味します。
これは少しトリックで行うことができます:-
<c:forEach begin="1" end="10" var="i" step="1">
<c:set var="j" value="${10-i+1}" scope="page"></c:set>
<c:out value="${j}"/>
</c:forEach>
OutPutは次のようになります:-10 9 8 7 6 5 4 3 2 1