如何将 JDBC 驱动程序导入 Dynamic Web Project?
How to import JDBC driver into Dynamic Web Project?
我有一个本地 MySQL 数据库。当我创建一个简单的 Java 项目时,其中一个 class 只包含 main,我成功地使用 JDBC 连接器 jar 从数据库中检索了一些数据,使用 Build path -> Add external jars 导入,而且效果很好。
然后我尝试使用类似的方法,但现在在 动态 Web 项目 中,我在其中使用 Servlet,但我得到 java.sql.SQLException: 找不到适合 jdbc:mysql 的驱动程序://localhost/ePay.
我花了好几个小时寻找类似问题的答案,这里是我到目前为止尝试放置 JDBC MySQL 连接器的地方:
- 直接进入Java资源文件夹
- 进入 Java 资源中的 lib 文件夹
- 进入WebContent/WEB-INF/lib/
我需要 web.xml 还是 context.xml?我阅读了使用它们的教程,尝试实现所解释的示例,但我仍然遇到同样的问题。
我正在开发 Linux Mint 17,将 Tomcat 7 用于 Eclipse IDE。
这是我的项目结构的照片:
以下是相关的 classes:
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);
}
}
用户class:
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
}
}
您的 mysql jdbc 驱动程序应该放在您的 tomcat 目录中:
catalina_base/webapps/app_name/WEB-INF/lib/
确保 start/restart 将新的 mysql jdbc 驱动程序 jar 文件放在那里后 start/restart 服务器。
有两种方法可以在eclipse 项目中使用和引用jar 文件。
一个在编译时并且用于编译目的。要使您的项目 编译 ,您需要在 class 路径中添加所需的库。在 Eclipse 中,右键单击您的项目,将鼠标悬停在 'Build Path' 上,然后悬停在 select 'Configure Build Path' 上。在对话框中转到 'Libraries' 选项卡,在那里您可以看到您有哪个 jars/libraries。如果需要添加更多内容,可以使用对话框右侧的按钮。你应该 select 'Add external jars' 和 select 来自文件系统的 MySql JDBC 驱动程序。
另一个在运行时间。这是将 Web 应用程序部署到应用程序服务器的时候。现在,每次您的应用程序需要从外部 jar 加载 class 时,它都会在应用程序服务器的 class 加载器中查找该 jar。 classloader 包含应用程序服务器中可用 jar 文件的路径,在已配置的资源中以及在 WEB-INF/lib/ 文件夹中的已部署应用程序中。您可以配置 classloader 首先检查哪个位置。
在您非常具体的情况下,您需要在任何 class 加载程序路径中添加 MySQL JDBC 驱动程序(因为我假设您的项目已经编译)所以您可以将 jar 添加到 Tomcat 的 /lib 目录或应用程序的 /WEB-INF/lib/ 目录。之后只需重新部署或重新启动 tomcat,您应该可以使用 MySQL JDBC 连接。
更新:
此外,当使用 DriverManager 接口创建 JDBC 连接时,请记住始终首先创建 JDBC 驱动程序的实例,以便将其加载到您的类加载器中。您可以在 the MySQL JDBC Driver documentation 中看到这一点。 Ej:
Class.forName("com.mysql.jdbc.Driver").newInstance();
在使用 DriverManager.getConnection(...)
之前调用此行,您现在应该能够创建和使用 JDBC 连接。
只需将您的驱动程序 jar 文件放入 WEB-INF/lib 文件夹。
我有一个本地 MySQL 数据库。当我创建一个简单的 Java 项目时,其中一个 class 只包含 main,我成功地使用 JDBC 连接器 jar 从数据库中检索了一些数据,使用 Build path -> Add external jars 导入,而且效果很好。
然后我尝试使用类似的方法,但现在在 动态 Web 项目 中,我在其中使用 Servlet,但我得到 java.sql.SQLException: 找不到适合 jdbc:mysql 的驱动程序://localhost/ePay.
我花了好几个小时寻找类似问题的答案,这里是我到目前为止尝试放置 JDBC MySQL 连接器的地方:
- 直接进入Java资源文件夹
- 进入 Java 资源中的 lib 文件夹
- 进入WebContent/WEB-INF/lib/
我需要 web.xml 还是 context.xml?我阅读了使用它们的教程,尝试实现所解释的示例,但我仍然遇到同样的问题。
我正在开发 Linux Mint 17,将 Tomcat 7 用于 Eclipse IDE。
这是我的项目结构的照片:
以下是相关的 classes:
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);
}
}
用户class:
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
}
}
您的 mysql jdbc 驱动程序应该放在您的 tomcat 目录中:
catalina_base/webapps/app_name/WEB-INF/lib/
确保 start/restart 将新的 mysql jdbc 驱动程序 jar 文件放在那里后 start/restart 服务器。
有两种方法可以在eclipse 项目中使用和引用jar 文件。
一个在编译时并且用于编译目的。要使您的项目 编译 ,您需要在 class 路径中添加所需的库。在 Eclipse 中,右键单击您的项目,将鼠标悬停在 'Build Path' 上,然后悬停在 select 'Configure Build Path' 上。在对话框中转到 'Libraries' 选项卡,在那里您可以看到您有哪个 jars/libraries。如果需要添加更多内容,可以使用对话框右侧的按钮。你应该 select 'Add external jars' 和 select 来自文件系统的 MySql JDBC 驱动程序。
另一个在运行时间。这是将 Web 应用程序部署到应用程序服务器的时候。现在,每次您的应用程序需要从外部 jar 加载 class 时,它都会在应用程序服务器的 class 加载器中查找该 jar。 classloader 包含应用程序服务器中可用 jar 文件的路径,在已配置的资源中以及在 WEB-INF/lib/ 文件夹中的已部署应用程序中。您可以配置 classloader 首先检查哪个位置。
在您非常具体的情况下,您需要在任何 class 加载程序路径中添加 MySQL JDBC 驱动程序(因为我假设您的项目已经编译)所以您可以将 jar 添加到 Tomcat 的 /lib 目录或应用程序的 /WEB-INF/lib/ 目录。之后只需重新部署或重新启动 tomcat,您应该可以使用 MySQL JDBC 连接。
更新:
此外,当使用 DriverManager 接口创建 JDBC 连接时,请记住始终首先创建 JDBC 驱动程序的实例,以便将其加载到您的类加载器中。您可以在 the MySQL JDBC Driver documentation 中看到这一点。 Ej:
Class.forName("com.mysql.jdbc.Driver").newInstance();
在使用 DriverManager.getConnection(...)
之前调用此行,您现在应该能够创建和使用 JDBC 连接。
只需将您的驱动程序 jar 文件放入 WEB-INF/lib 文件夹。