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


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


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

     

     

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

     

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

  • 相关阅读:
    LeetCode中等题之旋转图像
    2022下半年教资已经开始注册,1分钟看懂证件照审核要求
    pinpoint监控tomcat应用,页面显示No data collected
    第三方代开的微信小程序更换管理员
    一文理解OpenStack网络
    25、Camunda Service Task、任务监听器和执行监听器
    tomcat修改默认端口详细步骤(包含运行测试)
    任意文件读取
    Nanoprobes丨二棕榈酰磷脂酰乙醇胺-十一金中文说明
    使用Next.js和web3auth来创建DApps
  • 原文地址:https://blog.csdn.net/swebin/article/details/125378304