Как выбрать первый элемент набора с 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>
Ответы
Ответ 1
Вы можете обращаться к отдельным элементам с помощью оператора array []:
<c:out value="${attachments[0].id}" />
Это будет работать для массивов и списков. Он не будет работать для карт и наборов. В этом случае вы должны поместить ключ элемента в скобки.
Ответ 2
Устанавливает порядок, но если вы все еще хотите получить первый элемент, вы можете использовать следующее:
<c:forEach var="attachment" items="${attachments}" end="0">
<c:out value="${attachment.id} />
</c:forEach>
Ответ 3
Работа только для массивов и списков, а не для набора.
Ответ 4
Поскольку у меня есть только один элемент в моем Set, порядок не важен. Поэтому я могу получить доступ к первому элементу, подобному этому:
${ attachments.iterator().next().id }
Ответ 5
Посмотрите здесь для описания переменной statusVar.
Вы можете сделать что-то вроде ниже, где переменная "status" содержит текущий статус итерации. Это очень полезно, если вам нужны специальные аннотации для первого и последнего итераторов. В следующем случае я хочу пропустить запятую за последним тегом. Конечно, вы можете заменить 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
Ответ 6
Если вам нужен только элемент first в наборе (и вы уверены, что есть хотя бы один элемент), вы можете сделать следующее:
<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>
Ответ 7
Использование ${mySet.toArray [0]} не работает.
Я не думаю, что это возможно без наличия цикла forEach хотя бы одной итерации.
Ответ 8
Использование начала и конца показалось мне полезным для выбора диапазона элементов. Это дает мне три отдельных списка. Первый список с пунктами 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>
Ответ 9
Вы можете использовать API потока EL 3.0.
<div>${attachments.stream().findFirst().get()}</div>
Будьте осторожны! EL 3.0 Stream API был доработан до API Java 8 Stream, и он отличается от этого. Они не могут загорать оба apis, потому что они нарушают обратную совместимость.