当前位置: 首页 > article >正文

【已解决】 Tomcat10.1.x使用JSTL标签库

IDEA创建Java EE项目,使用Spring + Spring MVC + MyBatis框架,使用maven管理依赖。项目当前的环境是:

  • Tomat 10.1.28
  • Maven 3.6.3
  • JDK 17

项目的功能:读取数据库的report表中的数据,返回一个List集合对象reportList在JSP页面上,使用EL表达式+JSTL标签库,遍历集合,显示每一条report信息。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    <h3>欢迎登录,${sessionScope.get("user").name}</h3>

    <div>
        <table>
            <c:forEach items="${reportList}" var="report">
                <tr>
                    <td>报告编号:</td><td>${report.id}</td>
                    <td>报告名称:</td><td>${report.reportName}</td>
                    <td>报告内容:</td><td>${report.reportContext}</td>
                    <td>报告截止提交日期:</td><td>${report.deadlineTime}</td>
                </tr>
            </c:forEach>
        </table>
    </div>
</body>
</html>

EL表达式和JSTL标签的使用,需要再项目的pom.xml文件引入了一下依赖

<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

<!-- https://mvnrepository.com/artifact/taglibs/standard -->
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>

因为还需要使用HttpServletRequest对象,并且Tomcat版本是Tomcat10.1.28版本,所以项目的pom.xml增加了jakarta.servlet-api的依赖

<dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId>
    <version>6.1.0</version>
    <scope>provided</scope>
</dependency>

运行后,出现下面这样的报错:

java.lang.ClassNotFoundException: javax.servlet.jsp.tagext.TagLibraryValidator

在这里插入图片描述

针对错误,去搜索了相关的解决办法,发现javax.servlet.jstl也不再符合Tomcat10版本的需求,需要使用jakarta.servlet.jsp.jstl-api版本,所以更改了pom.xml的依赖引用:

<dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId>
    <version>6.1.0</version>
    <scope>provided</scope>
</dependency>

<!--https://mvnrepository.com/artifact/jakarta.servlet.jsp.jstl/jakarta.servlet.jsp.jstl-api-->
<dependency>
    <groupId>jakarta.servlet.jsp.jstl</groupId>
    <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
    <version>3.0.2</version>
</dependency>

<!-- https://mvnrepository.com/artifact/taglibs/standard -->
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>

结果运行还是报同样的错误。

最终在stackoverflow上找到了一篇文章https://stackoverflow.com/questions/8021370/java-lang-noclassdeffounderror-javax-servlet-jsp-tagext-taglibraryvalidator

The javax.servlet.jsp.tagext.TagLibraryValidator class is introduced in JSP 2.0 and then later repackaged to jakarta.servlet.jsp.tagext.TagLibraryValidator in JSP 3.0. This error can thus have the following possible causes:

javax.servlet.jsp.tagext.TagLibraryValidator 类是在 JSP 2.0 中引入的,后来在 JSP 3.0 中重新打包为 jakarta.servlet.jsp.tagext.TagLibraryValidator。因此,此错误可能有以下可能的原因:

  1. You are not running a JSP 2.0 compatible servletcontainer. For example, Tomcat 4.x or 5.0. You need a Tomcat version between 5.5 and 9.0.

您没有运行与 JSP 2.0 兼容的 servletcontainer。例如,Tomcat 4.x 或 5.0。您需要 5.5 到 9.0 之间的 Tomcat 版本。

  1. You are actually running a JSP 3.0 compatible servletcontainer (the first version with jakarta package instead of javax) such as Tomcat 10.0 or newer. In that case you’ll need to upgrade JSTL from 1.x to 2.0 or newer. Installation instructions can be found in How to install JSTL? It fails with “The absolute uri cannot be resolved” or “Unable to find taglib” or NoClassDefFoundError or ClassCastException.

