You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 21:50:38