我正在尝试通过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,因为我从JDBC4.0中读到它不是必需的,但是如果我删除该语句,它就不起作用了。在我的库中,我添加了java JDBC Driver - MySQL -connector-mysql-5.1.23-bin.jar
发布于 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驱动程序。
发布于 2013-07-01 03:08:37
尽管jar是类路径的一部分,但是您编写的代码中没有一个引用Driver类。我相信驱动程序类在它的一个静态块中向JDBC注册自己,因此必须由类加载器加载它才能执行该静态块,并让JDBC api使用该驱动程序类。Class.forName加载该类,因此需要它。
此外,正如有人回答并出于某种原因删除了那篇文章,只有与JDBC4.0兼容的驱动程序不需要Class.forName,但较旧的驱动程序需要。
发布于 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文件中提供的文档中找到此信息。
https://stackoverflow.com/questions/17393849
复制相似问题