Используя тег JSTL forEach
, можно ли итерации в обратном порядке?
JSTL для каждого обратного порядка
Ответ 1
Когда вы используете 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>
С помощью подходящего компаратора вы можете перебрать элементы в любом желаемом порядке. Это работает. Но я не знаю, как сказать, очень просто, повторить в обратном порядке представленную коллекцию.
Ответ 2
Вы также можете рассмотреть возможность перепрограммирования пользовательской функции 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;
}
Не работает для коллекций, но, как упоминалось в другом ответе, концепция упорядочения немного расплывчата для некоторых коллекций.
Ответ 3
Основываясь на ответе Eddie, я использовал следующий код для итерации по коллекции в обратном порядке.
Для коллекции, называемой "список", в которой хранится список людей.
<%@ 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>
Ответ 4
Мы можем сделать это с помощью небольшого трюка: -
<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 будет: - 10 9 8 7 6 5 4 3 2 1
Ответ 5
Вы можете отменить коллекцию перед добавлением ее в свою модель.
Это также означает, что вам не нужно ничего делать на уровне представления, чтобы достичь ваших требований.