2009-06-16 4 views
46

Udało mi się to zrobić przy pomocy następnego kodu, ale musi być łatwiejszy sposób.Jak wybrać pierwszy element zestawu za pomocą 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

rozwiązanie w dół jako c: obecnie używane nie działało Pojawia się następny błąd 'javax.el.PropertyNotFoundException: Właściwość '0' nie została znaleziona w typie org.hibernate.collection.PersistentSet' użyłem powyższego kodu od r używając hibernacji jak ten 'someobject.getSetofsomeObjects()' w żądaniu parametru – shareef

Odpowiedz

78

Można uzyskać dostęp do poszczególnych elementów z [] operatora tablicy:

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

To będzie pracować dla tablic i list. Nie będzie działać dla map i zestawów. W takim przypadku musisz umieścić klucz elementu w nawiasach.

+4

Otrzymuję następny błąd javax.el.PropertyNotFoundException: Właściwość '0' nie została znaleziona w typie org.hibernate.collection.PersistentSet –

+7

Powyższe działa tylko w przypadku typów kolekcji, które mają metodę get (int i). Czy to możliwe z PersistentSet? – kgiannakakis

+10

Nie działa ** nie ** dla zestawów –

8

Praca tylko dla tablic i list, nie dla zestawu.

+0

Cóż, implementacje "na bok" są rzeczywiście przydatne, jeśli chcesz mieć wyjątkowość przy zamawianiu. – Rolf

0

Używanie $ {mySet.toArray [0]} nie działa.

Nie sądzę, że jest to możliwe bez posiadania pętli dla co najmniej jednej iteracji.

+0

'$ {mySet.toArray [0]}' jest nieprawidłową składnią. Prawidłowy to '$ {mySet.toArray() [0] .propertyIfAny}'. – Tiny

35

Zestawy mają żadnego porządku, ale jeśli nadal chcesz zdobyć pierwszy element, można użyć następujących:

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

To powinno być prawidłowe. – mauretto

3

Look here dla opisu zmiennej statusVar. Możesz zrobić coś jak poniżej, gdzie zmienna "status" zawiera aktualny status iteracji. Jest to bardzo przydatne, jeśli potrzebujesz specjalnych adnotacji przy pierwszym iteratoncie. W poniższym przykładzie chcę pominąć przecinek za ostatnim tagiem. Oczywiście można zastąpić status.last z status.first zrobić coś specjalnego na pierwszym itteration:

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

Możliwe są następujące opcje: current, index, count, first, last, begin, step, i end

2

Jeśli chcesz tylko element pierwszy od a set (i masz pewność, że jest co najmniej jeden element) możesz wykonać następujące czynności:

<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

Używanie początku i końca wydawało się działać dla mnie, aby wybrać zakres elementów. To daje mi trzy osobne listy. Pierwsza lista z pozycjami 1-9, druga lista z pozycjami 10-18 i ostatnia lista z pozycjami 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

ponieważ mam mieć tylko jeden element w moim ustawić kolejność nie jest ważna Więc mogę uzyskać dostęp do pierwszego elementu tak:

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

Można użyć EL 3.0 Stream API.

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

Uważaj! Model EL 3.0 Stream API został sfinalizowany przed interfejsem API Java 8 Stream i jest inny. Nie mogą wylądować w obu apisach, ponieważ złamie to kompatybilność wsteczną.