基于Tomcat的JSP登录系统Servlet类找不到问题求助
核心问题分析
ClassNotFoundException 表明Tomcat无法找到指定的Servlet类,主要由以下几个关键问题导致:
1. 缺失包声明与类名大小写不匹配
错误信息中指定的类是 org.railway.loginServlet,但你的Servlet代码:
- 未声明
org.railway包 - 类名是小写的
loginservlet,Java类名区分大小写,规范应为 PascalCase(首字母大写)
修正:
在Servlet代码顶部添加包声明,并修正类名:
package org.railway; // 新增包声明 import jakarta.servlet.RequestDispatcher; // ... 其他导入语句 @WebServlet("/loginServlet") // 新增Servlet映射注解 public class LoginServlet extends HttpServlet { // 修正类名为LoginServlet // ... 类内容 }
2. 未配置Servlet URL映射
你的Servlet没有添加 @WebServlet 注解绑定访问路径,导致Tomcat无法识别该Servlet与URL的关联。
修正:
在类定义上方添加 @WebServlet("/loginServlet"),确保与login.jsp中form的action属性值一致。
3. 错误的doPost方法签名
你自定义的 doPost 方法参数不符合Servlet规范,标准的doPost方法仅接收 HttpServletRequest 和 HttpServletResponse 两个参数。
错误方法:
protected boolean doPost(String u,String p, HttpServletRequest request, HttpServletResponse response)
修正为标准方法:
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); // 从请求中获取用户名 String password = request.getParameter("password"); // 获取密码 // ... 后续验证逻辑 }
4. 表单提交方法不匹配
login.jsp中的form默认使用GET方法提交,但你的Servlet仅处理POST请求,导致请求无法正确触发Servlet逻辑。
修正:
在form标签中添加 method="post":
<form action="loginServlet" method="post">
5. 请求转发目标错误
验证成功后你尝试转发到 "login sucessfullu",这是拼写错误且不是正确的JSP路径,应指向 welcome.jsp。
修正:
RequestDispatcher rd = request.getRequestDispatcher("/welcome.jsp"); rd.forward(request, response);
6. 数据库资源清理逻辑错误
finally块中重新初始化了 con、st、results 为null,导致实际的数据库连接和资源未被正确关闭。
修正:
finally { Utilityclass.closeConnection(results, st, con); // 直接使用try块中的变量 }
7. SQL查询优化与安全性
当前代码查询所有用户再循环验证,效率低下且存在SQL注入风险,应使用PreparedStatement按用户名精准查询:
修正:
String queryString = "SELECT password FROM loginpage WHERE username = ?"; PreparedStatement pst = con.prepareStatement(queryString); pst.setString(1, username); ResultSet results = pst.executeQuery(); if (results.next()) { String dbPassword = results.getString("password"); if (password.equals(dbPassword)) { RequestDispatcher rd = request.getRequestDispatcher("/welcome.jsp"); rd.forward(request, response); return; } }
完整修正后的LoginServlet代码
package org.railway; import jakarta.servlet.RequestDispatcher; 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 java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @WebServlet("/loginServlet") public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String username = request.getParameter("username"); String password = request.getParameter("password"); Connection con = null; PreparedStatement pst = null; ResultSet results = null; try { con = Utilityclass.getConnection(); String query = "SELECT password FROM loginpage WHERE username = ?"; pst = con.prepareStatement(query); pst.setString(1, username); results = pst.executeQuery(); if (results.next()) { String dbPassword = results.getString("password"); if (password.equals(dbPassword)) { RequestDispatcher rd = request.getRequestDispatcher("/welcome.jsp"); rd.forward(request, response); return; } } out.println("<font color='red' size='20'>登录失败!用户名或密码错误</font>"); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | SQLException e) { e.printStackTrace(); out.println("<font color='red' size='20'>服务器错误,请重试</font>"); } finally { Utilityclass.closeConnection(results, pst, con); out.close(); } } }
最后检查事项
- 确保Servlet编译后的class文件放在
WEB-INF/classes/org/railway/LoginServlet.class路径下 - 确认
Utilityclass也在org.railway包下,且编译后的class文件存在 - 重启Tomcat服务器,确保所有修改生效
内容的提问来源于stack exchange,提问作者senthamizh maran

