jstl foreach省略了最后一条记录中的元素

时间:2010-06-23 05:56:15

标签: jsp jstl

尝试使用这个jstl来制定一个json字符串,我怎么能让段不在最后一条记录的末尾加一个逗号?请注意最后的逗号

<c:forEach items="${fileList}" var="current">
    { id:1001,data:["<c:out value="${current.fileName}" />" , "<c:out value="${current.path}" />" , "<c:out value="${current.size}" />" , "<c:out value="${current.type}" />"] },
</c:forEach>

3 个答案:

答案 0 :(得分:155)

只需使用LoopTagStatus#isLast()

<c:forEach items="${fileList}" var="current" varStatus="loop">
    { id: 1001,
      data: [
        "<c:out value="${current.fileName}" />",
        "<c:out value="${current.path}" />",
        "<c:out value="${current.size}" />",
        "<c:out value="${current.type}" />"
      ]
    }<c:if test="${!loop.last}">,</c:if>
</c:forEach>

您也可以在EL中使用条件运算符而不是<c:if>

    ${!loop.last ? ',' : ''}

答案 1 :(得分:3)

我从未喜欢JSTL的一件事(实际上我认为是唯一的:) :)事实是无法检索列表/集合的大小。

编辑:好的,所以有可能但我不知道:( see here

forEach标记具有varStatus属性,可用于确定index变量上行(count / varStatus属性的索引)但你必须测试你是否在列表中的最后位置,这意味着事先有列表大小:

<c:forEach items="${fileList}" var="current" varStatus="status">
   ...
  <c:if test="${not (status.count eq listSize)}">,</c:if>
</c:forEach>

但在进行此类操作之前,您必须手动将listSize置于范围内。

我在我的一个项目中做的是创建一个带有集合并返回值的标记:

  <myLib:collectionSize collection="${fileList}" var="listSize" />
  <c:forEach items="${fileList}" var="current" varStatus="status">
     ...
    <c:if test="${not (status.count eq listSize)}">,</c:if>
  </c:forEach>

如果您经常使用这种代码,也可以这样做(否则您可以将其添加到范围内,方便您使用)。

答案 2 :(得分:3)

<{3>} Check a collection size with JSTL 答案是使用函数标签

将它放在页面顶部以允许fn名称空间

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

并在你的jsp页面中使用这样的东西

<p>The length of the companies collection is : ${fn:length(companies)}</p>