web-dev-qa-db-fra.com

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>
51
Sergio del Amo

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

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

Cela fonctionnera pour les tableaux et les listes. Cela ne fonctionnera pas pour les cartes et les ensembles. Dans ce cas, vous devez placer la clé de l'élément entre les crochets.

85
kgiannakakis

Les ensembles n'ont pas d'ordre, mais si vous voulez toujours 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>
37
Tim Tsu

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

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

Ne fonctionne que pour les tableaux et les listes, pas pour l'ensemble.

8
Ernesto Riera

Regardez ici pour une description de la variable statusVar. Vous pouvez faire quelque chose comme ci-dessous, où la variable "status" contient le statut 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 supprimer 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 sur 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, et end

3
lanoxx

Si vous ne voulez que l'élément premier d'un ensemble (et vous êtes certain qu'il y a au moins un élément), vous pouvez faire ce qui suit:

<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>
3
Ninju Bohra

Vous pouvez utiliser l'API de flux EL 3.0.

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

Attention! Le EL 3.0 Stream API a été finalisé avant le Java 8 Stream API et il est différent de cela. Ils ne peuvent pas sunc les deux API car cela briserait la compatibilité descendante.

1
George Siggouroglou

L'utilisation du début et de la fin semblait fonctionner pour moi pour sélectionner une gamme d'éléments. Cela me donne trois listes distinctes. La première liste avec les éléments 1-9, la deuxième liste avec les éléments 10-18 et la dernière liste avec les éléments 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>
0
addzies

L'utilisation de $ {mySet.toArray [0]} ne fonctionne pas.

Je ne pense pas que ce soit possible sans avoir pour chaque boucle au moins une itération.

0
prx