JSTL pour chaque ordre inverse

Utilisation de la JSTL forEach balise, est-il possible d'itérer dans l'ordre inverse?

24
demandé sur BalusC 2009-04-03 03:36:26

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.

33
répondu Eddie 2013-02-08 04:41:14

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.

3
répondu harto 2009-04-03 02:22:48

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>
3
répondu Ian 2017-05-23 10:30:37

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

0
répondu Sunil Mahla 2011-09-23 15:30:43

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.

0
répondu yglodt 2015-03-09 20:03:24