Как имитировать группирование в слое вида JSTL, отслеживая предыдущие и текущие значения при циклическом просмотре списка? - PullRequest
1 голос
/ 09 октября 2010

Сначала я получаю Note объекты на сервисном уровне:

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

Затем я передаю List из Notes слою вида и устанавливаю одинаковое начальное значение для prevNote и currNote для первого элемента 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 и устанавливаю prevNote на currNote и 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 ".

Что я хочу сделать здесь, это проверить, содержат ли prevNote и currNote одинаковое значение userCode - если они хотят, я хочу пропустить текущий элемент в List и отобразить следующий Note с другим userCode (что-то вроде имитации операции group-by).

Любые советы о том, как это сделать и почему я получаю это сообщение об ошибке?

1 Ответ

1 голос
/ 09 октября 2010

Установка значения в теле из c:set по существу преобразует его в String с использованием метода toString() объекта. Исключение также намекает на то, что вы работаете не с полноценным Note экземпляром, а с String.

Вместо этого используйте атрибут value.

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

Что касается вашего функционального требования:

Что я хочу сделать здесь, это проверить, содержат ли prevNote и currNote одно и то же значение userCode - если они захотят, я хочу пропустить текущий элемент в списке и отобразить следующее примечание с другим userCode (что-то вроде имитации группы). по операции).

Достаточно просто сохранить текущую ноту в конце цикла. Э.Г.

<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>
...