web-dev-qa-db-fra.com

JSTL pourChaque ordre inverse

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

25
Steve Kuo

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.

34
Eddie

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.

3
harto

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

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.

0
yglodt

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 

0
Sunil Mahla