JSTL foreach omet un élément dans le dernier enregistrement

en essayant d'utiliser ce jstl pour formuler une chaîne json, Comment puis-je faire le segment pour ne pas mettre de virgule à la fin du dernier enregistrement? notez la virgule à la fin

<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
demandé sur Doug Porter 2010-06-23 09:56:14

3 réponses

il suffit d'utiliser 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>

vous pouvez également utiliser L'opérateur conditionnel dans EL au lieu de <c:if> :

    ${!loop.last ? ',' : ''}
149
répondu BalusC 2010-06-23 11:58:55

une chose que je n'ai jamais aimé à propos de JSTL (en fait je pense est la seule chose :)) est le fait qu'il n'y a aucun moyen de récupérer la taille d'une liste/collection.

EDIT: ok, donc c'était possible mais je ne le savais pas: ( voir ici .

l'étiquette forEach a l'attribut varStatus que vous pouvez utiliser pour déterminer l'index de la rangée ( index / count propriétés sur le varStatus variable) mais vous devez tester si vous êtes à la dernière position dans la liste, ce qui signifie avoir la taille de la liste à l'avance:

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

mais vous devrez placer le listSize dans la portée, manuellement, avant de faire ce genre de chose.

ce que j'ai fait dans un de mes projets était de créer moi-même une étiquette qui prend une collection et renvoie la valeur:

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

vous pourriez faire la même chose si vous avez ce genre de code souvent (sinon vous pouvez simplement l'ajouter dans scope avec ce qui vous convient).

3
répondu Community 2017-05-23 12:18:02

par Vérifier une collection de taille avec JSTL la réponse était d'utiliser l'étiquette de fonctions

mettez ceci en haut de la page pour autoriser l'espace de noms fn

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

et utiliser comme ceci dans votre page jsp

<p>The length of the companies collection is : ${fn:length(companies)}</p>
3
répondu nokheat 2017-05-23 12:26:07