【问题标题】:Cannot connect to database in jspjsp无法连接数据库
【发布时间】:2013-06-29 02:46:27
【问题描述】:

我正在尝试学习 jsp 页面中的数据库连接。这是我的代码:

这是我的 servlet:

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    PrintWriter out = response.getWriter();

    out.println("servlet");

    String username=request.getParameter("username"), password=request.getParameter("password");
    out.println("Username: "+username+" Password: "+password);

    CheckUser(username,password);
}

protected void CheckUser(String username, String password)
{
    dbConnect.connect();

}

这是我的 dbConnect 课程:

import java.sql.DriverManager;

import com.mysql.jdbc.Connection;


public class dbConnect {

  static String dbUrl="jdbc:mysql://localhost:3306/Bank";
  String username="root";
  String password="";

  static Connection con=null;

  public static void connect()
  {
      try {
       Class.forName("com.mysql.jdbc.Driver").newInstance();
       con=(Connection) DriverManager.getConnection(dbUrl);
       System.out.println("Connected!");

      } 
      catch (Exception e) {

          System.out.println("not connected");

      }
  }

}

问题是,在 connect() 函数中,当涉及到行 Class.forName("com.mysql.jdbc.Driver").newInstance();它产生一个错误并进入 catch 块。这里有什么问题有人可以帮忙吗?谢谢。

编辑:我按照 Nambari 所说的做了,现在我在 con=(Connection) DriverManager.getConnection(dbUrl); 行中得到了错误,这是例外:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Access denied for user ''@'localhost' to database 'bank'
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:353)
at com.mysql.jdbc.Util.getInstance(Util.java:336)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1031)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2938)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:855)
at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:3337)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1217)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:1930)
at com.mysql.jdbc.Connection.<init>(Connection.java:716)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:353)
at com.mysql.jdbc.Connection.getInstance(Connection.java:295)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:207)
at dbConnect.connect(dbConnect.java:18)
at loginServlet.CheckUser(loginServlet.java:41)
at loginServlet.service(loginServlet.java:36)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:662)

未连接

【问题讨论】:

  • 抛出什么异常?在你的 catch 块中添加 e.printStackTrace()
  • exception 类型是什么?也许您忘记包含 mysql 库。做事更快时这是一个常见的错误:-D
  • 我不知道错误控制台中没有显示的异常类型,它只是打印未连接。我怎么能看到它?
  • 替换e.printStacktrace();,而不是你天真的System.out.println();。另外,我建议查看this Q/A 以了解处理数据库连接的最佳方法。顺便说一句,看起来你缺少数据库连接 jar(在本例中是连接到 MySQL 的 jar),这个 jar 和其他第三方库应该放在 WEB-INF/lib 目录中.
  • 我编辑了问题,你可以看看吗?

标签: java database jsp


【解决方案1】:

Class.forName("com.mysql.jdbc.Driver").newInstance();它产生一个 报错,进入catch块。

根据这些信息,我猜测您的 mysql.jar 不在运行时类路径中。

【讨论】:

  • 我去了属性>java构建路径>库并添加了jar文件。这不是我应该做的吗?
  • @bigO:为构建(编译时)而不是运行时添加 jars。对于运行时,将其添加到 lib 文件夹。
  • 我按照你说的做了谢谢,但现在我在下一行发现了一个异常,你能看看编辑的部分吗?
  • @bigO:查看 Luggi 的评论。
  • @bigO:很高兴它有帮助。祝你好运!
【解决方案2】:

替换 e.printStacktrace(); 而不是您天真的 System.out.println(); 以查看错误以及有关如何解决它们的消息。顺便说一句,看起来你缺少数据库连接 jar(在本例中是连接 MySQL 的 jar),这个 jar 和其他第三方库应该放在 WEB-INF/lib 目录中.

对于第二个错误,您忘记使用 userpassword 变量。改成

con=(Connection) DriverManager.getConnection(dbUrl, user, password);

请注意,如果您使用数据库连接池,您可以摆脱所有这些问题。参考Is it a good idea to put jdbc connection code in servlet class?了解处理数据库连接的最佳方式。

【讨论】:

    【解决方案3】:
    com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Access denied for user ''@'localhost' to database 'bank'
    

    表示您连接mysql的参数错误。请检查userpasswordhostdriver参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 2012-03-26
      • 1970-01-01
      • 2013-08-05
      • 2015-10-28
      • 2011-10-26
      相关资源
      最近更新 更多