JSTL - 使用forEach迭代用户定义的类

时间:2010-06-05 00:14:24

标签: java jsp jstl iteration jsp-tags

我需要将哪些方法添加到自定义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的ArrayAccessIterator才能实现此功能?

编辑:没有直接访问ArrayList本身,因为我可能会使用泛型使用某种Set类,而JSP视图不应该知道类的内部工作。

3 个答案:

答案 0 :(得分:4)

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

您可以根据需要更换迭代器逻辑。

答案 1 :(得分:0)

是的,您应该实施java.util.Iterable

答案 2 :(得分:0)

很遗憾,forEach标签不支持Iterable作为商品来源。它确实支持:

  • 数组
  • Collection
  • Iterator
  • Enumeration
  • Map
  • String中给出的逗号分隔值列表

(相关源代码:ForEachSupport

其中,当您希望从自己的类中获取项目时,最好使用Iterator作为forEach的来源。