开发者

JSTL - Using forEach to iterate over a user-defined class [duplicate]

开发者 https://www.devze.com 2023-01-02 03:37 出处:网络
This question already has answers here: 开发者_如何学编程javax.servlet.ServletException: javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in <fo
This question already has answers here: 开发者_如何学编程 javax.servlet.ServletException: javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in <forEach> (3 answers) Closed 4 years ago.

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.


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.


Yes, you should implement java.util.Iterable


Unfortunately, the forEach tag does not support Iterable as the items source. It does support:

  • Arrays
  • Collection
  • Iterator
  • Enumeration
  • Map
  • Comma-separated list of values given in a String

(relevant source code: ForEachSupport)

Of these, it's probably best to use an Iterator as the forEach source when you wish to fetch items from your own class.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号