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

基于Tomcat的JSP登录系统Servlet类找不到问题求助

解决java.lang.ClassNotFoundException: org.railway.loginServlet错误

核心问题分析

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();
        }
    }
}

最后检查事项

  1. 确保Servlet编译后的class文件放在 WEB-INF/classes/org/railway/LoginServlet.class 路径下
  2. 确认 Utilityclass 也在 org.railway 包下,且编译后的class文件存在
  3. 重启Tomcat服务器,确保所有修改生效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:30:51