wake-up-neo.net

JSTL für Jede umgekehrte Reihenfolge

Kann man mit dem forEach-Tag von JSTL in umgekehrter Reihenfolge iterieren?

25
Steve Kuo

Wenn Sie forEach verwenden, um eine Ganzzahlschleife zu erstellen, können Sie vorwärts oder rückwärts gehen, dies erfordert jedoch einige Arbeit. Es stellt sich heraus, dass Sie dies beispielsweise nicht tun können:

<c:forEach var="i" begin="10" end="0" step="-1">
    ....
</c:forEach>

weil die Spezifikation erfordert, dass der Schritt positiv ist. Sie können jedoch immer eine Schleife vorwärts ausführen und dann mit <c:var die steigende Nummer in eine dekrementierende Nummer konvertieren:

<c:forEach var="i" begin="0" end="10" step="1">
   <c:var var="decr" value="${10-i}"/>
    ....
</c:forEach>

Wenn Sie jedoch eine forEach über eine Collection jeglicher Art ausführen, ist mir keine Möglichkeit bekannt, die Objekte in umgekehrter Reihenfolge zu haben. Zumindest nicht ohne die Elemente zuerst in umgekehrter Reihenfolge zu sortieren und dann mit forEach.

Ich habe eine forEach-Schleife in der gewünschten Reihenfolge erfolgreich navigiert, indem ich in einer JSP wie folgt vorging:

<%
List list = (List)session.getAttribute("list");
Comparator comp = ....
Collections.sort(list, comp);
%>


<c:forEach var="bean" items="<%=list%>">
     ...
</c:forEach>

Mit einem geeigneten Komparator können Sie die Artikel in beliebiger Reihenfolge durchlaufen. Das funktioniert. Ich weiß jedoch nicht, wie ich sagen kann, dass die Sammlung in umgekehrter Reihenfolge wiederholt wird.

34
Eddie

Sie könnten auch eine angepasste JSTL-Funktion ausführen, die eine umgekehrte Kopie Ihrer Liste zurückgegeben hat, die etwa wie folgt abgesichert ist:

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;
}

Funktioniert nicht für Sammlungen, aber wie in einer anderen Antwort erwähnt, ist das Konzept der Bestellung für einige Sammlungen etwas vage.

3
harto

Aufbauend auf der Antwort von Eddie habe ich den folgenden Code verwendet, um eine Sammlung in umgekehrter Reihenfolge zu durchlaufen.

Gegeben eine Sammlung namens "Liste", die eine Liste von Personen speichert.

<%@ 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>
3
Ian

Sie könnten die Sammlung umkehren , bevor Sie sie Ihrem Modell hinzufügen.

Dies bedeutet auch, dass Sie nichts in der Ansichtsebene tun müssen, um Ihre Anforderungen zu erfüllen.

0
yglodt

Wir können dies mit einem kleinen Trick tun: -

<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 wird sein: - 10 9 8 7 6 5 4 3 2 1 

0
Sunil Mahla