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
相关产品推荐
相关产品推荐

