如何使用JSTL forEach循环来实现自定义结构?

Lit*_*ski 2 html java foreach for-loop jstl

我的JSP中有一个模型属性(包含名称的List).例如myList

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

<c:forEach items="${myList}" var = "singleItem" varStatus="status">  
  ${singleItem.name}
</c:forEach>
Run Code Online (Sandbox Code Playgroud)

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

    <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>
Run Code Online (Sandbox Code Playgroud)

这里名称1,名称2等在myList.那么如何以这样的方式运行forEach循环,以便我可以实现上面显示的输出.我被卡住了.请帮我.:(

sku*_*sel 6

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

我肯定会遵循替代或"直接"方式,其中<div>必要时应插入所有"额外"标记标记(在您的情况下为标记),如:

<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>
Run Code Online (Sandbox Code Playgroud)

另请注意,您应该使用<div>for for style的id替换JSP中的重复ID.

  • 您还可以注意到`length`变量实际上是多余的,您可以通过更改`(status.index + 1 == length)`来简化`(status.last)`来进一步缩短代码.最初我想使用非零大小的长度作为`<c:if>`条件来包含整个`<c:forEach>`循环,但后来丢弃它,因为它也是多余的. (2认同)