JSTL — использование forEach для перебора определяемого пользователем класса

Какие методы мне нужно добавить в пользовательский класс Java, чтобы я мог перебирать элементы в одном из его членов? Я не смог найти каких-либо спецификаций о том, как на самом деле работает тег JSTL forEach, поэтому я не уверен, как это реализовать.

Например, если я создал общий класс «ProjectSet» и хотел бы использовать следующую разметку в представлении JSP:

<c:forEach items="${projectset}" var="project">
...
</c:forEach>

Базовый файл класса:

public class ProjectSet {
    private ArrayList<Project> projects;
    public ProjectSet() {
        this.projects = new ArrayList<Project>();
    }
    // .. iteration methods ??
}

Есть ли какой-либо интерфейс, который я должен реализовать, например PHP ArrayAccess или Iterator, чтобы это работало?

Изменить: без прямого доступа к самому ArrayList, потому что я, вероятно, буду использовать какой-то класс Set с использованием дженериков, а представление JSP не должно знать о внутренней работе класса.


person Lotus Notes    schedule 05.06.2010    source источник


Ответы (3)


Интерфейс Iterable предоставляет следующие функции:

public class ProjectSet implements Iterable<Project> {
    private ArrayList<Project> projects;
    public ProjectSet() {
        this.projects = new ArrayList<Project>();
    }

    // .. iteration methods ??
   @Override
   public Iterator<Project> iterator() {
       return projects.iterator();
   }
}

Вы можете поменять логику итератора по мере необходимости.

person Dominik    schedule 05.06.2010
comment
Предостережение заключается в том, что JSTL forEach не поддерживает итерируемый (крайне раздражающий) тип forEach. Итак, вам нужно сделать ${projectSet.iterator()} - person Adam Gent; 13.02.2011
comment
На самом деле .iterator() будет работать только с последним контейнером сервлетов (и даже последний JSTL по-прежнему не поддерживает итерацию). Вам нужно будет сделать геттер для итератора ( getIterator() ). - person Adam Gent; 14.02.2011

Да, вы должны реализовать java.util.Iterable

person βξhrαng    schedule 05.06.2010

К сожалению, тег forEach не поддерживает Iterable в качестве источника элементов. Он поддерживает:

  • Массивы
  • Collection
  • Iterator
  • Enumeration
  • Map
  • Список значений, разделенных запятыми, указанный в String

(соответствующий исходный код: ForEachSupport)

Из них, вероятно, лучше всего использовать Iterator в качестве источника forEach, когда вы хотите получить элементы из своего собственного класса.

person Jiri Tousek    schedule 19.10.2018