【问题标题】:How to loop using JSTL forEach to achieve custom structure?如何使用 JSTL forEach 循环实现自定义结构?
【发布时间】:2013-03-21 19:19:44
【问题描述】:

我的 JSP 中有一个模型属性(它是一个包含名称的列表)。例如myList

现在我可以使用 forEach 轻松遍历 JSP 中的列表,例如

<c:forEach items="${myList}" var = "singleItem" varStatus="status">  
  ${singleItem.name}
</c:forEach>

这很好用。 现在我的要求是我有一个需要展示的结构:

    <div id="top"></div>
      <p>name1</p>
      <p>name2</p>
    <div id="bottom"></div>

    <div id="top"></div>
      <p>name3</p>
      <p>name4</p>
    <div id="bottom"></div>

    <div id="top"></div>
      <p>name5</p>
      <p>name6</p>
    <div id="bottom"></div>

name1、name2 等在 myList 中。那么如何运行 forEach 循环以实现上述输出。 我被困住了。请帮我。 :(

【问题讨论】:

标签: java html for-loop foreach jstl


【解决方案1】:

虽然我个人赞成的 Sotirios 答案以及 skaffman 最初提出的答案是最初问题的一个非常聪明的解决方法,但它可能会导致 NPE 或需要事先进行一些检查。

我肯定会遵循替代方法或“直接”方式,在必要时应插入所有“额外”标记标签(在您的情况下为 &lt;div&gt; 标签),例如:

<c:set var="length" value="${fn:length(myList)}"/>
<c:forEach items="${myList}" var = "singleItem" varStatus="status">
    <c:if test="${status.index % 2 == 0}">
        <div class="top"></div>
    </c:if>
    <p>${singleItem.name}</p>
    <c:if test="${(status.index % 2 == 1) or (status.index + 1 == length)}">
        <div class="bottom"></div>
    </c:if>
</c:forEach>

另外请注意,您应该将 &lt;div&gt; 的 id 替换为样式类,以防止 JSP 中出现重复的 id。

【讨论】:

  • 太棒了。这是一个优雅的解决方案。非常感谢,臭鼬。也感谢@Sotirios!让我在我的代码上实现它,然后将其标记为答案。谢谢大家,它为我节省了很多时间和头痛!
  • 您也可以注意到length 变量确实是多余的,您可以通过将(status.index + 1 == length) 更改为简单的(status.last) 来进一步缩短代码。最初我想使用非零大小的长度作为&lt;c:if&gt; 条件来包含整个&lt;c:forEach&gt; 循环,但后来放弃了它,因为它也是多余的。
【解决方案2】:

使用varStatusstep 属性每次访问两个列表索引。

<c:forEach items="${myList}" var="singleItem" varStatus="status" step="2">  
    <div id="top"></div>
        <p>${myList[status.index].name}</p>
        <p>${myList[status.index+1].name}</p>
    <div id="bottom"></div>
</c:forEach>

您将按索引访问列表,而不是使用var。你显然应该检查你是否有偶数个元素,否则你可能会得到 NPE。

【讨论】:

  • 哇,这看起来很整洁。感谢您的解决方案。但列表甚至可以包含奇数个元素。如何解决这个问题?
  • 查看@skuntsel 的回答。
猜你喜欢
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
  • 2014-03-03
  • 2014-08-25
  • 2012-03-04
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
相关资源
最近更新 更多