web-dev-qa-db-fra.com

jstl foreach omettre un élément dans le dernier enregistrement

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? noter 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
nokheat

Utilisez simplement 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 ? ',' : ''}
156
BalusC

Une chose que je n'ai jamais aimé à propos de JSTL (en fait, je pense que c'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 .

La balise forEach possède l'attribut varStatus que vous pouvez utiliser pour déterminer l'index de la ligne (propriétés index/count sur les varStatus variable) mais vous devez tester si vous êtes à la dernière position de la liste, cela signifie avoir au préalable la taille de la liste:

<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 l'un de mes projets, c'est de créer moi-même un tag 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 pouvez faire de même si vous avez souvent ce type de code (sinon vous pouvez simplement l'ajouter dans la portée avec ce qui vous convient).

3
user159088

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

mettre cela 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 ça dans votre page jsp

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