Servlet – 数据库访问
Servlet 主要用于动态 Web 应用程序,它为客户端请求提供动态响应。在大多数情况下,动态 Web 应用程序访问数据库以提供客户端请求的数据。我们可以使用Java标准的数据库连接——Servlet 中的 JDBC 来执行数据库操作。要理解本教程,您应该对 JDBC 应用程序的工作原理有基本的了解。请阅读我们的 JDBC 教程以获取更多详细信息。
Servlet – 数据库连接
Servlet 可以通过从数据库中检索数据并将其作为响应发送回客户端来生成动态 HTML。我们还可以根据客户端 HTTP 请求中传递的数据更新数据库。我们将创建一个简单的 servlet 来根据客户端的请求从数据库中获取/检索数据。在本例中,我们将使用 Eclipse IDE 和 PostgreSQL 数据库。
Servlet 中 JDBC 连接的步骤
安装 JDBC 驱动程序:
我们需要在我们的程序中安装合适的 JDBC 驱动来连接数据库。由于我们使用的是 PostgreSQL 数据库,请安装 Maven 存储库中最新版本的“ postgresql.jar ”文件。安装后,将你的jar文件放在“ WebContent -> WEB-INF -> lib”文件夹下。
导入 JDBC 包:
要访问和处理数据库操作,我们需要在程序中导入所有必需的“ Java.sql ”包。
Java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
Java
try {
// Register PostgreSQL Driver
Class.forName("org.postgresql.Driver");
}
catch (ClassNotFoundException e) {
System.out.println("Unable to load Driver class");
// e.printStackTrace(); OR you
// can directly print the stack trace
System.exit(1);
}
Java
String URL = "jdbc:postgresql://localhost/postgres";
String USER = "username";
String PASSWORD = "password";
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Java
Statement stmt = conn.createStatement();
Java
stmt.executeQuery(sql);
Java
stmt.close();
conn.close();
Java
Home Page
Java
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/fetch")
public class FetchServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
final String URL = "jdbc:postgresql://localhost/postgres";
final String USER = "root";
final String PASSWORD = "root";
final String DRIVER = "org.postgresql.Driver";
Connection conn = null;
public void init() throws ServletException {
// Database connection through Driver Manager
try {
Class.forName(DRIVER);
conn = DriverManager.getConnection(URL, USER, PASSWORD);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
// Set the response content type and
// get the PrintWriter object.
response.setContentType("text/html");
PrintWriter out = response.getWriter();
// Set up HTML table formatting for the output
out.println("");
out.println("Mobile Phone Details
");
out.println("" + "S.No " + "Brand "
+ "Processor " + "Operating System "
+ "Screen Size(inches) " + "Battery Life(mAh) ");
// Create JDBC statement object, construct
// the SQL query and execute the query.
Statement stmt = conn.createStatement();
String sql = "select * from public.mobilePhones;";
ResultSet rs = stmt.executeQuery(sql);
// Loop through the result set to
// retrieve the individual data items.
while (rs.next()) {
int sno = rs.getInt("sno");
String brand = rs.getString("brand");
String processor = rs.getString("processor");
float screenSize = rs.getFloat("screensize");
String osystem = rs.getString("operatingsystem");
int batteryLife = rs.getInt("batterylife");
out.println("" + "" + sno + " " + "" + brand + " " + "" + processor + " "
+ "" + osystem + " " + "" + screenSize + " " + "" + batteryLife
+ " ");
}
out.println("
");
// Close Result set, Statement
// and PrintWriter objects.
rs.close();
stmt.close();
out.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void destroy() {
// Close connection object.
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
注册 JDBC 驱动程序:
导入所有包后,我们需要将我们安装的 JDBC 驱动程序注册到我们的程序中。注册驱动程序告诉JVM将驱动程序的类文件加载到内存中,以便我们可以实现JDBC操作。我们可以使用“ Class.forName() ”方法注册驱动程序:
类.forName():
Java
try {
// Register PostgreSQL Driver
Class.forName("org.postgresql.Driver");
}
catch (ClassNotFoundException e) {
System.out.println("Unable to load Driver class");
// e.printStackTrace(); OR you
// can directly print the stack trace
System.exit(1);
}
建立与数据库的连接:
现在,我们需要使用“ DriverManager.getConnection() ”方法建立与数据库的连接。
Java
String URL = "jdbc:postgresql://localhost/postgres";
String USER = "username";
String PASSWORD = "password";
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
如您所见,我们需要将我们正在使用的数据库的 URL、用户名和密码作为参数传递给连接。
- URL:这是您正在使用的数据库的地址。在 URL 中,您需要提及“ jdbc:database:hostname:port:databasename”。
- 用户名和密码:您需要指定为您的数据库设置的用户名/密码。
创建一个 JDBC 语句对象:
连接成功后,使用 Connection 对象准备 JDBC 语句对象。
Java
Statement stmt = conn.createStatement();
执行 SQL 查询:
根据客户端请求构造 SQL 查询,并使用语句对象执行查询。
Java
stmt.executeQuery(sql);
关闭数据库连接:
在处理完所需的操作后,最后关闭所有数据库连接对象。
Java
stmt.close();
conn.close();
例子
在本例中,我们将创建
- PostgreSQL 中的表——从中获取数据
- 一个 HTML 表单——用于客户端访问
- Servlet 类——处理客户端请求并生成响应。
PostgreSQL 表:
在 PostgreSQL 数据库中创建一个表并在其中插入一些记录,如下所示。
![PostgreSQL - 表](https://mangodoc.oss-cn-beijing.aliyuncs.com/geek8geeks/Servlet_%E2%80%93_Database_Access_0.jpg)
PostgreSQL – 表
主页.html:
Java
Home Page
- 在“ WebContent -> home.html”下创建“ home.html”文件。
- 这是欢迎文件,浏览器在其中访问此表单页面。
- 在这里,我们只是显示一个提交按钮来从数据库中获取数据。
- 在表单标签中,提到了操作“ fetch”和方法“get” ,用于在提交表单时将 URL 映射到特定的 servlet 类。
FetchServlet。Java:
Java
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/fetch")
public class FetchServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
final String URL = "jdbc:postgresql://localhost/postgres";
final String USER = "root";
final String PASSWORD = "root";
final String DRIVER = "org.postgresql.Driver";
Connection conn = null;
public void init() throws ServletException {
// Database connection through Driver Manager
try {
Class.forName(DRIVER);
conn = DriverManager.getConnection(URL, USER, PASSWORD);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
// Set the response content type and
// get the PrintWriter object.
response.setContentType("text/html");
PrintWriter out = response.getWriter();
// Set up HTML table formatting for the output
out.println("");
out.println("Mobile Phone Details
");
out.println("" + "S.No " + "Brand "
+ "Processor " + "Operating System "
+ "Screen Size(inches) " + "Battery Life(mAh) ");
// Create JDBC statement object, construct
// the SQL query and execute the query.
Statement stmt = conn.createStatement();
String sql = "select * from public.mobilePhones;";
ResultSet rs = stmt.executeQuery(sql);
// Loop through the result set to
// retrieve the individual data items.
while (rs.next()) {
int sno = rs.getInt("sno");
String brand = rs.getString("brand");
String processor = rs.getString("processor");
float screenSize = rs.getFloat("screensize");
String osystem = rs.getString("operatingsystem");
int batteryLife = rs.getInt("batterylife");
out.println("" + "" + sno + " " + "" + brand + " " + "" + processor + " "
+ "" + osystem + " " + "" + screenSize + " " + "" + batteryLife
+ " ");
}
out.println("
");
// Close Result set, Statement
// and PrintWriter objects.
rs.close();
stmt.close();
out.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void destroy() {
// Close connection object.
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
- 创建“ FetchServlet. “ src”文件夹下的Java ”。
在里面():
- 众所周知,Servlet 的“ init()”方法只被 servlet 容器调用一次,用于在实例化 servlet 后对其进行初始化。只有 servlet 初始化成功后,它才能接收客户端请求。如果init()方法失败,它会抛出“ ServletException ”。
- 因此,我们在初始化 servlet 类的同时使用这个init()方法来注册 JDBC 驱动程序并建立数据库连接。
- 在注册 JDBC 驱动时,如果加载类失败,会抛出“ ClassNotFoundException ”。
- 如果与数据库的连接失败,则会抛出“ SQLException ”。
- 因此,我们需要确保在我们的代码中使用 try/catch 块处理这些检查的异常。
获取():
- servlet初始化后,当客户端请求从数据库中取数据时,servlet容器调用相应的服务方法进行操作。
- 在这里,我们在代码中指定了带有注释“ @WebServlet(“/fetch”)”的 URL。除了使用注解,您还可以在web.xml – Web 部署描述符中指定 URL 映射。
- 当请求到来时,它会映射到 servlet 中指定的 URL,并执行该 servlet 中的“ doGet()”方法,正如我们在 HTML 中将方法指定为“ get”一样。
- 由于我们需要生成响应并在其中打印获取的数据,因此将响应内容类型设置为“ text/html”以指定将在响应对象中发送的数据类型。
- 要将数据打印到文本输出流,我们使用响应对象上的“ getWriter()”方法使用“ PrintWriter”类对象。
- 现在,我们需要以用户可以理解和格式化的方式在浏览器中显示数据。因此,在输出中使用 HTML 表格标记格式化信息。
- 当我们建立到数据库的连接时,现在创建语句对象。
- 构造选择查询以从数据库中获取数据并执行它。
- 将执行查询的结果存储在结果集中,以便我们可以将该数据检索到 servlet 中的各个数据项中。
- 循环遍历结果集并以格式化的方式将检索到的数据打印到响应中。
- 最后,关闭所有与数据库的连接以避免任何资源泄漏。
- 在执行这些数据库操作时,如果任何步骤失败,它会抛出“ SQLException ”,因此请确保使用 try/catch 块处理异常。
破坏():
- Servlet 容器将调用“ destroy()”方法从服务中销毁特定的 servlet。一旦处理完所有客户端请求或经过指定的超时时间后,此方法将最后仅调用一次。
- 在此方法中,我们可以指定所有清理活动,例如资源释放。
- 因此,一旦处理完所有客户端请求,我们就需要关闭与数据库的连接。
部署和测试 servlet
- 要部署和运行程序,请运行“ home.html ”文件,因为它是欢迎文件。
- 在 HTML 中右键单击,“运行方式 -> 在服务器上运行”。
- 服务器启动后,Servlet 容器会加载此 Web 应用程序并在浏览器中显示 HTML 页面。
- 网址: http://localhost:8081/ServletDBAccess/home.html
![主页](https://mangodoc.oss-cn-beijing.aliyuncs.com/geek8geeks/Servlet_%E2%80%93_Database_Access_1.jpg)
主页
- 单击“搜索”按钮以获取结果。
![输出](https://mangodoc.oss-cn-beijing.aliyuncs.com/geek8geeks/Servlet_%E2%80%93_Database_Access_2.jpg)
输出
- 这样,servlet 处理客户端请求并从数据库中获取数据,并使用该数据生成对客户端的响应。
- 当我们在 HTML 表中格式化输出数据时,信息以这种格式化方式显示。
这样,我们就可以通过Java Servlet 访问数据库,并根据客户端请求生成动态响应。在这个例子中,我们学习从数据库中获取数据。我们可以使用 JDBC 在Java Servlet 中执行所有 CRUD 操作——请访问此处了解教程。