如何将 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 氧气?
如何在 Eclipse Web 项目中安装 JDBC 驱动程序而不面对 java.lang.ClassNotFoundexception