JSTL для каждого обратного порядка - PullRequest
25 голосов
/ 03 апреля 2009

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

Ответы [ 5 ]

34 голосов
/ 03 апреля 2009

Когда вы используете 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>

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

3 голосов
/ 23 апреля 2015

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

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

<%@ 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 голосов
/ 03 апреля 2009

Вы также можете рассмотреть возможность использования пользовательской функции 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;
}

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

0 голосов
/ 09 марта 2015

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

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

0 голосов
/ 23 сентября 2011

Мы можем сделать это с помощью небольшого трюка: -

<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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...