webentwicklung-frage-antwort-db.com.de

jstl foreach lässt ein Element im letzten Datensatz weg

versuchen, diese JSTL zu verwenden, um eine JSON-Zeichenfolge zu formulieren. Wie kann ich das Segment dazu bringen, am Ende des letzten Datensatzes kein Komma zu setzen? Beachten Sie das Komma am Ende

<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>
63
nokheat

Verwenden Sie einfach 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>

Sie können den bedingten Operator auch in EL anstelle von <c:if> Verwenden:

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

Eine Sache, die ich an JSTL nie gemocht habe (eigentlich denke ich ist das Einzige :)), ist die Tatsache, dass es keine Möglichkeit gibt, die Größe einer Liste/Sammlung abzurufen.

EDIT: ok, es war also möglich, aber ich wusste es nicht :( siehe hier .

Das forEach -Tag hat das varStatus -Attribut, mit dem Sie den Index der Zeile bestimmen können (index/count -Eigenschaften für varStatus variable) aber Sie müssen testen, ob Sie sich an der letzten Position in der Liste befinden, dh vorher die Listengröße haben:

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

Sie müssen jedoch listSize manuell in den Gültigkeitsbereich einfügen, bevor Sie solche Aktionen ausführen können.

In einem meiner Projekte habe ich mir ein Tag erstellt, das eine Sammlung entgegennimmt und den Wert zurückgibt:

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

Sie können dasselbe tun, wenn Sie diese Art von Code häufig haben (ansonsten können Sie ihn einfach in den Gültigkeitsbereich einfügen, je nachdem, was Ihnen zusagt).

3
user159088

durch Überprüfen Sie eine Sammlungsgröße mit JSTL die Antwort sollte das Funktions-Tag verwenden

fügen Sie dies oben auf der Seite ein, um den fn-Namespace zuzulassen

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

und verwende dies auf deiner jsp Seite

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