You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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根元素:
    <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">
    
    更新pom.xml中的servlet-api版本:
    <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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 13:07:32