JSTL pour chaque ordre inverse
5 réponses
quand vous utilisez forEach
pour créer une boucle entière, vous pouvez aller de l'avant ou en arrière, mais cela nécessite du travail. Il s'avère que vous ne pouvez pas le faire, par exemple:
<c:forEach var="i" begin="10" end="0" step="-1">
....
</c:forEach>
parce que la spécification exige que l'étape est positive. Mais vous pouvez toujours boucler la boucle dans l'ordre d'avance et ensuite utiliser <c:var
pour convertir le nombre croissant en un nombre décroissant:
<c:forEach var="i" begin="0" end="10" step="1">
<c:var var="decr" value="${10-i}"/>
....
</c:forEach>
Cependant, quand vous faites un forEach
sur une Collection de quelque nature que ce soit, je n'ai connaissance d'aucun moyen de avoir les objets dans l'ordre inverse. Au moins, non sans d'abord trier les éléments dans l'ordre inverse et en utilisant forEach
.
j'ai navigué avec succès un forEach
boucle dans l'ordre désiré en faisant quelque chose comme ceci dans un 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 boucler les articles dans l'ordre désiré. Les travaux de cette. Mais je ne suis pas au courant d'une façon de dire, très simplement, itérer dans l'ordre inverse la collection fourni.
Vous pouvez également envisager de lancer une fonction JSTL personnalisée qui renvoie 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 S'appuyant sur la réponse de Eddie, j'ai utilisé le code suivant pour itérer une collection dans l'ordre inverse.
donne une collection appelée "list", 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>
on peut faire ça 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>
la sortie sera :- 10 9 8 7 6 5 4 3 2 1
Vous pourriez inverser la collecte avant de l'ajouter à votre modèle.
cela signifie également que vous n'aurez pas besoin de faire quoi que ce soit dans la couche de vue pour réaliser votre exigence.