Вопрос по java-ee, jstl – Как выбрать первый элемент набора с помощью JSTL?

50

Мне удалось сделать это с помощью следующего кода, но должен быть более простой способ.

<code><%@ 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>
</code>
решение как c: out не работает Я получаю следующую ошибкуjavax.el.PropertyNotFoundException: Property '0' not found on type org.hibernate.collection.PersistentSet я использовал твой код выше, так как я использую Hibernate, как этоsomeobject.getSetofsomeObjects() в параметре запроса shareef

Ваш Ответ

7   ответов
5

порядок не важен, поэтому я могу получить доступ к первому элементу следующим образом:

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

Я не думаю, что это возможно без цикла forEach хотя бы одной итерации.

${mySet.toArray[0]} неправильный синтаксис Правильный будет${mySet.toArray()[0].propertyIfAny}.
84

ray []:

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

Это будет работать для массивов и списков. Он не будет работать для карт и наборов. В этом случае вы должны поместить ключ элемента в скобки.

Пользователь @kgiannakakis спрашивает, как получить доступ к Set, таким образом, ответ не является подходящим
Вышеуказанное будет работать только для типов коллекций, которые имеют метод get (int i). Это возможно с PersistentSet?
Я получаю следующую ошибку javax.el.PropertyNotFoundException: свойство '0'. не найден для типа org.hibernate.collection.PersistentSet Sergio del Amo
Оно делаетnot работа для наборов
Дляjava.util.Set, вам нужно сначала преобразовать его в массив<c:out value="${bean.set.toArray()[0].propertyIfAny}" />,java.util.Set неупорядоченный список, и он не имеет индекса, подобногоjava.util.List.
37

но если вы все еще хотите получить первый элемент, вы можете использовать следующее:

<c:forEach var="attachment" items="${attachments}" end="0">
     <c:out value="${attachment.id} />
</c:forEach>
Это должно быть правильным.
0

похоже, помогло мне выбрать диапазон элементов. Это дает мне три отдельных списка. Первый список с пунктами 1-9, второй список с пунктами 10-18 и последний список с пунктами 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>
3

ПосмотритеВот для описания переменной statusVar. Вы можете сделать что-то вроде ниже, где & quot; статус & quot; переменная содержит текущий статус итерации. Это очень полезно, если вам нужны специальные аннотации для первого и последнего итераций. В приведенном ниже примере я хочу пропустить запятую за последним тегом. Конечно можно заменитьstatus.last сstatus.first сделать что-то особенное на первом этапе:

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

Возможные варианты:current, index, count, first, last, begin, step, а такжеend

1

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

Be careful! EL 3.0 Stream API был завершен доJava 8 Stream API и отличается от этого. Они не могут использовать оба apis, потому что это нарушит обратную совместимость.

Похожие вопросы