Spring MVC JSP页面表格数据不显示解决方案

作者:技术拾光时间:2026-06-20 10:22:07浏览:127

SpringMVC中JSP能渲染表头但表格为空,根本原因是模型属性未正确注入请求作用域。修复需确保控制器使用Model或ModelAndView添加非空数据,JSP页面正确引入JSTL并使用c:forEach遍历,添加空值兜底逻辑,同时避免作用域混淆与getter命名错误。

本文详解Spring MVC项目中JSP页面能渲染表头但无法显示List数据的根本原因——控制器未正确将模型属性注入请求作用域,并提供修复方法、代码对比及最佳实践。
这是一个非常典型的Spring MVC故障现象:表头渲染出来了,表格却是空的。遇到这种情况,多半是模型数据没能顺利传递到JSP页面的作用域中。很多人第一反应是ModelAndView用错了,但其实在Spring 5.x及之后的版本中,`addObject()` 和 `addAttribute()` 功能完全等价,都是给模型添加属性。所以问题根源往往不在API选择上,而是集中在下面几个关键环节。
@RequestMapping(value = "/")
public ModelAndView listGamer() {
    List listGamer = gamerDAO.list();
    ModelAndView model = new ModelAndView();
    model.addObject("listGamer", listGamer); // 确认属性名和JSP中的${listGamer}完全一致
    model.setViewName("index");
    return model;
}
但问题来了——表头能显示,说明JSP页面本身能正常渲染;数据却为空,就说明`listGamer`这个变量在JSP的请求作用域里不存在。所以,检查方向要聚焦在:数据是否真的被添加到了模型中,以及JSP端是否正确解析了这个属性。

数据源的确认

首先,确认数据源本身是有数据的。虽然你已经验证了DAO层在JUnit测试中没问题,但建议在控制器里加一行日志输出:
System.out.println("Size: " + listGamer.size());
这样能快速排除“数据根本没从数据库查出来”的可能性。如果这行输出了0,那就不是Spring MVC的问题,而是数据访问层的问题了。

JSP端的关键检查点

JSP页面上,EL表达式(比如`${listGamer}`)能从请求作用域中读取数据,前提是JSTL核心标签库已经正确引入。确保页面顶部有以下声明:
<%@ taglib uri="http://ja va.sun.com/jsp/jstl/core" prefix="c" %>
然后,`` 的遍历逻辑需要足够健壮。很多开发者习惯直接写 `items="${listGamer}"`,但如果 `listGamer` 是 `null` 或者 `empty`,这行代码会静默失败,不会报错,也不会显示数据。一个推荐的做法是在外层加上空值判断:

  
    
      ${status.count} 
      ${gamer.name}
      ${gamer.email}
      ${gamer.gamertag}
      ${gamer.phone}
      Edit
    
  


  No gamers found.
这样做的好处是:如果数据确实为空,用户能看到友好的提示信息,而不是一个空白的表格。

常见陷阱和更简洁的写法

除了上面的核心检查点,还有几个容易踩的坑: - **作用域混淆**:有些人会习惯性地调用 `request.setAttribute()` 或 `session.setAttribute()`,这会绕过Spring MVC的模型机制,导致数据虽然被设置了,但EL表达式却无法从常规的请求作用域中找到它。务必统一使用 `Model` 或 `ModelAndView`。 - **getter命名规范**:`EL` 表达式 `gamer.name` 对应的是 `Gamer` 类中的 `getName()` 方法。如果字段名和getter方法命名不匹配,即使数据在模型中,JSP也访问不到。 - **编码与ContentType**:页面的 `pageEncoding` 和 `contentType` 要保持一致,避免中文乱码干扰问题定位。一般推荐 `pageEncoding="UTF-8"` 和 `contentType="text/html; charset=UTF-8"`。 如果你是从老项目过渡到新框架,还有一种更简洁的现代写法被广泛推荐——直接使用 `Model` 参数:
@RequestMapping(value = "/")
public String listGamer(Model model) {
    model.addAttribute("listGamer", gamerDAO.list()); // 一行搞定,自动返回逻辑视图名
    return "index";
}
这种写法省去了手动创建 `ModelAndView` 对象的步骤,语义也更清晰,推荐作为常规做法。

本质总结

表格内容不显示,归根结底是模型数据没有被注入到JSP可访问的作用域中。修复并不复杂,只需要做好两件事: 1. 在控制器中,确保 `model.addObject("listGamer", list)` 正确执行,并且 `list` 是非空的。 2. 在JSP中,使用 `` 配合EL安全遍历,并添加空值兜底逻辑。 放弃手动操作作用域的旧模式,严格遵循Spring MVC的模型-视图契约,这类“表头可见、数据隐身”的问题就能一劳永逸地解决。