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

JSTL forEach标签无法识别请求对象问题求助

解决JSTL <c:forEach>无法读取请求对象+TEI类报错问题

核心问题排查与修复步骤

  1. 修正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",语义更合理,避免和属性名混淆)

  2. 修正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"%>
    
  3. 清理Jar包冲突
    确认你的WEB-INF/lib目录下只有以下两个Jar:

    • jakarta.servlet.jsp.jstl-3.0.1.jar
    • jakarta.servlet.jsp.jstl-api-3.0.0.jar
      删掉所有旧的JSTL相关Jar(比如taglibs-standard-*.jar、jstl-*.jar这类Java EE时代的包)。同时检查Tomcat的lib目录,确保没有残留的旧JSTL Jar(Tomcat 10+本身不自带JSTL,正常情况下不会有)。
  4. 清理缓存并重新部署
    IDE缓存或Tomcat部署缓存可能导致旧代码/类被加载:

    • IntelliJ:执行File -> Invalidate Caches...,勾选"Clear file system cache and local history"后重启
    • Eclipse:执行Project -> Clean,选择你的项目后重建
      然后重新部署项目到Tomcat,确保新代码生效。

内容的提问来源于stack exchange,提问作者Mexicano_con_ingles

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 03:03:13