Search code examples
javajspjstliterationjsp-tags

JSTL - Using forEach to iterate over a user-defined class


What methods do I need to add to a custom Java class so that I can iterate over the items in one of its members? I couldn't find any specifications about how the JSTL forEach tag actually works so I'm not sure how to implement this.

For example, if I made a generic "ProjectSet" class and I woud like to use the following markup in the JSP view:

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

Basic class file:

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

Is there any interface that I must implement like PHP's ArrayAccess or Iterator in order for this to work?

Edit: Without directly accessing the ArrayList itself, because I will likely be using some sort of Set class using generics, and the JSP view shouldn't have to know about the inner workings of the class.


Solution

  • The Iterable interface provides this functionality:

    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();
       }
    }
    

    You can exchange the iterator logic as you need.