java - JSTL forEach 迭代实现 Iterable 的用户定义类
问题描述
我的问题类似于这里问的问题: 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 <forEach>
如果我替换 JSP 表达式以直接访问内部内部字段,例如
<c:forEach var="item" items="${lst.inner}">
...一切正常。“我的”Iterable 和 ArrayList 的 Iterable 有什么区别?
感谢您提前提供任何建议。
解决方案
正如亚当·根特对接受的答案的评论所说:
需要注意的是,JSTL forEach 不支持可迭代(非常烦人)作为 forEach 类型。所以你需要做 ${projectSet.iterator()}
forEach
根本不支持,尽管Iterable
它可能违反直觉。不过它确实支持iterator
,我认为你应该很容易使用它。
ForEachSupport
您可以在方法的源代码中找到这方面的证据supportedTypeForEachIterator()
。
推荐阅读
- c# - Azure 表存储:如何仅通过分区键获取单个实体?
- javascript - 改变使用 javascript 的 onfocus 值
- delphi - 在 TContourSeries 中未触发 OnGetMarkText
- android - Android 键盘覆盖视图,但仅在全屏模式下
- sparql - 如何在 SPARQL 中执行“过滤器(x IN(...))”?
- symfony - Symfony 如何使用 SonataAdmin 更改用户密码?
- sql - SQL:按选定列对记录进行分组
- typescript - 打字稿节点找不到模块
- ios - 在静态函数闭包上更改 UIButton 属性
- android - 无法解决android中的flutter firestore