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>
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 ? ',' : ''}
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).
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>