Servlet传递ArrayList至JSP无法遍历:list未出现在响应中
解决Servlet传递ArrayList到JSP无法遍历的问题
我来帮你排查这个问题,毕竟Servlet传集合到JSP遍历没效果是很常见的坑,咱们一步步来定位原因:
1. 先确认Servlet中List的设置逻辑是否正确
首先得确保你从数据库拿到的List真的被正确传递到JSP的请求作用域里:
- 检查数据库查询结果:在Servlet里加一行调试代码,打印List的大小:
System.out.println("List内容数量:" + list.size());,确认list不是空的,也不是null。如果查询结果为空,那JSP自然遍历不出东西。 - 检查属性设置方式:你是不是用了
request.setAttribute("list", list);?如果不小心用了session.setAttribute,而JSP里默认从request作用域取数据的话,也会拿不到(不过你其他属性正常,大概率是用了request,但还是要确认)。 - 检查跳转方式:绝对不能用
response.sendRedirect()跳转JSP!因为重定向会创建新的HTTP请求,原来request里的属性会全部丢失。必须用请求转发:request.getRequestDispatcher("/你的页面路径.jsp").forward(request, response);,这样request对象会被传递到JSP,属性才能被读取到。
2. 检查JSP的标签库导入
要使用<c:forEach>标签,必须在JSP页面的最开头导入JSTL核心标签库,否则标签会被浏览器忽略,根本不会执行遍历:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
如果没加这行,哪怕你的List传过来了,遍历也不会生效。
3. 修正EL表达式的写法
你在JSP里写的${item.getTexto}是错误的EL写法!EL表达式遵循JavaBean规范,直接写属性名即可,它会自动调用对应的getter方法:
- 正确写法应该是
${item.texto}(前提是你的Text类有public String getTexto()方法) - 如果你非要写方法调用,也得加括号:
${item.getTexto()},但这不是标准写法,推荐用属性名的方式。
4. 确认Text类的JavaBean规范
最后检查你的Text实体类:
- 有没有定义
private String texto;属性? - 有没有对应的
public String getTexto()方法?方法名必须严格符合规范:get开头,后面属性名首字母大写(比如属性是texto,方法就是getTexto()),如果写成gettext()或者getText(),EL表达式会找不到对应的方法,导致拿不到值。
额外调试技巧
如果还是找不到问题,可以在JSP里直接输出List的内容,判断是属性没传过来还是遍历的问题:
- 先输出
${list},看看会不会打印出类似[com.xxx.Text@123, com.xxx.Text@456]的内容,如果能打印,说明List已经传过来了,问题出在遍历或EL表达式上;如果输出空白或null,说明Servlet里的List没传过来。 - 可以导入JSTL函数标签库,输出List的长度:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <p>List长度:${fn:length(list)}</p>
这样能直观看到List里有没有数据。
内容的提问来源于stack exchange,提问作者Acauã Pitta
相关产品推荐
相关产品推荐

