【已解决】 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>

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/916677.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

权限相关知识

1.Linux权限的概念 在说Linux权限的概念之前我来问大家一个问题&#xff0c;你们觉得什么是权限&#xff1f; 权限平时的体现呢&#xff0c;就比如不是校长的亲戚就不能逛办公室&#xff0c;没充会员的爱奇艺看不了VIP影视剧&#xff0c;没成会员的的蛋糕店拿不到会员价等等等…

uniapp如何i18n国际化

1、正常情况下项目在代码生成的时候就已经有i18n的相关依赖&#xff0c;如果没有可以自行使用如下命令下载&#xff1a; npm install vue-i18n --save 2、创建相关文件 en文件下&#xff1a; zh文件下&#xff1a; index文件下&#xff1a; 3、在main.js中注册&#xff1a…

[刷题]入门3.彩票摇奖

博客主页&#xff1a;算法歌者本篇专栏&#xff1a;[刷题]您的支持&#xff0c;是我的创作动力。 文章目录 1、题目2、基础3、思路4、结果 1、题目 链接&#xff1a;洛谷-P2550-彩票摇奖 2、基础 此题目考察数组、三重循环、自增操作的能力。 3、思路 写代码时候&#xf…

JVM垃圾回收详解(重点)

堆空间的基本结构 Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时&#xff0c;Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收 Java 堆是垃圾收集器管理的主要区域&#xff0c;因此也被称作 GC 堆&#xff08;Garbage Collected Heap&…

git rebase --continue解冲突操作

git rebase --continue解冲突操作 如果只是执行了 git rebase 命令&#xff0c;那么git会输出一下“错误”提示&#xff1a; There is no tracking information for the current branch. Please specify which branch you want to rebase against. See git-rebase(1) for detai…

腾讯地图GL JS点标识监听:无dragend事件的经纬度获取方案

引入腾讯地图SDK <!--腾讯地图 API--><script charset"utf-8" src"https://map.qq.com/api/gljs?librariestools&v1.exp&key***"></script>构建地图容器 <div class"layui-card"><div class"layui-car…

249: 凸包面积

解法&#xff1a; 使用Andrew算法【计算几何/凸包】安德鲁算法&#xff08;Andrews Algorithm&#xff09;详解_andrew算法求凸包-CSDN博客 排序&#xff1a; 将所有点按照x坐标进行升序排序。如果x坐标相同&#xff0c;则按照y坐标升序排序。 初始化栈&#xff1a; 使用一个栈…

基于VUE实现语音通话:边录边转发送语言消息、 播放pcm 音频

文章目录 引言I 音频协议音频格式:音频协议:II 实现协议创建ws对象初始化边录边转发送语言消息 setupPCM按下通话按钮时开始讲话,松开后停止讲话播放pcm 音频III 第三库recorderplayer调试引言 需求:电台通讯网(电台远程遥控软件-超短波)该系统通过网络、超短波终端等无线…

【Rust中的项目管理】

Rust中的项目管理 前言Package&#xff0c;Crate&#xff0c;Module &use &#xff0c;Path通过代码示例解释 Crate&#xff0c;Module &#xff0c;use&#xff0c;Path创建一个package&#xff1a;代码组织化skin.rs 中的代码struct & enum 相对路径和绝对路径引用同…

极客争锋 智连未来 TuyaOpen Framework极客创意大赛正式开启

TuyaOpen Framework极客创意大赛正式开启 可选择基于: TuyaOpen Framework 原生开源包: https://github.com/tuya/tuyaopen 支持 Ubuntu/T2/T3/T5/ESP32/ESP32C3等多款芯片TuyaOpen Arduino:https://github.com/tuya/arduino-tuyaopen支持 T2/T3/T5等多款芯片TuyaOpen LuaNode…

安装SQL server中python和R

这两个都是编程语言 R 是一种专门为统计计算和数据分析而设计的语言&#xff0c;它具有丰富的统计函数和绘图工具&#xff0c;常用于学术研究、数据分析和统计建模等领域。 Python 是一种通用型编程语言&#xff0c;具有简单易学、语法简洁、功能强大等特点。它在数据科学、机…

A029-基于Spring Boot的物流管理系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

理解HTTP中的Cookie与Session:机制、安全性与报头响应

文章目录 1. HTTP Cookie1.1. HTTP Cookie 工作流程1.2. Cookie 分类1.3. 安全性主要用途 2. Set-Cookie 报头2.1. Set-Cookie 格式2.2. 生命周期 3. HTTP Session3.1. 工作流程3.2. 安全性3.3. 超时 与 失效3.4. 用途 1. HTTP Cookie HTTP Cookie&#xff08;也称为 Web Cook…

【电脑】解决DiskGenius调整分区大小时报错“文件使用的簇被标记为空闲或与其它文件有交叉”

【电脑】解决DiskGenius调整分区大小时报错“文件使用的簇被标记为空闲或与其它文件有交叉” 零、报错 在使用DiskGenius对磁盘分区进行调整时&#xff0c;DiskGenius检查出磁盘报错&#xff0c;报错信息&#xff1a;文件使用的簇被标记为空闲或与其它文件有交叉&#xff0c;…

redis linux 安装

下载解压 https://download.redis.io/releases/ tar -zvxf ----redis-7.4.1编译 进入目录下 # redis 依赖c yum install gcc-cmake可能会有问题&#xff0c;所以记得换源# 安装到 /usr/local/redis make PREFIX/usr/local/redis installcd src ./redis-serverredis.confi…

TG2016SLN爱普生38.400000MHz温度补偿振荡器X1G005731070216

在电子电路系统中&#xff0c;频率如同心脏跳动的节奏&#xff0c;为整个系统的有序运行提供基本节拍。38.4MHz 这个频率在众多电子应用场景中有广泛的用途。在数字电路领域&#xff0c;它可以作为时钟信号&#xff0c;为微处理器、微控制器等核心芯片提供稳定的工作频率&#…

LabVIEW 实现 find_nearest_neighbors 功能(二维平面上的最近邻查找)

1. 背景介绍 在数据分析和图像处理领域&#xff0c;经常需要查找给定点的最近邻居点。在LabVIEW中&#xff0c;计算二维平面上多个点之间的欧氏距离&#xff0c;并返回距离最近的几个点是一种常见操作。find_nearest_neighbors 函数用于实现这个功能。 2. 欧氏距离计算 在二维…

【Rust 编程语言工具】rustup-init.exe 安装与使用指南

rustup-init.exe 是用于安装和管理 Rust 编程语言工具链的 Windows 可执行文件。Rust 是一种系统级编程语言&#xff0c;旨在提供安全、并发和高性能的功能。rustup-init.exe 是官方提供的安装器&#xff0c;用于将 Rust 安装到 Windows 操作系统中&#xff0c;并配置相关环境。…

道陟科技EMB产品开发进展与标准设计的建议|2024电动汽车智能底盘大会

11月12日&#xff0c;2024电动汽车智能底盘大会在重庆开幕。会议由中国汽车工程学会主办&#xff0c;电动汽车产业技术创新战略联盟、中国汽车工程学会智能底盘分会、智能绿色车辆与交通全国重点实验室承办。本届大会围绕电动汽车智能底盘相关技术发展与融合&#xff0c;满足高…

【RabbitMQ】09-取消超时订单

生产者完成创建订单和扣减库存之后&#xff0c;发送消息到延迟队列。 // 3.清理购物车商品cartClient.deleteCartItemByIds(itemIds);// cartService.removeByItemIds(itemIds);// 4.扣减库存try {itemClient.deductStock(detailDTOS);//itemService.deductStock(detailDTOS);…