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,当使用注解时,容器自动进行扫描。


相关文章
|
20天前
|
Java
学校教师管理系统【JSP+Servlet+JavaBean】(Java课设)
学校教师管理系统【JSP+Servlet+JavaBean】(Java课设)
19 1
|
20天前
|
Java
人事管理系统【JSP+Servlet+JavaBean】(Java课设)
人事管理系统【JSP+Servlet+JavaBean】(Java课设)
16 0
|
1月前
使用Servlet上传多张图片——前台页面层(Index.jsp)
使用Servlet上传多张图片——前台页面层(Index.jsp)
12 0
|
1月前
|
SQL Java 应用服务中间件
使用Servlet上传多张图片——访问提示
使用Servlet上传多张图片——访问提示
11 0
|
4天前
|
Oracle Java 关系型数据库
Java 开发者必备:JDK 版本详解与选择策略(含安装与验证)
Oracle Java SE 支持路线图显示,JDK 8(LTS)支持至2030年,非LTS版本如9-11每6个月发布且支持有限。JDK 11(LTS)支持至2032年,而JDK 17及以上版本现在提供免费商用许可。LTS版本提供长达8年的支持,每2年发布一次。Oracle JDK与OpenJDK有多个社区和公司构建版本,如Adoptium、Amazon Corretto和Azul Zulu,它们在许可证、商业支持和更新方面有所不同。个人选择JDK时,可考虑稳定性、LTS、第三方兼容性和提供商支持。
10 0
|
20天前
|
Java
排课系统【JSP+Servlet+JavaBean】(Java课设)
排课系统【JSP+Servlet+JavaBean】(Java课设)
7 0
|
20天前
|
Java
仓库管理系统【JSP+Servlet+JavaBean】(Java课设)
仓库管理系统【JSP+Servlet+JavaBean】(Java课设)
12 0
|
20天前
|
Java
学校人员管理系统【JSP+Servlet+JavaBean】(Java课设)
学校人员管理系统【JSP+Servlet+JavaBean】(Java课设)
14 0
|
1月前
|
Java 应用服务中间件 nginx
idea打war包时,JDK版本的问题解决方式
idea打war包时,JDK版本的问题解决方式
13 0
|
1月前
|
Java
916.【Java】javap 查看 class 文件的jdk编译版本
916.【Java】javap 查看 class 文件的jdk编译版本
49 2