JSTL для каждого обратного порядка

Используя тег JSTL forEach, можно ли выполнить итерацию в обратном порядке?


person Steve Kuo    schedule 02.04.2009    source источник
comment
Принятый ответ Эдди на этот вопрос может подойти не всем. По крайней мере, у меня это не сработало, используя реализацию JSTL 1.1 от Jakarta (Apache) и реализацию JSTL 1.2 от Sun (Oracle). Также спецификация требует, чтобы step было >=1. В качестве альтернативы см. stackoverflow.com/questions /3879248/   -  person BalusC    schedule 24.04.2011
comment
Хорошим объяснением декремента является http://stackoverflow.com/a/3883595/621951.   -  person Günay Gültekin    schedule 15.11.2012


Ответы (5)


Когда вы используете forEach для создания целочисленного цикла, вы можете идти вперед или назад, но это требует некоторой работы. Оказывается, вы не можете этого сделать, например:

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

потому что спецификация требует, чтобы шаг был положительным. Но вы всегда можете выполнить цикл в прямом порядке, а затем использовать <c:var для преобразования возрастающего числа в уменьшающееся число:

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

Однако, когда вы выполняете forEach над любой коллекцией, я не знаю, как можно расположить объекты в обратном порядке. По крайней мере, без предварительной сортировки элементов в обратном порядке и затем с использованием forEach.

Я успешно прошел цикл forEach в нужном порядке, выполнив в JSP что-то вроде следующего:

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


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

С помощью подходящего компаратора вы можете перебирать элементы в любом желаемом порядке. Это работает. Но я не знаю, как сказать, очень просто, повторить в обратном порядке предоставленную коллекцию.

person Eddie    schedule 02.04.2009
comment
Я обновил свой ответ, чтобы добавить пример кода того, как я перебирал коллекцию в нужном порядке. - person Eddie; 03.04.2009
comment
или, что еще лучше, создайте коллекцию в том порядке, в котором она будет использоваться. jsps — не лучшее место для массирования данных. - person Chii; 03.04.2009
comment
Йоу, -1 за то, что показал кому-то, как что-то делать? Нам разрешено показывать только идеальный путь? Боже. - person Eddie; 03.04.2009
comment
@Eddie - я не отрицал ваш ответ, но когда я попробовал ваше решение, у меня возникла та же проблема, что и здесь: stackoverflow.com/questions/3879248/. Так что это может быть причиной, так как ваше решение не всегда работает (не работает для меня). - person dcp; 26.12.2012
comment
Первоначальный вопрос был о коллекции (см. комментарий выше), и это сработало. Я исправил ту часть, которая была ошибочной. Спасибо, что указали на это. - person Eddie; 08.02.2013

Основываясь на ответе, данном Эдди, я использовал следующий код для перебора коллекции в обратном порядке.

Дана коллекция под названием «список», в которой хранится список людей.

<%@ 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>
person Ian    schedule 23.04.2015

Вы также можете рассмотреть возможность создания пользовательской функции JSTL, которая возвращает обратную копию вашего списка, подкрепленную чем-то вроде этого:

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

Не работает для коллекций, но, как упоминалось в другом ответе, концепция упорядочения для некоторых коллекций немного расплывчата.

person harto    schedule 03.04.2009

Мы можем сделать это с небольшой хитростью: -

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

Выход будет: - 10 9 8 7 6 5 4 3 2 1

person Sunil Mahla    schedule 23.09.2011
comment
Все, что вы сделали, это скопировали то, что находится в ссылке, указанной ОП. - person itsbruce; 11.11.2012

Вы можете обратить Коллекция перед добавлением ее в модель.

Это также означает, что вам не нужно ничего делать на уровне представления, чтобы выполнить ваше требование.

person yglodt    schedule 09.03.2015