使用JSTL的forEach
标签,是否可以按相反的顺序迭代?
答案 0 :(得分:34)
当您使用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>
但是,当你对任何类型的Collection进行forEach
时,我不知道有任何方法让对象按相反的顺序排列。至少,不是先将元素排序为相反的顺序,然后使用forEach
然后。
我已成功通过在JSP中执行以下操作,按所需顺序导航forEach
循环:
<%
List list = (List)session.getAttribute("list");
Comparator comp = ....
Collections.sort(list, comp);
%>
<c:forEach var="bean" items="<%=list%>">
...
</c:forEach>
使用合适的Comparator,您可以按任何所需顺序遍历项目。这有效。但我不知道有一种说法,非常简单,以相反的顺序迭代所提供的集合。
答案 1 :(得分:3)
您还可以考虑滚动自定义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;
}
对于集合不起作用,但正如另一个答案中所提到的,对于某些集合,排序的概念有点模糊。
答案 2 :(得分:3)
在Eddie给出的答案的基础上,我使用以下代码以相反的顺序迭代集合。
给出一个名为&#34; list&#34;的集合,它存储了一个人的列表。
<%@ 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 :(得分:0)
我们可以用一点技巧来做到这一点: -
<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
答案 4 :(得分:0)
在将其添加到模型之前,您可以reverse the Collection。
这也意味着您无需在视图层中执行任何操作即可满足您的要求。