Java JSTL forEach迭代实现Iterable的用户定义类

Java JSTL forEach迭代实现Iterable的用户定义类,java,foreach,jstl,Java,Foreach,Jstl,我的问题与这里的问题类似: 然而,这个(显而易见且简单的)解决方案对我来说并不适用,所以我再次征求任何建议 我有一个实现Iterable接口的简单类,如: public class Lizt implements Iterable<String> { private ArrayList<String> inner = new ArrayList<>(); public Lizt(){ this.inner.add("A"); thi

我的问题与这里的问题类似: 然而,这个(显而易见且简单的)解决方案对我来说并不适用,所以我再次征求任何建议

我有一个实现Iterable接口的简单类,如:

public class Lizt implements Iterable<String> {

  private ArrayList<String> inner = new ArrayList<>();

  public Lizt(){
    this.inner.add("A");
    this.inner.add("B");
  }

  @Override
  public Iterator<String> iterator() {
    return inner.iterator();
  }

  public Iterable<String> getInner(){
    return this.inner;
  }
}
如果我替换JSP表达式以直接访问内部字段,如

<c:forEach var="item" items="${lst.inner}">

。。。一切正常。“我的”Iterable和ArrayList的Iterable有什么区别


感谢您提前提出建议。

不同之处在于ArrayList是一个集合,而您的类不是。以下是JSTL规范所说的:

支持的集合和当前项 项目必须支持下面列出的数据类型 [……]

  • 数组[…]
  • java.util.Collection的实现[…]
  • java.util.Iterator[…]的实现
  • java.util.Enumeration的实现[…]
  • java.util.Map的实现[…]

如您所见,Iterable未列出。

正如Adam Gent对接受答案的评论所述:

需要注意的是,JSTL forEach不支持iterable(非常烦人)作为forEach类型。所以您需要执行${projectSet.iterator()}

forEach
根本不支持
Iterable
,这可能是违反直觉的。不过,它确实支持迭代器,我认为这应该很容易使用

您可以在的源代码中,在方法
SupportedTypeForEachiator()
中找到这方面的证据

javax.servlet.ServletException: org.apache.jasper.JasperException: An exception occurred processing JSP page [/forEachTest.jsp] at line [7]
...
Caused by: javax.servlet.ServletException: javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in &lt;forEach&gt;
<c:forEach var="item" items="${lst.inner}">