Используя тег JSTL forEach
, можно ли выполнить итерацию в обратном порядке?
JSTL для каждого обратного порядка
Ответы (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>
С помощью подходящего компаратора вы можете перебирать элементы в любом желаемом порядке. Это работает. Но я не знаю, как сказать, очень просто, повторить в обратном порядке предоставленную коллекцию.
Основываясь на ответе, данном Эдди, я использовал следующий код для перебора коллекции в обратном порядке.
Дана коллекция под названием «список», в которой хранится список людей.
<%@ 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>
Вы также можете рассмотреть возможность создания пользовательской функции 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;
}
Не работает для коллекций, но, как упоминалось в другом ответе, концепция упорядочения для некоторых коллекций немного расплывчата.
Мы можем сделать это с небольшой хитростью: -
<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
Вы можете обратить Коллекция перед добавлением ее в модель.
Это также означает, что вам не нужно ничего делать на уровне представления, чтобы выполнить ваше требование.
step
было>=1
. В качестве альтернативы см. stackoverflow.com/questions /3879248/ - person BalusC   schedule 24.04.2011