您实际上正在运行与 JSP 3.0 兼容的 servletcontainer(第一个使用 jakarta 包而不是 javax 的版本),例如 Tomcat 10.0 或更新版本。在这种情况下,您需要将 JSTL 从 1.x 升级到 2.0 或更新版本.安装说明可以在 How to install JSTL? It fails with “The absolute uri cannot be resolved” or “Unable to find taglib” or NoClassDefFoundError or ClassCastException.

  1. You have cluttered the /WEB-INF/lib with arbitrarily downloaded jsp-api.jar or j2ee.jar or javaee.jar files or whatever contains the JSP API, which originates from a completely different servletcontainer make/version which in turn was actually not JSP 2.0 compliant. Get rid of those libraries. You don’t need them. If you did this to workaround compilation errors, then you did it the wrong way. They should end up in compiletime classpath, not in the runtime classpath. See also How do I import the javax.servlet / jakarta.servlet API in my Eclipse project?

您已将任意下载的 jsp-api.jar 或 j2ee.jar 或 javaee.jar 文件或任何包含 JSP API 的文件弄得乱七八糟,这些文件来自完全不同的 servletcontainer make/version,而后者实际上并不符合 JSP 2.0 标准。删除这些库。您不需要它们。如果您这样做是为了解决编译错误,那么您做错了。它们应该位于编译时类路径中,而不是运行时类路径中。另请参阅How do I import the javax.servlet / jakarta.servlet API in my Eclipse project?

在这里插入图片描述

在这个回答中,介绍了另一篇文章 How to install JSTL? It fails with “The absolute uri cannot be resolved” or “Unable to find taglib” or NoClassDefFoundError or ClassCastException.
在这里插入图片描述

所以在pom.xml文件中又增加了jakarta.servlet.jsp.jstl的依赖

<dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId>
    <version>6.1.0</version>
    <scope>provided</scope>
</dependency>

<!--https://mvnrepository.com/artifact/jakarta.servlet.jsp.jstl/jakarta.servlet.jsp.jstl-api-->
<dependency>
    <groupId>jakarta.servlet.jsp.jstl</groupId>
    <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
    <version>3.0.2</version>
</dependency>

<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>jakarta.servlet.jsp.jstl</artifactId>
    <version>3.0.1</version>
</dependency>

<!-- https://mvnrepository.com/artifact/taglibs/standard -->
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>

重启项目,页面访问数据显示正常。

在这里插入图片描述


http://www.kler.cn/a/396499.html

相关文章:

  • 游戏引擎学习第九天
  • 【Conda】Windows下conda的安装并在终端运行
  • 直流保护电路设计及保护器件参数说明和选型
  • Linux服务器定时执行jar重启命令
  • 【C++】—— map 与 set 深入浅出:设计原理与应用对比
  • 策略模式、状态机详细解读
  • Android音视频直播低延迟探究之:WLAN低延迟模式
  • 保存pytest的执行日志;在日志中显示当前是第几次执行
  • 基于 Vue 实现简易 Vue-Router
  • GESP4级考试语法知识(贪心算法(五))
  • [白月黑羽]关于仿写类postman功能软件题目的解答
  • Leetcode 每日一题 125.验证回文串
  • PLC如何支持GEM300标准?SECS/GEM通讯协议
  • 卷积层(CNN)全面解析
  • 如何使用 python 中的 Pillow 创建可自定义的图标生成器
  • 软件工程视角:Git 基础与实践
  • NLP开发常见问题
  • 微信小程序之路由跳转传数据及接收
  • JWTUtil工具类
  • 加深深度学习矩阵计算理解--用人类直觉 走进线性代数(非应试)
  • 自存 关于RestController请求传参数 前端和后端相关
  • web——upload-labs——第五关——大小写绕过绕过
  • HarmonyOS本地存储-Preferences(用户首选项)的使用
  • MATLAB 使用教程 —— 常用函数
  • Git 时想要放弃当前的 commit 操作
  • Javaweb-day11案例(文件)