【已解决】 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.xdnf.cn/news/16448.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode74. 搜索二维矩阵(2024冬季每日一题 6)

给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。…

数据分析24.11.13

Excel 函数 求和 函数 sum() sumif() SUMIF(range, criteria, [sum_range]) sumifs() average() count() max() min() 逻辑 函数 if() iferror() 查询函数 VLOOKUP()

DveOps-Git-版本控制

1. 概述 分布式版本控制系统 版本控制 2. Git极速上手指南 官方传送门:Git - Branching and Merging 2.1 安装 ## windows https: git-scm.com/download/## Linux(CentOS/Fedora/Rocky Linux/RHEL) yum install -y git ## MacOS brew install git## Ubuntu/Debian apt in…

DevOps工程技术价值流:加速业务价值流的落地实践与深度赋能

DevOps的兴起&#xff0c;得益于敏捷软件开发的普及与IT基础设施代码化管理的革新。敏捷宣言虽已解决了研发流程中的诸多挑战&#xff0c;但代码开发仅是漫长价值链的一环&#xff0c;开发前后的诸多问题仍亟待解决。与此同时&#xff0c;虚拟化和云计算技术的飞跃&#xff0c;…

Tensorflow基本概念

简介&#xff1a;本文从Graph讲到Session&#xff0c;同时讲解了tf.constant创建tensor的用法和variable需要初始化的知识点&#xff0c;可以给你打好一个学习Tensorflow的基础。本文都是基于TensorFlow1.14.0的版本下运行。 本专栏将会系统的讲解TensorFlow在1.14.0版本下的各…

【React】响应事件

1.添加事件处理函数 按照如下三个步骤&#xff0c;即可让它在用户点击时显示消息&#xff1a; 在 Button 组件 内部 声明一个名为 handleClick 的函数。实现函数内部的逻辑&#xff08;使用 alert 来显示消息&#xff09;。添加 onClick{handleClick} 到 <button> JSX …

初遇Python-----python/anaconda/PyCharm安装应用问题

作为一名医学生,小编之前从未用过python,一直将R视为数据分析的利器,至于到底R好用还是Python好用,一直是广大网友们争论的热点,小编资历尚浅,对此就不予评价了。最近需要对部分数据进行建模工作,奈何三方工具完全基于python语言编写的,迫不得已小编也只能挠头学习了。本…

基于reads的宏基因组与宏转录组医学分析流程正式上线!

随着生物医学领域的快速发展&#xff0c;宏基因组学和宏转录组学正逐渐成为研究微生物群落及其在人体健康与疾病中作用的关键技术。然而&#xff0c;医学研究样品往往存在微生物含量较低的情况&#xff0c;这给数据分析带来了挑战。为了解决这一难题&#xff0c;并适应不断增长…

使用Aria2实现离线下载

最近有需要BT下载&#xff0c;但有的资源很冷门&#xff0c;速度很慢&#xff0c;总不能一直开着电脑下载&#xff0c;于是想到部署个离线下载。想起之前用雨云服务器拿来部署兰空图床感觉效果不错&#xff0c;发现内存剩的还挺多&#xff0c;所以继续压榨一下&#x1f60f; 提…

第三百二十三节 Java线程教程 - Java同步器

Java线程教程 - Java同步器 同步器对象与一组线程一起使用。 它维护一个状态&#xff0c;根据它的状态&#xff0c;它让一个线程通过或强迫它等待。 本节将讨论四种类型的同步器&#xff1a; SemaphoresBarriersLatchesExchangers 信号量 信号量用于控制可以访问资源的线程…

HTB:Active[WriteUP]

目录 连接至HTB服务器并启动靶机 1.How many SMB shares are shared by the target? 使用nmap对靶机TCP端口进行开放扫描 2.What is the name of the share that allows anonymous read access? 使用smbmap通过SMB服务对匿名用户共享权限情况进行扫描 3.Which file has…

vue3【组件封装】S-icon 图标 ( 集成 iconify )

1. 安装依赖 npm i -D iconify/jsonnpm i --save-dev iconify/vue2. 组件封装 src/components/S-icon.vue <script setup lang"ts"> // 搜索图标 https://icon-sets.iconify.design/ import { Icon } from iconify/vue defineProps({icon: {type: String,requ…

AI视觉小车基础--1.开发前的准备

1. 结束开机大程序 为了能够方便体验小车的APP功能&#xff0c;系统中增加了一个程序&#xff0c;此程序集合了APP的控制功能和玩法&#xff0c;所以称做“大程序”&#xff0c;而且在主板系统开机时&#xff0c;此程序会自动启动&#xff0c;所以称做“开机自启动大程序”。 开…

6.传输层协议、ACL

TCP和UDP协议 TCP/IP协议组的传输层协议 TCP(Transmission Control Protocol ) 传输控制协议 UDP&#xff08;User Datagram Protocol &#xff09; 用户数据报协议 TCP协议 TCP是面向连接的、可靠的进程到进程通信的协议 TCP提供全双工服务&#xff0c;即数据可在同一时间双…

避免数据丢失!在NAS上保存Docker容器配置的正确姿势

引言 如果你使用NAS来管理家庭或小型企业的数据,那么Docker容器一定不陌生。它能快速部署各种应用,比如Jellyfin、Plex等多媒体服务器。然而,很多人却踩过一个坑:NAS关机重启后,Docker容器的配置居然丢了!辛苦搭建的环境瞬间化为乌有。别担心,今天就来分享一套实用的技…

【Java的动态代理】

Java中有两种实现动态代理的方式jdk动态代理和CGLIB动态代理 jdk动态代理: 基于接口的动态代理, 目标对象必须实现接口cglib动态代理: 基于字节生成技术(ASM代码生成库), 能在运行时对java类和接口进行扩展实现 那么动态代理这个技术到底能帮我们干啥? 个人感觉这个技术在框…

python怎么安装numpy

1、在python官网https://pypi.python.org/pypi/numpy中找到安装的python版本对应的numpy版本。 例如&#xff1a; python版本是&#xff1a; 下载的对应numpy版本是&#xff1a; 2、将numpy下载到python的安装目录下的scripts文件夹中&#xff1b; 3、然后在cmd中执行以下命…

计算机三级 数据库技术

第一章 数据库应用系统开发方法 1.1 数据库应用系统生命周期 软件工程:软件工程的思想&#xff0c;即用工程的概念、原理、技术和方法对软件生产、开发的全过程进行跟踪和管理 软件开发方法:瀑布模型、快速原型模型、螺旋模型 DBAS生命周期模型 1.2 规划与分析 系统规划与定…

网络编程套接字2

之前我们已经介绍了UDP套接字流程&#xff0c;接下来我们介绍TCP流套接字编程&#xff0c;TCP的一个核心特点&#xff0c;面向字节流&#xff0c;读写数据的基本单位就是字节。 1.API介绍 1.1ServerSocket:是创建TCP服务器Socket的API&#xff08;专门给服务器用&#xff09;…

偌依-防重复提交

其中的使用工具类可去偌依的代码中查找 需要配合 springboot自定义过滤器构建可重复读取inputStream的request&#xff08;来源若依&#xff09; springboot自定义过滤器构建可重复读取inputStream的request&#xff08;来源若依&#xff09;-CSDN博客 定义注解 package co…