64 votes

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

J'essaie d'utiliser ce jstl pour formuler une chaîne json, comment puis-je faire en sorte que le segment ne mette pas de virgule à la fin du dernier enregistrement ?

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

162voto

BalusC Points 498232

Il suffit d'utiliser [LoopTagStatus#isLast()](http://java.sun.com/javaee/5/docs/api/javax/servlet/jsp/jstl/core/LoopTagStatus.html#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 ? ',' : ''}

3voto

nokheat Points 392

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

mettre 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 utilisez comme ceci dans votre page jsp

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

3voto

Une chose que je n'ai jamais aimée dans 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.

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

Les forEach possède la balise varStatus que vous pouvez utiliser pour déterminer l'index de la ligne ( index / count sur le site de l varStatus ) mais il faut tester si l'on est à la dernière position de la liste, ce qui implique d'avoir la taille de la liste au préalable :

<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 le champ d'application, manuellement, avant de faire ce genre de choses.

Dans l'un de mes projets, j'ai créé une balise 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 le champ d'application avec ce qui vous convient).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X