Подтвердить что ты не робот

Jstl foreach опускает элемент в последней записи

пытаясь использовать этот 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>
4b9b3361

Ответ 1

Просто используйте 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 ? ',' : ''}

Ответ 2

Одна вещь, которую мне никогда не нравилась в JSTL (на самом деле, я думаю, это единственное::)) заключается в том, что нет способа получить размер списка/коллекции.

EDIT: ok, так что это было возможно, но я этого не знал:(см. здесь.

Тег 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>

Вы можете сделать то же самое, если у вас есть такой код часто (иначе вы можете просто добавить его в область видимости с тем, что вам удобно).

Ответ 3

Проверить размер коллекции с помощью 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>