有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用Servlet和Prepared语句的java UPDATE类找不到异常(MySQL驱动程序)

因此,感谢下面的建议,我将使用语句的第一种方法改为使用准备好的语句,我还将verifyUser方法从ConnectDB中分离出来,将其放入一个新的用户类中(这是我在作业中要求的)

现在我不再使用任何NPE,而是另一个,MySQL JDBC驱动程序的类Not Found Exception

用户类的代码如下所示:

public class Users {

private String login;
private String password;


public Users(String login, String password) {
    this.login = login;
    this.password = password;
}

public String getUsername() {
    return login;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public void setUsername(String login) {
    this.login = login;
}

public boolean verifyUser(String login, String password) throws SQLException {

    ConnectDB cdb = new ConnectDB();

    Connection cn = DriverManager.getConnection(cdb.url, cdb.login, cdb.password);

    PreparedStatement ps = cn.prepareStatement("SELECT password FROM users WHERE login LIKE ? ");

ps.setString(1,username);

    ResultSet rs=ps.executeQuery();

    rs.next();

    if (rs.getString(2).equals(password)) {
        System.out.println("TEST");
        return true;
    }

    else
        return false;
}
}

这是我的ConnectDB类:

public class ConnectDB {

String url = "jdbc:mysql://localhost:3306/entreprise";
String login = "root";
String password = "kamoulox369";
Connection connection = null;
Statement st = null;
ResultSet rs = null;
PreparedStatement ps = null;

public  void getConnection() {
    try {
        Class.forName("com.example.mysql.jdbc.Driver");
        connection = DriverManager.getConnection(url, login, password);
    } catch (ClassNotFoundException | SQLException e) {
        e.printStackTrace();
    }
}

}

将其放在一起,在Servlet中使用:

private void versIndex(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, SQLException {

    String login = request.getParameter("user");
    String password = request.getParameter("password");
    Users user = new Users(login,password);
    ConnectDB cdb = new ConnectDB();
    cdb.getConnection();

    if (user.verifyUser(login, password)) {

        RequestDispatcher rd = sc.getRequestDispatcher("/index.jsp");
        rd.forward(request, response);

    }
}

当然,我得到的错误是:

java.lang.ClassNotFoundException: com.example.mysql.jdbc.Driver
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1309)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1138)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:291)
at com.example.ConnectDB.getConnection(ConnectDB.java:16)
at com.example.Servlet.versIndex(Servlet.java:111)
at com.example.Servlet.doPost(Servlet.java:41)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:491)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:764)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1388)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)


at java.base/java.lang.Thread.run(Thread.java:844)
java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/entreprise
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:702)
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228)
    at com.example.Users.verifyUser(Users.java:36)
    at com.example.Servlet.versIndex(Servlet.java:113)
    at com.example.Servlet.doPost(Servlet.java:41)

共 (1) 个答案

  1. # 1 楼答案

    Servlet或jdbc并不简单。他们都容易出错

    您存在并发问题、资源问题,无法关闭任何东西(包括连接中断),以及sql注入漏洞

    在这里使用静态成员是灾难性的。每个请求在不同的线程上执行,它们都将覆盖其他线程正在使用的对象。应使用局部变量处理每个请求

    数据库连接永远不会关闭,数据库将耗尽连接并在某个点停止工作。处理完所有jdbc对象后关闭它们

    将用户输入的输入连接到您运行的sql中允许用户在没有有效密码的情况下进入或运行任意sql。使用PreparedStatement