首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用/WEB-INF/lib中的JBDC4.0驱动程序,但是仍然需要使用Class#forName()来加载它

问使用/WEB-INF/lib中的JBDC4.0驱动程序,但是仍然需要使用Class#forName()来加载它
EN

Stack Overflow用户
提问于 2013-07-01 03:03:07
回答 4查看 572关注 0票数 2

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

代码语言:javascript
复制
<% 
        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,因为我从JDBC4.0中读到它不是必需的,但是如果我删除该语句,它就不起作用了。在我的库中,我添加了java JDBC Driver - MySQL -connector-mysql-5.1.23-bin.jar

EN

回答 4

Stack Overflow用户

发布于 2013-08-23 10:53:44

我将忽略问题中暴露出来的用JSP编写Java代码的糟糕编程实践-当您想要使用原始Java代码而不是HTML拦截HTTP请求/响应时,您真的应该开始习惯于创建沙箱servlet。

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

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2013-07-01 03:08:37

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

此外,正如有人回答并出于某种原因删除了那篇文章,只有与JDBC4.0兼容的驱动程序不需要Class.forName,但较旧的驱动程序需要。

票数 0
EN

Stack Overflow用户

发布于 2013-07-01 03:30:32

JDBC driver mysql-connector-java-5.1.23-bin.jar是符合JDBC 3.0和JDBC 4.0规范的Type4驱动程序。

但是,要利用JDBC4.0规范的优势,您需要java 6或更高版本。

如果您使用的是较旧的Driver,那么它将考虑JDBC 3.0规范,不会自动加载java。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17393849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档