2009-06-16 25 views
46

Pude hacerlo con el siguiente código, pero debe haber una manera más fácil.¿Cómo seleccionar el primer elemento de un conjunto con JSTL?

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


<c:if test="${fn:length(attachments) > 0}"> 
    <c:forEach var="attachment" items="${attachments}" varStatus="loopCount"> 
     <c:if test="${loopCount.count eq 1}"> 
     attachment.id 
     </c:if> 
    </c:forEach> 
</c:if> 
+0

la solución como c: fuera de uso no funcionó Obtuve el siguiente error 'javax.el.PropertyNotFoundException: Propiedad '0' no encontrada en el tipo org.hibernate.collection.PersistentSet' He utilizado su código r arriba desde la mañana usando hibernate como este 'someobject.getSetofsomeObjects()' en el parámetro de solicitud – shareef

Respuesta

78

Se puede acceder a elementos individuales con el operador array []:

<c:out value="${attachments[0].id}" /> 

Esto funcionará para las matrices y listas. No funcionará para mapas y conjuntos. En ese caso, debe colocar la clave del elemento dentro de los corchetes.

+4

obtengo el siguiente error javax.el.PropertyNotFoundException: la propiedad '0' no se encuentra en el tipo org.hibernate.collection.PersistentSet –

+7

Lo anterior solo funcionará para los tipos de colecciones que tienen un método get (int i). ¿Es esto posible con PersistentSet? – kgiannakakis

+10

No ** funciona ** para los conjuntos –

8

Trabajar solo para matrices y listas, no para establecer.

+0

, las implementaciones "a un lado" son realmente útiles si desea unicity además de ordenar. – Rolf

0

El uso de $ {mySet.toArray [0]} no funciona.

No creo que sea posible sin tener para cada ciclo al menos una iteración.

+0

'$ {mySet.toArray [0]}' es una sintaxis incorrecta. El correcto sería '$ {mySet.toArray() [0] .propertyIfAny}'. – Tiny

35

Los conjuntos tienen ningún orden, pero si usted todavía desea conseguir el primer elemento que se puede utilizar lo siguiente:

<c:forEach var="attachment" items="${attachments}" end="0"> 
    <c:out value="${attachment.id} /> 
</c:forEach> 
+1

Esta debería ser la correcta. – mauretto

3

Look here para una descripción de la variable statusVar. Puede hacer algo como a continuación, donde la variable "estado" contiene el estado actual de la iteración. Esto es muy útil si necesita anotaciones especiales para la primera y última iteratión. En el siguiente caso, quiero omitir la coma detrás de la última etiqueta. Por supuesto se puede reemplazar status.last con status.first hacer algo especial en el primer itteration:

<td> 
    <c:forEach var="tag" items="${idea.tags}" varStatus="status"> 
     <span>${tag.name not status.last ? ', ' : ''}</span> 
    </c:forEach> 
</td> 

opciones posibles son: current, index, count, first, last, begin, step, y end

2

Si sólo desea que el elemento primera de un establecer (y está seguro de que hay al menos un elemento) puede hacer lo siguiente:

<c:choose> 
    <c:when test="${dealership.administeredBy.size() == 1}"> 
     Hello ${dealership.administeredBy.iterator().next().firstName},<br/> 
    </c:when> 
    <c:when test="${dealership.administeredBy.size() > 1}"> 
     Hello Administrators,<br/> 
    </c:when> 
    <c:otherwise> 
    </c:otherwise> 
</c:choose> 
0

Usar el principio y el final me pareció útil para seleccionar una gama de elementos. Esto me da tres listas separadas. La primera lista con los ítems 1-9, la segunda lista con los ítems 10-18, y la última lista con los ítems 11-25.

    <ul> 
         <c:forEach items="${actionBean.top25Teams}" begin="0" end="8" var="team" varStatus="counter"> 
          <li>${team.name}</li>        
         </c:forEach> 
        </ul> 

        <ul> 
         <c:forEach items="${actionBean.top25Teams}" begin="9" end="17" var="team" varStatus="counter"> 
          <li>${team.name}</li>        
         </c:forEach> 
        </ul> 

        <ul> 
         <c:forEach items="${actionBean.top25Teams}" begin="18" end="25" var="team" varStatus="counter"> 
          <li>${team.name}</li>        
         </c:forEach> 
        </ul> 
4

ya que tengo tienen sólo un elemento en mi establecer el orden no es importante Así que se puede acceder al primer elemento de la siguiente manera:

${ attachments.iterator().next().id } 
0

Puede utilizar la API de Corriente EL 3.0.

<div>${attachments.stream().findFirst().get()}</div> 

¡Cuidado! El EL 3.0 Stream API finalizó antes de la API Java 8 Stream y es diferente. No pueden sunc ambas apis porque romperá la compatibilidad hacia atrás.

Cuestiones relacionadas