Tomcat与Servlet、JSP、JDK的版本适配问题(解决访问出现404和500的问题)

简介: 一、问题描述最近在学习Maven创建Java Web项目的过程中,出现了配置Servlet后访问出现404和500的问题,如下

一、问题描述

最近在学习Maven创建Java Web项目的过程中,出现了配置Servlet后访问出现404和500的问题,如下

76c2ee1da28143d9b13f8f7e3ccb1e34.png

1d61154faf1b4b228e95645817fee5e5.png

二、出现原因

在网上查了许多资料之后,我发现这是因为Tomcat版本的适配问题。

Tomcat的官网中,我们可以看到不同版本的Tomcat适配的JDK、Servlet、Jsp以及EL的版本,如下:

5c8f91065f0c4f0ca8adebd6ad4895e3.png

由于我使用的是Tomcat10.0.12的版本,而我使用Maven导入的依赖如下

<dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
</dependency>
<dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.2-b01</version>
</dependency>

这将导致Tomcat版本无法兼容Servlet版本(tomcat10将JavaEE更换成了Jakarta® EE,所以原Servlet包"javax.servlet.“更改成了"jakarta.servlet.”),我们在500的图中根本原因的第一行也可以看到:Register cannot be cast to class Jakarta.servlet.Servlet,即我使用的是Servlet是javax包里的,而Tomcat能够识别(适配)的是Jakarta包里的,而javax包里的Servlet类无法转换为Jakarta包里的Servlet类,所以显示了例外情况里的第一行:类cn.ken.controller.Register不是Servlet。

三、解决方法

既然是由于Tomcat版本与Servlet版本不匹配造成,那么自然就有对应的两种解决方法

1、降低Tomcat版本

因为tomcat10才改成Jakarta,故只需将Tomcat版本降低到10以下,例如Tomcat9等。


当然还要结合具体情况进行分析,让使用的Tomcat版本能够匹配自己使用的JSP或JDK等的版本


除了通过下载安装新的Tomcat(这显然比较麻烦),我们也可以通过Maven安装低版本的Tomcat插件来运行,具体操作可见Maven继承Tomcat插件

2、提高Servlet版本

将pom.xml中的Servlet更换为最新的依赖,与使用的Tomcat匹配,如下

<dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-servlet-api</artifactId>
      <version>10.0.12</version>
</dependency>
<dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-jsp-api</artifactId>
      <version>10.0.12</version>
</dependency>

重新加载Maven变更后即可成功访问Sevrlet

四、相关内容

对于 JDK,高版本的Tomcat是可以正常使用低版本的JDK,反之则不行


JAVA servlet 2.x规范:

 项目目录结构必须要有WEB-INF,web.xml等文件夹和文件

 在web.xml中配置servlet,filter,listener,以web.xml为java web项目的统一入口


JAVA servlet 3.x规范:

 项目中可以不需要WEB-INF,web.xml等文件夹和文件

 在没有web.xml文件的情况下,通过注解实现servlet,filter, listener的声明,例如

 @WebServlet, @WebFilter,@WebListener,当使用注解时,容器自动进行扫描。


相关文章
|
3月前
|
Java 容器
【学习笔记】Jsp与Servlet技术
【学习笔记】Jsp与Servlet技术
92 0
|
3月前
|
Java 关系型数据库 MySQL
自动化测试项目实战笔记(一):JDK、Tomcat、MySQL、Jpress环境安装和搭建
这篇文章是关于自动化测试项目实战笔记,涵盖了JDK、Tomcat、MySQL、Jpress环境的安装和搭建过程,以及测试用例和常见问题总结。
66 1
自动化测试项目实战笔记(一):JDK、Tomcat、MySQL、Jpress环境安装和搭建
|
3月前
|
缓存 Java Maven
java: 警告: 源发行版 11 需要目标发行版 11 无效的目标发行版: 11 jdk版本不符,项目jdk版本为其他版本
如何解决Java项目中因JDK版本不匹配导致的编译错误,包括修改`pom.xml`文件、调整项目结构、设置Maven和JDK版本,以及清理缓存和重启IDEA。
69 1
java: 警告: 源发行版 11 需要目标发行版 11 无效的目标发行版: 11 jdk版本不符,项目jdk版本为其他版本
|
3月前
|
Java 关系型数据库 MySQL
【编程基础知识】Eclipse连接MySQL 8.0时的JDK版本和驱动问题全解析
本文详细解析了在使用Eclipse连接MySQL 8.0时常见的JDK版本不兼容、驱动类错误和时区设置问题,并提供了清晰的解决方案。通过正确配置JDK版本、选择合适的驱动类和设置时区,确保Java应用能够顺利连接MySQL 8.0。
301 1
|
3月前
|
Dubbo Java 应用服务中间件
剖析Tomcat线程池与JDK线程池的区别和联系!
剖析Tomcat线程池与JDK线程池的区别和联系!
167 0
剖析Tomcat线程池与JDK线程池的区别和联系!
|
3月前
|
Java 关系型数据库 开发工具
idea创建不了spring2.X版本,无法使用JDK8,最低支持JDK17 , 如何用idea创建spring2.X版本,使用JDK8解决方案
本文提供了解决方案,如何在IDEA中创建Spring 2.X版本的项目并使用JDK8,尽管Spring 2.X已停止维护且IDEA不再直接支持,通过修改pom.xml或使用阿里云的国内源来创建项目。
159 0
idea创建不了spring2.X版本,无法使用JDK8,最低支持JDK17 , 如何用idea创建spring2.X版本,使用JDK8解决方案
|
3月前
|
Oracle Java 关系型数据库
jdk17安装全方位手把手安装教程 / 已有jdk8了,安装JDK17后如何配置环境变量 / 多个不同版本的JDK,如何配置环境变量?
本文提供了详细的JDK 17安装教程,包括下载、安装、配置环境变量的步骤,并解释了在已有其他版本JDK的情况下如何管理多个JDK环境。
1862 0
|
4月前
|
Java 应用服务中间件 Maven
JavaWeb基础5——HTTP,Tomcat&Servlet
JavaWeb技术栈、HTTP、get和post区别、响应状态码、请求响应格数据式、IDEA使用Tomcat、报错解决、Servlet的体系结构、IDEA使用模板创建Servlet
JavaWeb基础5——HTTP,Tomcat&Servlet
|
5月前
|
开发者 C# UED
WPF多窗口应用程序开发秘籍:掌握窗口创建、通信与管理技巧,轻松实现高效多窗口协作!
【8月更文挑战第31天】在WPF应用开发中,多窗口设计能显著提升用户体验与工作效率。本文详述了创建新窗口的多种方法,包括直接实例化`Window`类、利用`Application.Current.MainWindow`及自定义方法。针对窗口间通信,介绍了`Messenger`类、`DataContext`共享及`Application`类的应用。此外,还探讨了布局控件与窗口管理技术,如`StackPanel`与`DockPanel`的使用,并提供了示例代码展示如何结合`Messenger`类实现窗口间的消息传递。总结了多窗口应用的设计要点,为开发者提供了实用指南。
322 0
|
5月前
|
前端开发 安全 Java
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
34 0