【问题标题】:Why is my code giving me the java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver error in my web application?为什么我的代码在我的 Web 应用程序中出现 java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver 错误?
【发布时间】:2020-05-15 03:53:52
【问题描述】:

我已经构建了一个动态 Web 项目,该项目在 .jsp 文件中询问客户的基本信息。然后这些信息由 servlet 处理并传递给 DAO,以便我可以将数据存储在 mssql 中。当在 DAO 上调用 addHost() 方法时,我收到了 java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver 错误。

我认为我的驱动程序有问题,所以我尝试在同一个项目中运行代码,但就像使用 main(String[] args) 的常规 Java 应用程序一样。它运行良好,所以我无法理解为什么这段代码不能通过 Web 应用程序运行。

有人可以向我解释为什么我只有在通过 Web 应用程序运行该方法时才会收到此错误?

public void addHost(Host userHost) throws ClassNotFoundException, SQLException {

        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        String url = "jdbc:sqlserver://localhost:1433;databaseName=Hosts;integratedSecurity=true;";
        Connection con = DriverManager.getConnection(url);

        try {
            String query = "insert into HostsInfo values(?,?,?,?,?);";
            PreparedStatement pstmt = con.prepareStatement(query);
            pstmt.setString(1, userHost.getName());
            pstmt.setString(2, userHost.getEmail());
            pstmt.setString(3, userHost.getPword());
            pstmt.setString(4, userHost.getCity());
            pstmt.setInt(5, userHost.getGuestCount());          
            pstmt.executeUpdate();
        } catch (Exception e) {
            System.out.println(e);
        } finally {
            con.close();
        }
}

【问题讨论】:

  • com.microsoft.sqlserver.jdbc.SQLServerDriver 是 somejar 的一部分。当部署的应用程序运行时,它必须在类路径中可用。请添加有关部署环境的更多详细信息。 (它是如何构建的,它是如何运行的)
  • 你的web/WEB-INF/lib中有sql驱动的jar文件吗?

标签: java sql-server mssql-jdbc


【解决方案1】:

当您在应用程序服务器之外使用 JDBC 时,DriverManager 类管理连接的建立。向 DriverManager 指定要尝试与之建立连接的 JDBC 驱动程序。最简单的方法是在实现 java.sql.Driver 接口的类上使用 Class.forName()。使用 MySQL 连接器,此类的名称是 。使用此方法,您可以使用外部配置文件来提供驱动程序类名称和驱动程序参数,以便在连接到数据库时使用。

你可以这样做:

public class LoadDriver {
    public static void main(String[] args) {
        try {
                Class.forName("com.mysql.jdbc.Driver").newInstance();
        } catch (Exception ex) {
            // handle the error
        }
    }
}

驱动注册到DriverManager后,可以通过调用DriverManager.getConnection()获取连接到特定数据库的Connection实例。

【讨论】:

    【解决方案2】:

    我的web/WEB-INF/lib 文件夹中没有驱动程序。将驱动程序 (mssql-jdbc-8.2.2.jre8) 放入 web/WEB-INF/lib 文件夹后,代码运行良好,没有运行时错误,并将数据顺利传输到数据库。

    显然,对于 Web 应用程序,仅在类路径中包含驱动程序是不够的。它还需要包含在web/WEB-INF/lib 文件夹中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      相关资源
      最近更新 更多