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

Apache Tomcat 10.1运行CRUD项目返回404错误求助

问题:Tomcat 10.1运行学生信息跟踪CRUD项目出现404错误

在Apache Tomcat 10.1上运行学生信息跟踪CRUD项目时,浏览器返回404错误,错误描述为:The origin server did not find a current representation for the target resource or is not willing to disclose that one exists,无法定位问题原因,请求帮助。

项目相关代码

Servlet代码

package com.crud.app;

import java.io.IOException;
import java.sql.SQLException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

import jakarta.annotation.Resource;

/**
 * Servlet implementation class ServletUtil
 */
@WebServlet("/ServletUtil")
public class ServletUtil extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
    @Resource(name="jdbc/web_student_tracker")//db name
    public StudentDbUtil studentDB;
    private DataSource datasource;//connection pool
         
    public ServletUtil() {
        super();
        // TODO Auto-generated constructor stub
    }

    @Override
    public void init() throws ServletException {//will be intialised when the server is called
        super.init();
        try {
            studentDB=new StudentDbUtil(datasource);//passing the connection pool
        }
        catch(Exception es) {//if db has an error
            es.printStackTrace();
        }
        
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        listStudent(request,response);
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }

    private void listStudent(HttpServletRequest request, HttpServletResponse response) throws SQLException, ServletException, IOException {
        // TODO Auto-generated method stub
        List<StudentModel> studentData=studentDB.getStudent();//get student data
        request.setAttribute("STUDENT_DATA", studentData);//setting an attribute so that can be iterated
        RequestDispatcher dispatcher=request.getRequestDispatcher("/listStudent.jsp");//dispatching to jsp
        dispatcher.forward(request, response);
    }
}

Web.xml配置

<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">
         
  <display-name>Student Tracker App</display-name>

  <servlet>
    <servlet-name>ServletUtil</servlet-name>
    <servlet-class>com.crud.app.ServletUtil</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ServletUtil</servlet-name>
    <url-pattern>/ServletUtil</url-pattern>
  </servlet-mapping>

  <error-page>
    <error-code>404</error-code>
    <location>/error.jsp</location>
  </error-page>

  <resource-ref>
    <description>DB Connection</description>
    <res-ref-name>jdbc/web_student_tracker</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>

</web-app>

DB工具类代码

package com.crud.app;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

public class StudentDbUtil {
public DataSource datasource;

public StudentDbUtil(DataSource thedatasource) {
    datasource=thedatasource;
}
public List<StudentModel>getStudent() throws SQLException{
    
    List<StudentModel> newList=new ArrayList<>();
    Connection mycnt=null;
    Statement mystatement=null;
    ResultSet result=null;
    try {
        mycnt=datasource.getConnection();
        String sqlQuery="select * from student order by last_name";
        mystatement=mycnt.createStatement();
        result=mystatement.executeQuery(sqlQuery);
        
        while(result.next()) {
            //retrieve data
            int id=result.getInt("id");
            String firstName=result.getString("firstName");
            String lastName=result.getString("lastName");
            String email=result.getString("email");
            //create an object
            StudentModel studentDataObj=new StudentModel(id,firstName,lastName,email);
        System.out.println(studentDataObj + "obj");
        newList.add(studentDataObj);
        }
        return newList;

    }
    finally {
        close(mycnt,mystatement,result);
    }
    
}
private void close(Connection mycnt, Statement mystatement, ResultSet result) {
//to prevent memory leak
    try {
        if(mycnt!=null) {
            mycnt.close();
        }
        if(mystatement!=null) {
            mystatement.close();
        }
        if(result!=null) {
            mystatement.close();
        }
    }
    catch(Exception e) {
        e.printStackTrace();
    }
}
}

Model类代码

package com.crud.app;

public class StudentModel {
public int id;

public String firstName;
public String lastName;
public String email;
public StudentModel(String firstName, String lastName, String email) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.email = email;
}

public StudentModel(int id, String firstName, String lastName, String email) {
    this.id = id;
    this.firstName = firstName;
    this.lastName = lastName;
    this.email = email;
}
public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}
}

项目文件结构

项目文件结构

问题排查方向

  • 访问路径错误:确认访问URL包含项目上下文路径,比如项目部署名为StudentTrackerApp,正确路径应为http://localhost:8080/StudentTrackerApp/ServletUtil,而非直接访问/ServletUtil
  • Servlet初始化失败:代码中@Resource注解的datasource未被正确注入,导致studentDB初始化时传入null,后续调用getStudent()会抛出空指针,需检查Tomcat数据源配置是否正确(context.xml中是否配置了jdbc/web_student_tracker)
  • JSP文件缺失或路径错误:确认listStudent.jsp存在于Web根目录下,路径与RequestDispatcher指定的/listStudent.jsp一致
  • 类路径与配置不匹配:检查Web.xml中servlet-class指定的com.crud.app.ServletUtil是否与编译后的class文件路径一致(需存在于WEB-INF/classes/com/crud/app/下)
  • Tomcat版本兼容性问题:Tomcat 10.1采用Jakarta EE API,代码中混合了javax.servlet(Servlet继承)和jakarta.annotation(@Resource),会导致类加载冲突,Servlet无法正常初始化,需统一迁移到Jakarta API(将javax.servlet替换为jakarta.servlet)

内容的提问来源于stack exchange,提问作者Agnum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 13:18:10