Java Web MVC模式下ArrayList从Controller传JSP为空问题求助
问题排查与解决方案
1. 确认Controller(Servlet)的数据存储作用域
无框架Web开发中,Servlet必须把数据存入request或session作用域,JSP才能访问到,存局部变量肯定不行:
- 错误写法(局部变量,JSP无法访问):
ArrayList<User> userList = userDao.queryAll(); - 正确写法(转发场景用request作用域):
ArrayList<User> userList = userDao.queryAll(); request.setAttribute("userList", userList); // 键名要和JSP中取值的键一致 request.getRequestDispatcher("/WEB-INF/userList.jsp").forward(request, response);
2. 检查是否使用了重定向而非转发
如果Servlet里用了response.sendRedirect(),request作用域的数据会直接丢失——因为重定向是发起新的HTTP请求,之前的request对象已销毁。
- 错误示例:
response.sendRedirect("/userList.jsp"); - 解决:要么改用请求转发(
forward),要么把数据存入session作用域(用完记得移除,避免session冗余):session.setAttribute("userList", userList); response.sendRedirect("/userList.jsp"); // 在JSP中使用后移除session中的数据 session.removeAttribute("userList");
3. JSP取值的键名必须与Controller存储的一致
别犯低级错误:Controller存的是"userList",JSP里写${users},肯定拿不到数据。
- JSTL使用示例(先确保引入标签库):
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <table> <c:forEach items="${userList}" var="user"> <tr> <td>${user.id}</td> <td>${user.username}</td> </tr> </c:forEach> </table> - 手动获取数据时,要对应正确的作用域:
<% // 存request就用request.getAttribute,存session就用session.getAttribute ArrayList<User> list = (ArrayList<User>) request.getAttribute("userList"); %>
4. 验证请求是否真的到达了目标Controller
在Servlet的doGet/doPost方法中添加打印语句,确认请求到达、数据查询正常、存入作用域成功:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ArrayList<User> userList = userDao.queryAll(); System.out.println("Controller中list长度:" + userList.size()); // 确认数据库查询结果正常 request.setAttribute("userList", userList); System.out.println("存入request的list:" + request.getAttribute("userList")); // 确认存入作用域成功 request.getRequestDispatcher("/WEB-INF/userList.jsp").forward(request, response); }
如果控制台没有打印内容,说明请求没走到这个Servlet,检查web.xml中的Servlet映射或注解路径是否正确。
5. 检查JSP是否禁用了EL表达式
如果JSP里EL表达式不生效,可能是页面开头设置了isELIgnored="true",修改为false即可:
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
6. Integer类型数据空指针的问题排查
既然Integer也出现空指针,说明是通用的传递问题,和集合无关:
- 检查存储的键名与JSP取值的键名是否一致,比如Controller存
request.setAttribute("total", 5),JSP里写${count}肯定拿不到; - 同样排查是否因重定向导致request作用域数据丢失。
内容的提问来源于stack exchange,提问作者jinoJ
相关产品推荐
相关产品推荐

