【问题标题】:How to select the first element of a set with JSTL?如何使用 JSTL 选择集合的第一个元素?
【发布时间】:2025-12-06 17:55:02
【问题描述】:

我设法用下一个代码做到了,但必须有更简单的方法。

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

【问题讨论】:

  • 解决方案因使用 c:out 不起作用我得到下一个错误javax.el.PropertyNotFoundException: Property '0' not found on type org.hibernate.collection.PersistentSet 我在上面使用了你的 r 代码,因为我在请求参数中使用了像这样的 someobject.getSetofsomeObjects() 休眠

标签: jakarta-ee jstl


【解决方案1】:

您可以使用数组 [] 运算符访问单个元素:

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

这适用于数组和列表。它不适用于地图和场景。在这种情况下,您必须将元素的键放在括号内。

【讨论】:

  • 我得到下一个错误 javax.el.PropertyNotFoundException: Property '0' not found on type org.hibernate.collection.PersistentSet
  • 上述内容仅适用于具有 get(int i) 方法的集合类型。使用 PersistentSet 可以做到这一点吗?
  • 对于java.util.Set,您需要先将其转换为数组,例如&lt;c:out value="${bean.set.toArray()[0].propertyIfAny}" /&gt;java.util.Set 是一个无序列表,它没有像 java.util.List 这样的索引。
  • @kgiannakakis 用户询问如何访问 Set 因此答案不相关
【解决方案2】:

集合没有顺序,但如果您仍想获取第一个元素,您可以使用以下内容:

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

【讨论】:

    【解决方案3】:

    仅适用于数组和列表,不适用于集合。

    【讨论】:

    • 好吧,如果您希望在排序之上具有唯一性,那么“aside”实现实际上很有用。
    【解决方案4】:

    由于我的 Set 中只有一个元素,因此顺序并不重要所以我可以像这样访问第一个元素:

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

    【讨论】:

      【解决方案5】:

      查看here 以获取statusVar 变量的描述。 您可以执行以下操作,其中“状态”变量包含迭代的当前状态。如果您需要第一个和最后一个迭代的特殊注释,这将非常有用。在下面的情况下,我想省略最后一个标签后面的逗号。当然,您可以将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】:

        如果您只想要集合的 第一个 元素(并且您确定至少有一个元素),您可以执行以下操作:

        <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】:

          您可以使用 EL 3.0 Stream API。

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

          小心! EL 3.0 Stream API 是在 Java 8 Stream API 之前完成的,它与此不同。他们不能 sunc 两个 api,因为这会破坏向后兼容性。

          【讨论】:

            【解决方案8】:

            使用 ${mySet.toArray[0]} 不起作用。

            我认为如果没有 forEach 循环至少一次迭代是不可能的。

            【讨论】:

            • ${mySet.toArray[0]} 是错误的语法。正确的应该是${mySet.toArray()[0].propertyIfAny}
            【解决方案9】:

            使用 begin 和 end 似乎可以让我选择一系列元素。这给了我三个单独的列表。第一个列表包含项目 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>
            

            【讨论】:

              【解决方案10】:

              如果它是一组 ${attachments[0].id} 将不起作用。改用这个

              ${attachments.first().key}${attachments.first().value}

              【讨论】: