JSTL forEach标签无法识别请求对象问题求助
解决JSTL
<c:forEach>无法读取请求对象+TEI类报错问题 核心问题排查与修复步骤
修正EL变量名不匹配
你在Servlet中设置的请求属性名是prods:request.setAttribute("prods", prodList);但JSP里
<c:forEach>的items用的是${prodList},变量名完全对不上!这就是forEach读不到请求对象的直接原因——EL表达式找错了变量。把代码改成:<c:forEach items="${prods}" var="prod"> <c:out value="Inside forEach ..."/> <c:out value="${prod.prodID}"/> <c:out value="${prod.prodName}"/> </c:forEach>(顺便把
var="prods"改成var="prod",语义更合理,避免和属性名混淆)修正Taglib URI错误
JSTL 3.0(适配Jakarta EE 9+,对应Tomcat 10+)的核心标签库URI是完整的HTTPS地址,你写的uri="jakarta.tags.core"是错误的,这会导致容器无法加载正确的Jakarta版本标签实现,反而 fallback到旧的Apache JSTL实现(也就是报错里的org.apache.taglibs.standard.tei.ForEachTEI)。把JSP头部的taglib声明改成:<%@taglib prefix="c" uri="https://jakarta.ee/xml/ns/jakartaee/jstl/core"%>清理Jar包冲突
确认你的WEB-INF/lib目录下只有以下两个Jar:jakarta.servlet.jsp.jstl-3.0.1.jarjakarta.servlet.jsp.jstl-api-3.0.0.jar
删掉所有旧的JSTL相关Jar(比如taglibs-standard-*.jar、jstl-*.jar这类Java EE时代的包)。同时检查Tomcat的lib目录,确保没有残留的旧JSTL Jar(Tomcat 10+本身不自带JSTL,正常情况下不会有)。
清理缓存并重新部署
IDE缓存或Tomcat部署缓存可能导致旧代码/类被加载:- IntelliJ:执行
File -> Invalidate Caches...,勾选"Clear file system cache and local history"后重启 - Eclipse:执行
Project -> Clean,选择你的项目后重建
然后重新部署项目到Tomcat,确保新代码生效。
- IntelliJ:执行
内容的提问来源于stack exchange,提问作者Mexicano_con_ingles
相关产品推荐
相关产品推荐

