
本文详解 Spring MVC 项目中 JSP 页面能渲染表头但无法显示遍历的列表数据的典型原因,重点指出 ModelAndView.addObject()误用、EL 表达式作用域失效及 JSTL 配置缺失三大核心问题,并提供可立即验证的修复方案。
本文详解 spring mvc 项目中js p 页面能渲染表头但无法显示 `
在 Spring MVC 应用中,JSP 页面仅显示表格结构而无法渲染后端传入的数据(如 listGamer),是一个高频且易被忽视的问题。表面看是“数据没传过来”,实则往往源于 模型绑定方式错误 或视图层环境配置缺失。下面从代码逻辑、作用域机制和实践验证三方面系统解析。
? 根本原因分析
您当前控制器中使用了:
model.addObject("listGamer", listGamer);
该方法 在较新版本的 Spring MVC(4.3+)中已不推荐用于 ModelAndView 对象 ,且存在语义歧义:addObject() 本质是向 ModelMap 添加属性,但若 ModelAndView 未显式关联 ModelMap 实例,或视图解析器未正确桥接,该属性可能无法进入 JSP 的 pageContext/request 作用域,导致 EL 表达式 ${listGamer}求值为 null 或空集合——这正是 ${listGamer}无输出、
此外,还需确认两个关键前提:
- JSTL 核心标签库是否正确声明(您已使用,符合要求);
- 项目依赖中是否包含 jstl 和 javax.servlet.jsp.jstl-api(Maven 需确保版本兼容,如 jstl 1.2+)。
✅ 推荐修复方案(两种等效写法)
方案一:改用 ModelAndView#addObject(String, Object) 的安全用法(推荐)
确保 ModelAndView 内部 ModelMap 已初始化,并显式调用:
@RequestMapping(value = "/") public ModelAndView listGamer() { List<Gamer> listGamer = gamerDAO.list(); ModelAndView model = new ModelAndView(); model.addObject("listGamer", listGamer); // ✅ 此处有效:addObject 会委托给内部 ModelMap model.setViewName("index"); return model; }
方案二:更清晰、更现代的写法(强烈推荐)
直接使用 Model 参数(由 Spring 自动注入),语义明确且避免 ModelAndView 构造歧义:
@RequestMapping(value = "/") public String listGamer(Model model) {// ✅ 使用 Model 接口,更直观 List<Gamer> listGamer = gamerDAO.list(); model.addAttribute("listGamer", listGamer); // ✅ addAttribute 是标准 API return "index"; // 返回视图名,由 ViewResolver 解析 }
? 注意:model.addAttribute() 和 model.addObject() 在 Model 接口中是等价的,但 Model 参数方式更简洁、不易出错,且与 Spring Boot 默认风格一致。
? 验证与调试技巧
-
在 JSP 中快速验证模型属性是否存在:
<p>Debug - listGamer size: ${empty listGamer ? 'EMPTY' : fn:length(listGamer)}</p> <p>Debug - First gamer name: ${listGamer[0].name}</p>(需额外引入)
-
检查 Controller 日志 :在 listGamer() 方法中添加 System.out.println(“Size: ” + listGamer.size());,确认 DAO 返回非空列表。
-
确保 Gamer 类有标准 getter 方法 :JSP EL 通过反射调用 getName()、getEmail() 等,若字段名为 gamertag,必须提供 getGamertag()方法(注意大小写匹配)。
⚠️ 注意事项总结
- ❌ 避免混用 ModelAndView 与 Model 参数;选择一种风格并保持统一。
- ✅ 始终确认 Gamer 实体的 getter 命名符合 JavaBean 规范(如 private String gamertag; → public String getGamertag(){…})。
- ✅ 若使用 Spring Boot,确保 spring-boot-starter-web 已引入,它会自动配置 InternalResourceViewResolver 和 JSTL 支持。
- ✅ 生产环境建议关闭脚本片段,全程使用 EL + JSTL,提升可维护性与安全性。
完成上述修正后,刷新页面,表格数据将正常渲染。这一问题的本质,是理解 Spring MVC“模型传递”与 JSP“EL 作用域查找”的协同机制——只有当属性成功注入到 request 作用域,






























