【问题标题】:JSTL forEach reverse orderJSTL forEach 逆序
【发布时间】:2010-10-17 06:10:42
【问题描述】:

使用JSTL的forEach标签,是否可以逆序迭代?

【问题讨论】:

标签: java jsp jstl


【解决方案1】:

当您使用forEach 创建整数循环时,您可以前进或后退,但这需要一些工作。事实证明你不能这样做,例如:

<c:forEach var="i" begin="10" end="0" step="-1">
    ....
</c:forEach>

因为规范要求步骤是肯定的。但是你总是可以按正序循环,然后使用&lt;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>

使用合适的比较器,您可以按任何所需的顺序遍历项目。这行得通。但我不知道有一种方法可以说,很简单,以相反的顺序迭代提供的集合。

【讨论】:

  • 我更新了我的答案,添加了一个代码示例,说明我如何以所需的顺序迭代集合。
  • 或者更好的是,按照将要使用的顺序创建集合。jsps 不是数据按摩的好地方。
  • Yow,-1 用于向某人展示如何做某事?我们只允许展示理想的方式?天哪。
  • @Eddie - 我没有否决您的答案,但是当我尝试您的解决方案时,我遇到了与此处所述相同的问题:stackoverflow.com/questions/3879248/…。所以这可能是它的原因,因为您的解决方案似乎并不总是有效(对我不起作用)。
  • 最初的问题是关于一个集合(参见上面的评论),并且有效。我更正了错误的部分。感谢您指出。
【解决方案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】:

    我们可以通过一些小技巧来做到这一点:-

    <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

    【讨论】:

    • 您所做的只是复制 OP 给出的链接中的内容。
    【解决方案4】:

    您可以在将其添加到您的模型之前reverse the Collection

    这也意味着您无需在视图层中执行任何操作即可满足您的要求。

    【讨论】:

      【解决方案5】:

      基于Eddie 给出的答案,我使用以下代码以相反的顺序遍历集合。

      给定一个名为“list”的集合,其中存储了人员列表。

      <%@ 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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-11
        • 1970-01-01
        • 2014-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多