2010-06-23 22 views
58

tratando de usar este jstl para formular una cadena json, ¿cómo puedo hacer que el segmento no ponga una coma al final del último registro? en cuenta la coma en el extremojstl foreach omite un elemento en el último registro

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

todos los elementos que necesite el } pero el último no debe tener la coma, – nokheat

Respuesta

135

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

También puede utilizar el operador condicional en lugar de EL <c:if>:

${!loop.last ? ',' : ''} 
+0

+1. Una solución mucho mejor que la mía. @nokheat: debe marcar esto como la respuesta aceptada. –

2

hay algo que nunca me ha gustado de JSTL (en realidad creo que es la única cosa :)) es el hecho de que no hay manera de recuperar el tamaño de una lista/colección.

EDIT:. bien, así que era posible, pero yo no lo sabía :(see here

La etiqueta forEach tiene el atributo varStatus que se puede utilizar para determinar el índice de la fila (index/count propiedades de la variable varStatus), sino que tiene que probar si usted está en la última posición de la lista, lo que significa que tienen el tamaño de la lista de antemano:

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

Pero tendrá que colocar º e listSize en alcance, manualmente, antes de hacer este tipo de cosas.

Lo que hice en uno de mis proyectos fue la creación de mi mismo una etiqueta que tiene una colección y devuelve el valor:

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

Usted podría hacer lo mismo si usted tiene este tipo de código de frecuencia (de lo contrario puede agregarlo en el alcance con lo que sea conveniente para usted).

+0

esto sería tratar mi problema! muchas gracias – nokheat

+0

Después de una búsqueda rápida encontré esto: http://stackoverflow.com/questions/851880/check-a-collection-size-with-jstl. Tal vez puede ayudarte aún más. –

+0

dado que el objeto de la lista tiene una función de tamaño(), ¿puedo usar list.size para que se vea más elegante? – nokheat

2

por Check a collection size with JSTL la respuesta fuera a utilizar la etiqueta funciones

poner esto en la parte superior de la página para permitir el espacio de nombres fn

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

y utilizar como esto en su página JSP

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