記一次@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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM