Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在/WEB-INF/lib中使用JBDC 4.0驱动程序,但仍然需要类#forName()来加载它_Java_Mysql_Database_Jsp_Jdbc - Fatal编程技术网

Java 在/WEB-INF/lib中使用JBDC 4.0驱动程序,但仍然需要类#forName()来加载它

Java 在/WEB-INF/lib中使用JBDC 4.0驱动程序,但仍然需要类#forName()来加载它,java,mysql,database,jsp,jdbc,Java,Mysql,Database,Jsp,Jdbc,我试图通过jsp访问我的数据库,我有以下代码: <% String username = request.getParameter("username"); String password = request.getParameter("password"); String value = "vuoto"; Class.forName("com.mysql.jdbc.Driver"); Connectio


我试图通过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中读到它是没有必要的,但如果我删除了该语句,它就不起作用了。在我的库中,我添加了MySQL-JDBC驱动程序-MySQL-connector-java-5.1.23-bin.jar

即使jar是类路径的一部分,您编写的代码都没有引用驱动程序类。我相信驱动程序类在其一个静态块中向JDBC注册自己,因此必须由类加载器加载,以便该静态块执行,JDBCAPI使用该驱动程序类。forName加载该类,因此需要它


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

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

但是要利用JDBC4.0规范,您需要
Java6
或更高版本

如果你有较老的java,它会考虑<代码> JDBC 3 规范,不会自动加载<代码>驱动程序< /> > .<


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

在我的环境中,此代码在没有
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,则会有所帮助。

我将忽略问题中暴露的用JSP编写Java代码的糟糕编程实践——只要您想使用原始Java代码而不是HTML截获HTTP请求/响应,您就应该真正开始习惯于创建沙盒servlet


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

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

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


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

我想知道是否有人告诉您,从JSP打开连接和查询数据库是个坏主意……我知道,我只是在做一些尝试我有java7,那我就不明白了