Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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

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

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