如何将 JDBC 驱动程序导入动态 Web 项目?

Posted

技术标签:

【中文标题】如何将 JDBC 驱动程序导入动态 Web 项目?【英文标题】:How to import JDBC driver into Dynamic Web Project? 【发布时间】:2015-08-03 18:07:00 【问题描述】:

我有一个本地 mysql 数据库。当我创建一个简单的 Java 项目,其中一个类只包含 main 时,我成功地使用 JDBC 连接器 jar 从数据库中检索了一些数据,使用构建路径导入 -> 添加外部 jar,它运行良好。

然后我尝试使用类似的方法,但现在在 Dynamic Web Project 中,我正在使用 Servlet,但我得到 java.sql.SQLException: No suitable driver found对于 jdbc:mysql://localhost/ePay.

我一直在寻找类似问题的答案几个小时,到目前为止,这是我尝试放置 JDBC MySQL 连接器的地方:

    直接进入 Java Resources 文件夹 进入 Java 资源中的 lib 文件夹 进入 WebContent/WEB-INF/lib/

我需要 web.xml 还是 context.xml?我阅读了使用它们的教程,尝试实现解释的示例,但我仍然遇到同样的问题。

我正在开发 Linux Mint 17,在 Eclipse IDE 中使用 Tomcat 7。

这是我的项目结构的照片:

以下是相关类:

package dbObjects;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Entity 
    protected Connection getConnection() throws SQLException 
        String pass = "mypass";
        String userDB = "root";
        Connection conn = DriverManager.getConnection(
                "jdbc:mysql://localhost/ePay", userDB, pass);
        return conn;
    

    protected ResultSet getResultSet(String sql) throws SQLException 
        Connection conn = getConnection();
        Statement st = conn.createStatement();
        return st.executeQuery(sql);
    

用户类:

package dbObjects;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

public class User extends Entity 
    private long idUser;
    private String userName;
    private String pass;
    private String fullName;
    private String email;
    private Date dateOfBirth;
    private String address;

    public User(long idUser, String userName, String pass, String fullName,
            String email, Date dateOfBirth, String address) 
        super();
        this.idUser = idUser;
        this.userName = userName;
        this.pass = pass;
        this.fullName = fullName;
        this.email = email;
        this.dateOfBirth = dateOfBirth;
        this.address = address;
    

    public User(long idUser) throws SQLException 
        super();
        this.idUser = idUser;
        setUserById(idUser);
    

    private void setUserById(long idUser) throws SQLException 
        ResultSet resultSet = getResultSet("SELECT * FROM User WHERE idUser = " + idUser);
        while(resultSet.next()) 
            System.out.println(resultSet.getInt("idUser"));
            userName = resultSet.getString("username");
            pass = resultSet.getString("pass");
            fullName = resultSet.getString("fullname");
            email = resultSet.getString("email");
            dateOfBirth = resultSet.getDate("dateOfBirth");
            address = resultSet.getString("address");
        
    

    @Override
    public String toString() 
        return userName;
    


还有我正在尝试运行的 servlet:

package servlets;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dbObjects.User;

/**
 * Servlet implementation class HomeServlet
 */
@WebServlet(description = "Home page shown to user", urlPatterns =  "/HomeServlet" )
public class HomeServlet extends HttpServlet 
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public HomeServlet() 
        super();
        // TODO Auto-generated constructor stub
    

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        // TODO Auto-generated method stub
        User user = null;
        try 
            user = new User(1);
         catch (SQLException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        
        PrintWriter pw = response.getWriter();
        pw.println(user);
    

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        // TODO Auto-generated method stub
    


【问题讨论】:

为什么不尝试创建一个 Maven 项目? @FernandoGarcia 我没有网络开发经验。我需要简单的网络应用程序,我用谷歌搜索,在我看来,这似乎是创建网络应用程序的最简单方法。我需要它用于学校项目,其主要目标不是实现网络应用程序,我需要该应用程序只是为了显示结果:) 非常欢迎任何建议。 【参考方案1】:

在 Eclipse 项目中有两种使用和引用 jar 文件的方法。

一个是在编译时,用于编译目的。要使您的项目编译,您需要在类路径中添加所需的库。在 Eclipse 中,右键单击您的项目,将鼠标悬停在“构建路径”上,然后选择“配置构建路径”。在对话框中转到“库”选项卡,在那里您可以看到您拥有哪些罐子/库。如果您需要添加更多内容,可以使用对话框右侧的按钮。您应该在此处选择“添加外部 jars”并从文件系统中选择 MySql JDBC 驱动程序。

另一个在运行时。这是当您将 Web 应用程序部署到应用程序服务器时。现在,每当您的应用程序需要从外部 jar 加载一个类时,它都会在应用程序服务器的类加载器中查找该 jar。类加载器包含应用程序服务器、已配置资源和已部署应用程序中 WEB-INF/lib/ 文件夹中可用 jar 文件的路径。您可以配置类加载器首先检查的位置。

在您非常具体的情况下,您需要在任何类加载器路径中添加 MySQL JDBC 驱动程序(因为我假设您的项目已经编译),因此您可以将 jar 添加到 Tomcat 的 /lib 目录或应用程序的 /WEB- INF/lib/ 目录。之后只需重新部署或重新启动 tomcat,您应该就可以使用 MySQL JDBC 连接了。

更新:

此外,当使用 DriverManager 接口创建 JDBC 连接时,请记住始终首先创建 JDBC 驱动程序的实例,以便将其加载到类加载器中。您可以在the MySQL JDBC Driver documentation 中看到这一点。乙:

Class.forName("com.mysql.jdbc.Driver").newInstance();

在使用DriverManager.getConnection(...) 之前调用此行,您现在应该能够创建和使用您的 JDBC 连接了。

【讨论】:

我添加了我的项目结构的图片。我将 MySQL JDBC jar 复制粘贴到 WEB-INF/lib 目录中,该目录将其导入 Web App Libraries,但我仍然遇到同样的问题。知道我可能是什么问题吗? 能否在创建 JDBC 连接的地方也添加源代码? 已编辑,连接是在实体类中建立的。到目前为止,我没有使用任何 .xml。我遵循了一个没有使用 .xml 的教程,所以我试图在不使用任何配置文件的情况下检索一些数据。这可能吗? 检查我的回答中的更新。我认为您的问题出在创建连接的代码中。 非常感谢!我之前在一个简单的 Java 项目(不是 Web 项目)中成功检索了数据,而没有调用 Class.forName(...),所以我不知道错误出在代码中。你救了我的一天!谢谢:)【参考方案2】:

你的mysql jdbc驱动应该放在你的tomcat的目录下:

catalina_base/webapps/app_name/WEB-INF/lib/

确保在将新的 mysql jdbc 驱动程序 jar 文件放在那里后启动/重新启动服务器。

【讨论】:

【参考方案3】:

只需将驱动程序 jar 文件放入 WEB-INF/lib 文件夹即可。

【讨论】:

以上是关于如何将 JDBC 驱动程序导入动态 Web 项目?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Mysql JDBC 驱动程序导入到 android studio

如何在没有动态 Web 模块 3.0 facet hacks 的情况下将 jdk 9 maven spring boot 2 项目导入 eclipse ee 氧气?

如何将thinkcmf导入eclipse

如何在 Eclipse Web 项目中安装 JDBC 驱动程序而不面对 java.lang.ClassNotFoundexception

java_jdbc_oracle简单总结(2016-11-23)

如何将 .java 文件导入 JSP 页面?