Spring Web项目中JSTL核心标签库无法显示数据求助
嗨~刚接触Spring MVC和JSP的话,碰到JSTL无法展示Controller传递的数据太正常了,我帮你梳理几个最容易踩的坑,你可以逐一排查:
1. 确认JSTL依赖是否正确引入
首先得保证项目里有正确的JSTL依赖,避免因为缺失依赖导致标签失效:
- Maven项目:在
pom.xml中添加以下依赖
<dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency>
- Gradle项目:在
build.gradle中添加
implementation 'javax.servlet.jsp.jstl:jstl:1.2' implementation 'taglibs:standard:1.1.2'
⚠️ 注意:不要手动在WEB-INF/lib中重复放入JSTL的jar包,会引发依赖冲突。
2. 检查JSP页面是否正确引入JSTL核心标签库
在你的JSP页面最顶部必须添加标签库声明,否则JSTL标签根本不会被识别:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
这里的prefix="c"是行业约定的前缀,如果你自定义了其他前缀,遍历数据时要对应修改。
3. 确认Controller是否正确将数据存入Model
Spring MVC中,必须把数据库获取的数据存入Model或ModelAndView中,且键名要和JSP中使用的一致:
示例Controller代码:
@Controller @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @GetMapping("/list") public String getUserList(Model model) { // 从数据库获取数据 List<User> userList = userService.getAllUsers(); // 将数据存入Model,键名"userList"要和JSP中取值的键一致 model.addAttribute("userList", userList); // 返回视图名称(对应JSP文件名) return "user-list"; } }
⚠️ 不要用request.setAttribute()传递数据,Spring MVC推荐使用Model来统一管理视图数据。
4. 检查JSP页面的遍历逻辑是否正确
JSP中遍历数据时,要保证表达式和Controller存入的键名、Model类的属性名完全匹配:
示例JSP代码:
<table> <thead> <tr> <th>用户ID</th> <th>用户名</th> <th>邮箱</th> </tr> </thead> <tbody> <!-- 先判断集合是否为空,避免空指针同时提升用户体验 --> <c:if test="${not empty userList}"> <c:forEach items="${userList}" var="user"> <tr> <td>${user.id}</td> <td>${user.username}</td> <td>${user.email}</td> </tr> </c:forEach> </c:if> <c:if test="${empty userList}"> <tr> <td colspan="3">暂无用户数据</td> </tr> </c:if> </tbody> </table>
⚠️ 注意:${user.id}中的id要和你的Model类(比如User)的getter方法对应——比如getId()对应id,大小写必须匹配。
5. 确认视图解析器配置正确
Spring的视图解析器必须正确配置,且要指定JstlView作为视图类,否则JSTL表达式无法被解析:
示例Java配置(WebMvcConfigurer实现类):
@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Bean public InternalResourceViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); // JSP文件所在目录前缀 resolver.setSuffix(".jsp"); // JSP文件后缀 resolver.setViewClass(JstlView.class); // 必须指定JstlView return resolver; } }
如果是XML配置:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> </bean>
6. 验证数据库查询是否真的返回了数据
最后可以在Controller中加个简单的输出,确认从数据库拿到的集合不是空的:
System.out.println("获取到的用户数量:" + userList.size());
如果输出为0,那问题出在DAO层或数据库查询语句上,和JSTL无关哦~
如果按照上述步骤排查后还是无法解决问题,欢迎把你的Model、Controller和JSP代码贴出来,我再帮你针对性分析!
内容的提问来源于stack exchange,提问作者Jorge Herrera

