【问题标题】:JSTL forEach to iterate over user defined class implementing Iterable [duplicate]JSTL forEach 迭代实现 Iterable 的用户定义类 [重复]
【发布时间】:2019-03-24 14:07:46
【问题描述】:

我的问题与这里的问题类似: JSTL - Using forEach to iterate over a user-defined class 但是,(明显而简单的)解决方案对我不起作用,所以我再次寻求任何建议。

我有一个实现 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;
  }
}

(暂时忽略“getInner()”函数)。 然后我有一个简单的JSP页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<jsp:useBean id="lst" scope="session" class="model.Lizt"/>
<html>
<body>
<ul>
<c:forEach var="item" items="${lst}">
    <li>${item}</li>
</c:forEach>
</ul></body></html>

所以,我正在尝试迭代实现 Iterable 的实例。但是,服务器返回我(以及其他人)

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;

如果我替换JSP表达式直接访问内部内部字段,比如

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

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

提前感谢您的任何建议。

【问题讨论】:

    标签: java foreach jstl


    【解决方案1】:

    不同之处在于 ArrayList 是一个集合,而你的类不是。 JSTL 的规范是这样说的:

    支持的收藏和当前项目 项目必须支持下面列出的数据类型 [...]

    • 数组 [...]
    • java.util.Collection [...] 的实现
    • java.util.Iterator [...] 的实现
    • java.util.Enumeration 的实现 [...]
    • java.util.Map [...]的实现
    • 字符串

    如您所见,Iterable 未列出。

    【讨论】:

      【解决方案2】:

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

      需要注意的是,JSTL forEach 不支持可迭代(非常烦人)作为 forEach 类型。所以你需要做 ${projectSet.iterator()}

      forEach 根本不支持Iterable,尽管它可能违反直觉。它确实支持iterator,但我认为您应该可以轻松使用它。

      您可以在 ForEachSupport 的源代码中的方法 supportedTypeForEachIterator() 中找到这方面的证据。

      【讨论】: