Eclipse中Servlet运行路径异常引发404错误求助
问题:Eclipse运行Servlet时路径错误触发404,手动访问正常
我有一个基于Maven的Web项目,使用Eclipse 2025-03和Tomcat 11。运行Servlet时,Eclipse自动打开的路径为http://localhost:8100/Web_De_Productos_Dos/servlet/com.pildorasinformaticas.productos.ServletPruebas,触发404错误;但手动访问http://localhost:8100/Web_De_Productos_Dos/ServletPruebas时功能完全正常。
问题源于修改项目facets的动态Web版本(从2.4改为4.0)和Java版本(从24改为21),改回原配置后问题依旧。
解决方法
1. 修正Eclipse的Servlet运行配置
- 打开Eclipse的Run Configurations,找到对应Tomcat服务器配置
- 切换到Deployment标签,确认项目上下文路径为
/Web_De_Productos_Dos - 切换到Web Application标签,找到
ServletPruebas,将其URL修改为/ServletPruebas,替换自动生成的带全类名的路径 - 保存配置后重新运行
2. 清理并重建项目
- 执行Eclipse菜单
Project > Clean,选择当前项目清理 - 右键项目选择
Maven > Clean,再执行Maven > Install重新构建 - 删除Tomcat工作目录(
Tomcat安装目录/work/Catalina/localhost下对应项目文件夹),重启Tomcat
3. 统一Web版本与依赖兼容性
当前项目存在版本冲突:web.xml指定Servlet 2.4,但pom.xml引入了Jakarta Servlet 5.0,需二选一:
- 保留Servlet 2.4:移除pom.xml中的Jakarta依赖,替换为javax版本
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>2.4</version> <scope>provided</scope> </dependency> - 适配Tomcat 11:将web.xml升级为Servlet 5.0+版本,同时匹配依赖版本
修改web.xml根元素:
更新pom.xml中的servlet-api版本:<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" version="5.0"><dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.0.0</version> <scope>provided</scope> </dependency>
4. 核对项目Facets配置
- 右键项目选择
Properties > Project Facets - 确认Dynamic Web Module版本与web.xml、pom.xml的Servlet版本一致
- 确认Java版本与pom.xml中
maven-compiler-plugin的release版本一致(当前为24)
项目相关代码与配置
Servlet代码
package com.pildorasinformaticas.productos; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import javax.sql.*; import jakarta.annotation.Resource; /** * Servlet implementation class ServletPruebas */ @WebServlet("/ServletPruebas") public class ServletPruebas extends HttpServlet { private static final long serialVersionUID = 1L; //definir o establecer el dataSource @Resource(name="jdbc/Productos") private DataSource miPool; /** * @see HttpServlet#HttpServlet() */ public ServletPruebas() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub //response.getWriter().append("Served at: ").append(request.getContextPath()); // crear el objeto printWriter PrintWriter salida = response.getWriter(); response.setContentType("text/plain"); //crear conexion con bbdd Connection miConexion = null; Statement miStatement = null; ResultSet miResultSet = null; try { miConexion = miPool.getConnection(); String mySql = "SELECT * FROM PRODUCTOS"; miStatement = miConexion.createStatement(); miResultSet = miStatement.executeQuery(mySql); while(miResultSet.next()) { String nombre_articulo = miResultSet.getString(3); salida.println(nombre_articulo); } }catch(Exception e) { e.printStackTrace(); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
pom.xml配置
<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>Web_De_Productos_Dos</groupId> <artifactId>Web_De_Productos_Dos</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.29</version> <!-- Verifica la última versión disponible --> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.3</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>5.0.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>jakarta.servlet.jsp.jstl</groupId> <artifactId>jakarta.servlet.jsp.jstl-api</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jakarta.servlet.jsp.jstl</artifactId> <version>2.0.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.3</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.13.0</version> <configuration> <release>24</release> </configuration> </plugin> </plugins> </build> </project>
META-INF/context.xml配置
<?xml version="1.0" encoding="UTF-8"?> <Context> <!-- Aquí puedes configurar recursos si es necesario --> <Resource name="jdbc/Productos" auth="Container" type="javax.sql.DataSource" maxTotal="15" maxIdle="3" maxWaitMillis="5000" username="root" password="" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/curso_sql"> </Resource> </Context>
WEB-INF/web.xml配置
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>Web_De_Productos_Dos</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <resource-ref> <description>Base de datos MySQL</description> <res-ref-name>jdbc/Productos</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> </web-app>
内容的提问来源于stack exchange,提问作者Tefa
相关产品推荐
相关产品推荐

