IntelliJ IDEA中标准Java EE Servlet项目访问指定路径返回404错误
问题描述
在IntelliJ IDEA中创建标准Servlet项目,访问localhost:8080/javaee可正常打开首页,访问localhost:8080/javaee/hello-servlet时返回404错误。
关联配置信息
pom.xml配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>java-ee</artifactId> <version>1.0-SNAPSHOT</version> <name>java-ee</name> <packaging>war</packaging> <properties> <maven.compiler.target>11</maven.compiler.target> <maven.compiler.source>11</maven.compiler.source> <junit.version>5.7.1</junit.version> </properties> <dependencies> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>5.0.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.1</version> </plugin> </plugins> </build> </project>
项目结构

index.jsp代码
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <!DOCTYPE html> <html> <head> <title>JSP - Hello World</title> </head> <body> <h1><%= "Hello World!" %> </h1> <br/> <a href="hello-servlet">Hello Servlet</a> </body> </html>
HelloServlet.java代码
package com.example; import java.io.*; import jakarta.servlet.http.*; import jakarta.servlet.annotation.*; @WebServlet(name = "helloServlet", value = "/hello-servlet") public class HelloServlet extends HttpServlet { private String message; public void init() { message = "Hello World!"; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("<h1>" + message + "</h1>"); out.println("</body></html>"); } public void destroy() { } }
Tomcat运行配置


解决方案
该问题核心原因是包规范与Tomcat版本不兼容,jakarta.servlet-api 5.0.0属于Servlet 5.0规范,仅Tomcat 10及以上版本支持,Tomcat 9及更低版本使用的是javax.servlet包,无法识别jakarta包下的注解。可选择以下任意一种方案解决:
- 方案1:升级本地Tomcat版本到10.x或更高版本,直接兼容现有jakarta.servlet相关依赖和注解
- 方案2:保留现有低版本Tomcat,将项目依赖替换为javax.servlet规范包:
- 修改pom.xml中的Servlet依赖为:
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>- 将HelloServlet.java中所有jakarta开头的import语句替换为javax开头:
import javax.servlet.http.*; import javax.servlet.annotation.*; - 额外检查项:
- 确认web.xml的版本在3.0以上,低于3.0的版本不支持
@WebServlet注解 - 确认项目的
src/main/java目录已被IDEA标记为源码根目录(目录显示为蓝色),未标记的话右键目录选择「Mark Directory as -> Sources Root」 - 确认Tomcat部署配置的应用上下文路径为
/javaee,与访问路径前缀保持一致
- 确认web.xml的版本在3.0以上,低于3.0的版本不支持
内容的提问来源于stack exchange,提问作者Alexander Lopatin
相关产品推荐
相关产品推荐

