2


我正在尝试通过 jsp 访问我的数据库,并且我有以下代码:

<% 
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String value = "vuoto";


        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/onlinebookstore", "root", "sesame");
        Statement statement = connection.createStatement();
        ResultSet result = statement.executeQuery("SELECT * FROM users WHERE email = '" + username + "' " + "AND" + " password = '" + password + "'");
        if(result.next()) {
           value = "eccomi";
        }
        connection.close();
%>

我不明白为什么我需要使用 Class.forName 因为我从 JDBC 4.0 中读到它是没有必要的,但是如果我删除该语句它就不起作用。在我的库中,我添加了 MySQL JDBC Driver -mysql-connector-java-5.1.23-bin.jar

4

4 回答 4

3

我将忽略问题中公开的在 JSP 中编写 Java 代码的不良编程实践——当你想使用原始 Java 代码而不是 HTML 拦截 HTTP 请求/响应时,你应该真正开始习惯创建沙箱 servlet。


至于具体问题,这确实是意料之中的行为。ServiceLoader对于初学者,JDBC 4.0 驱动程序是使用API自动加载的。让我们看看它的javadoc;这是相关性的摘录(javadoc的第5段;强调我的):

如果一个特定的具体提供者类在多个配置文件中被命名,或者在同一个配置文件中被命名不止一次,那么重复的将被忽略。命名特定提供者的配置文件不必与提供者本身位于相同的 jar 文件或其他分发单元中。必须可以从最初查询配置文件的同一个类加载器访问提供程序;请注意,这不一定是实际加载文件的类加载器。

负责查询 JAR/META-INF/services文件夹中配置文件的是 servletcontainer 本身,而不是 webapp。所以,本质上,JAR 必须放在 servletcontainer 自己的运行时类路径中,而不是 webapp 自己的运行时类路径中。webapp 的/WEB-INF/lib文件夹被 webapp 的运行时类路径覆盖,而不是 servletcontainer 的,因此基本上是错误的位置。

你没有告诉任何关于正在使用的 servletcontainer 的信息,但根据你在其他一些问题中发现的堆栈跟踪,我猜它是 Apache Tomcat。在这种情况下,必须将 JDBC 驱动程序 JAR 文件放在 Tomcat 自己的/lib文件夹中,以便正确利用该ServiceLoader机制自动加载的 JDBC 驱动程序。

于 2013-08-23T02:53:43.943 回答
0

尽管 jar 是类路径的一部分,但您编写的代码都没有引用 Driver 类。我相信 Driver 类在其静态块之一中向 JDBC 注册自身,因此它必须由类加载器加载,才能执行该静态块,并且 JDBC api 才能使用该驱动程序类。Class.forName 加载类,因此需要它。

此外,正如有人回答并出于某种原因删除了该帖子,只有与 JDBC 4.0 兼容的驱动程序不需要 Class.forName,但较旧的驱动程序需要。

于 2013-06-30T19:08:37.323 回答
0

在我的环境中,此代码无需Class.forName.

public class Test {
  public static void main(String[] args) {

    //Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "sesame");

    // do some query
  }
}

所以我认为你的问题可能是类加载器问题。如果您使用的是 Tomcat,这个答案会有所帮助。

于 2013-08-23T02:38:32.150 回答
0

JDBC 驱动程序mysql-connector-java-5.1.23-bin.jar是符合JDBC 3.0JDBC 4.0规范的第 4 类驱动程序。

但是为了利用 JDBC 4.0 规范,您将需要java 6或更高版本。

如果您有较旧的 java,它将考虑JDBC 3.0规范并且不会Driver自动加载。

您将在下载的 Zip 文件中提供的文档中找到此信息。

于 2013-06-30T19:30:31.763 回答