Tomcat+Servlet运行后出现404错误解决方案
Tomcat+Servlet运行后出现404错误解决方案
一、错误效果复现
后续的解决方案,仅仅针对我遇到的情况。对不能涵盖大部分情况感到抱歉。
二、错误分析
先看看源代码?
package com.example.secondclass.Servlet;
import java.io.*;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet(name = "login", value = "/login")
public class login extends HttpServlet {
private String message;
public void init() throws ServletException
{
message = "Hello World";
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
request.getRequestDispatcher("/logok.html").forward(request, response);
}
public void destroy()
{
}
}
问题出在 javax.servlet
和 jakarta.servlet
这两个包的不同版本兼容性上。
- Servlet API 版本变更
在 Servlet 5.0 及以后的版本(Tomcat 10 及以上),javax.servlet
命名空间被迁移到了jakarta.servlet
,这意味着:- Servlet 4.0 及以下(Tomcat 9 及以下): 使用
javax.servlet.*
- Servlet 5.0 及以上(Tomcat 10 及以上): 使用
jakarta.servlet.*
- Servlet 4.0 及以下(Tomcat 9 及以下): 使用
- Tomcat 10 使用 Jakarta EE
看上面的图,我使用的是Tomcat 10.1.36 默认支持 Jakarta EE 9+,它已经不再支持javax.servlet
,所以如果代码仍然使用javax.servlet
,Tomcat 无法找到相应的类,导致404
资源不可用的错误。
三、解决方案
3.1 方案 1:升级代码到 Jakarta EE(推荐)
既然Tomcat版本很高(>10.0),建议完全迁移到 jakarta.servlet
,即:
- 确保项目中
javax.servlet
相关的依赖已移除 - 只使用
jakarta.servlet
如果使用 Maven,请检查 pom.xml
,确保使用 Jakarta 依赖:
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
<scope>provided</scope>
</dependency>
3.2 方案 2:降级 Tomcat
如果想继续使用 javax.servlet
,可以换回 Tomcat 9,因为它仍然支持 javax.servlet
:
-
下载 Tomcat 9 并配置到 IntelliJ IDEA
-
确保你的
pom.xml
依赖的是 javax.servlet-api<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>