Java JSTL forEach迭代实现Iterable的用户定义类
我的问题与这里的问题类似: 然而,这个(显而易见且简单的)解决方案对我来说并不适用,所以我再次征求任何建议 我有一个实现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
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 <forEach>
<c:forEach var="item" items="${lst.inner}">