一尘不染

如何在循环遍历List时跟踪先前和当前值,从而在JSTL视图层中模拟分组方式?

jsp

首先,我Note在服务层中检索对象:

List<Note> notes = this.getNotes();

然后我通过ListNotes向视图层和用于设定相同的初始值prevNotecurrNote到的第一个元素List

<c:forEach items="${notes}" var="note" begin="0" end="1" step="1">
    <c:set var="prevNote">${note}</c:set>
    <c:set var="currNote">${note}</c:set>
</c:forEach>

然后,我遍历List并从循环中将当前便笺项()设置prevNotecurrNote和:currNote``note

<c:forEach items="${notes}" var="note">

    <c:set var="prevNote">${currNote}</c:set>
    <c:set var="currNote">${note}</c:set>

    prev:<c:out value="${prevNote.userCode}"/>
    curr:<c:out value="${currNote.userCode}"/>

</c:forEach>

但是,当我运行它时,我收到以下错误消息:

    Unable to find a value for "note" in object of 
    class "java.lang.String" using operator ".

我想在这里做的是检查是否prevNotecurrNote包含相同的userCode值-如果他们这样做我想跳过在当前元素List和显示下Note具有不同的userCode(有点模拟group- by操作)。

关于如何执行此操作的任何提示以及为什么我收到此错误消息?


阅读 231

收藏
2020-06-10

共1个答案

一尘不染

主体 中设置值c:set实际上会将其转换为对象的Stringusing
toString()方法。该例外还暗示您不是在处理一个完全有价值的Note实例,而是在一个实例上String

请改用value属性。

<c:set var="prevNote" value="${note}" />
<c:set var="currNote" value="${note}" />

关于您的功能要求:

我要在此处执行的操作是检查prevNote和currNote是否包含相同的userCode值-
如果它们这样做,我想跳过列表中的当前元素,并显示具有不同userCode的下一个Note(模拟分组操作) )。

仅将当前注释存储在循环末尾就足够了。例如

<c:forEach items="${notes}" var="note">
    <c:if test="${empty prevNote or note.userCode != prevNote.userCode}">
         <c:out value="${note.userCode}" />
    </c:if>
    <c:set var="prevNote" value="${note}" />
</c:forEach>
2020-06-10