记一次@WebServlet不生效的问题
背景
废话不多说,在用idea生成的web应用中,通过tomcat启动之后,无法访问@WebServlet定义的Servlet,报404错误
问题定位过程
由于项目是个demo,直接通过idea生成,理论上直接就可以用了。然后百度了一下,回答都是以下两种原因
- web.xml协议版本太低,要3.0以上才支持
- 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>