记一次@WebServlet不生效的问题

背景

废话不多说,在用idea生成的web应用中,通过tomcat启动之后,无法访问@WebServlet定义的Servlet,报404错误

问题定位过程

由于项目是个demo,直接通过idea生成,理论上直接就可以用了。然后百度了一下,回答都是以下两种原因

  1. web.xml协议版本太低,要3.0以上才支持
  2. metadata-complete要设置为false
    我检查了我的项目,版本是4.0,metadata-complete没有设置,但我看定义说明,默认就不需要设置

    后面还是按照别人的回答去设置了,重新启动,一样的效果
    看来是别人的问题点跟我的不一样,需要重新定位。
    我不再用@WebServlet注解,直接在web.xml里面配置servlet看下是不是注解有问题
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    version="4.0">
    <servlet>
        <servlet-name>helloServlet</servlet-name>
        <servlet-class>zhugr.demo.simpleWeb.HelloServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

重启,重新访问,报错,不过还好,这是另外一个错了

这是说类没找到,这种问题一般是版本冲突导致的,我找了本地tomcat的servlet看,原来是tomcat的版本和原本项目的版本冲突了。。。
我的tomcat版本是10.0.8(通过homebrew安装),这么高的版本用的jdk不再是javax的命名空间,而是jakarta,个中缘由可以看下这个贴:
https://fangshixiang.blog.csdn.net/article/details/118403779
至此问题终于找到了,把maven的servlet引入改为下面GAV即可(类中接口的引入也要变更):

<!-- https://mvnrepository.com/artifact/jakarta.servlet/jakarta.servlet-api -->
<dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId>
    <version>5.0.0</version>
    <scope>provided</scope>
</dependency>
posted @ 2021-08-14 15:36  冰肌玉骨小香脐  阅读(2849)  评论(0编辑  收藏  举报