À l'aide de la balise forEach
de JSTL, est-il possible d'itérer dans l'ordre inverse?
Lorsque vous utilisez forEach
pour créer une boucle entière, vous pouvez avancer ou revenir en arrière, mais cela nécessite un peu de travail. Il s'avère que vous ne pouvez pas faire cela, par exemple:
<c:forEach var="i" begin="10" end="0" step="-1">
....
</c:forEach>
parce que la spécification nécessite que l’étape soit positive. Mais vous pouvez toujours boucler en ordre aval, puis utiliser <c:var
pour convertir le nombre incrémentiel en un nombre décrémentant:
<c:forEach var="i" begin="0" end="10" step="1">
<c:var var="decr" value="${10-i}"/>
....
</c:forEach>
Cependant, lorsque vous faites une forEach
sur une collection, je ne suis au courant d'aucun moyen d'avoir les objets dans l'ordre inverse. Du moins, non sans avoir d'abord trié les éléments dans l'ordre inverse et puis avec forEach
.
J'ai réussi à naviguer dans une boucle forEach
dans l'ordre souhaité en procédant comme suit dans un fichier JSP:
<%
List list = (List)session.getAttribute("list");
Comparator comp = ....
Collections.sort(list, comp);
%>
<c:forEach var="bean" items="<%=list%>">
...
</c:forEach>
Avec un comparateur approprié, vous pouvez parcourir les éléments dans l'ordre de votre choix. Cela marche. Mais je ne suis pas au courant d’une façon de dire, très simplement, de parcourir la collection dans l’ordre inverse.
Vous pouvez également envisager de lancer une fonction JSTL personnalisée qui a renvoyé une copie inversée de votre liste, appuyée par quelque chose comme ceci:
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;
}
Ne fonctionne pas pour les collections, mais comme mentionné dans une autre réponse, le concept de commande est un peu vague pour certaines collections.
En me basant sur la réponse donnée par Eddie , j’ai utilisé le code suivant pour parcourir une collection dans l’ordre inverse.
Étant donné une collection appelée "liste", qui stocke une liste de personnes.
<%@ 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>
Vous pouvez inverser la collection avant de l'ajouter à votre modèle.
Cela signifie également que vous n'avez rien à faire dans la couche de vue pour répondre à vos besoins.
Nous pouvons le faire avec un petit truc: -
<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 sera: - 10 9 8 7 6 5 4 3 2 1