52 votes

Comment sélectionner le premier élément d'un ensemble avec JSTL ?

J'ai réussi à le faire avec le code suivant mais il doit y avoir un moyen plus simple.

<%@ 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 votes

La solution en bas comme c:out utilisé n'a pas fonctionné j'obtiens l'erreur suivante javax.el.PropertyNotFoundException: Property '0' not found on type org.hibernate.collection.PersistentSet J'ai utilisé votre code ci-dessus car j'utilise hibernate comme ceci someobject.getSetofsomeObjects() dans le paramètre de la requête

87voto

kgiannakakis Points 62727

Vous pouvez accéder à des éléments individuels avec l'opérateur tableau [] :

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

Cela fonctionnera pour les tableaux et les listes. Elle ne fonctionnera pas pour les cartes et les ensembles. Dans ce cas, vous devez mettre la clé de l'élément à l'intérieur des parenthèses.

5 votes

J'obtiens l'erreur suivante javax.el.PropertyNotFoundException : La propriété '0' est introuvable dans le type org.hibernate.collection.PersistentSet.

7 votes

Ce qui précède ne fonctionne que pour les types de collections qui ont une méthode get(int i). Est-ce possible avec PersistentSet ?

5 votes

Pour un java.util.Set vous devez d'abord le convertir en tableau comme suit <c:out value="${bean.set.toArray()[0].propertyIfAny}" /> . A java.util.Set est une liste non ordonnée et elle n'a pas d'index comme un java.util.List .

38voto

Tim Tsu Points 191

Les ensembles n'ont pas d'ordre, mais si vous voulez quand même obtenir le premier élément, vous pouvez utiliser ce qui suit :

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

9voto

Fonctionne uniquement pour les tableaux et les listes, pas pour les ensembles.

8voto

Youssef Points 1305

Comme je n'ai qu'un seul élément dans mon ensemble, l'ordre n'est pas important. Je peux donc accéder au premier élément comme ceci :

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

3voto

lanoxx Points 1407

Regardez aquí pour une description de la variable statusVar. Vous pouvez faire quelque chose comme ci-dessous, où la variable "status" contient l'état actuel de l'itération. Ceci est très utile si vous avez besoin d'annotations spéciales pour la première et la dernière itération. Dans le cas ci-dessous, je veux omettre la virgule derrière la dernière balise. Bien sûr, vous pouvez remplacer status.last avec status.first pour faire quelque chose de spécial à la première itération :

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

Les options possibles sont : current, index, count, first, last, begin, step, y end

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