带有 JDBC 的 Servlet
Servlet 是在支持Java的 Web 服务器或应用程序服务器上运行的 Java 程序。它们用于处理从网络服务器获得的请求,处理请求,产生响应,然后将响应发送回网络服务器。 Servlet 的属性如下:
- Servlet 在服务器端工作。
- Servlet 能够处理从网络服务器获得的复杂请求。
先决条件:
- 基本的 Servlet 知识。
- Java中的 JDBC 连接。
- 我们可以使用任何数据库来存储数据,在这个例子中,使用的是 PostgreSQL 数据库管理系统。
- SQL 语言——插入、删除、更新和选择语句。
- Eclipse IDE 和 Tomcat 服务器。
我们将在本文中构建什么?
在这个例子中,我们将创建一个简单的“学生数据库管理系统”,我们可以在其中插入、更新、删除和查看学生详细信息。
分步实施
第 1 步:在 PostgreSQL 中创建表
- 创建一个表studentdetails来存储学生的详细信息。
- 添加列, stuid-存储学生ID, stuname-存储学生姓名, email-存储学生的电子邮件ID和phonenum-存储学生的电话号码。并在表中插入一些数据。
第 2 步:在 Eclipse 中创建一个动态 Web 项目
- 在 Eclipse IDE 中,创建一个动态 Web 项目,如下面的项目结构。
- 要连接 PostgreSQL DB,请在“WEB-INF/lib”文件夹下的项目中添加“postgresql-42.2.18.jar”。
第 3 步:创建所需的 JSP 以从学生那里获取详细信息
主页.jsp
这是项目的欢迎页面。在此页面上,我们将在学生详细信息中显示不同类型的操作,例如插入、删除和选择数据。
HTML
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
Welcome Page
Welcome to Student database management system
To insert your details into the Database:
To delete your details from the Database:
To view your details from the Database:
HTML
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
Insert Details
Fill in the details
HTML
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
Delete Details
HTML
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
Success Page
HTML
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
Select Details
HTML
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
Student Details - Result
Details
HTML
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
Update Details
Fill in your details
Java
public class DbUtil {
public static String url = "jdbc:postgresql://localhost/postgres";
public static String user = "root";
public static String password = "root";
public static String driver = "org.postgresql.Driver";
}
Java
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
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("/InsertDetails")
public class InsertDetails extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Jdbc Connection
try {
Class.forName(DbUtil.driver);
} catch (ClassNotFoundException e) {
System.out.println("Class not found " + e);
}
try {
Connection conn = DriverManager.getConnection(DbUtil.url, DbUtil.user, DbUtil.password);
System.out.println("connection successful");
// Query/statement to insert the values
PreparedStatement st = conn.prepareStatement("insert into studentdetails values(?, ?, ?, ?)");
// set values into the query
st.setInt(1, Integer.valueOf(request.getParameter("id")));
st.setString(2, request.getParameter("name"));
st.setString(3, request.getParameter("email"));
st.setString(4, request.getParameter("phnum"));
// Execute the query
st.executeUpdate();
st.close();
conn.close();
// Redirect the response to success page
response.sendRedirect("Success.jsp?msg=Insert");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Java
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
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("/DeleteDetails")
public class DeleteDetails extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
Class.forName(DbUtil.driver);
} catch (ClassNotFoundException e) {
System.out.println("Class not found " + e);
}
try {
Connection conn = DriverManager.getConnection(DbUtil.url, DbUtil.user, DbUtil.password);
System.out.println("connection successful");
PreparedStatement st = conn.prepareStatement("delete from studentdetails where stuid=?");
st.setInt(1, Integer.valueOf(request.getParameter("id")));
st.executeUpdate();
st.close();
conn.close();
response.sendRedirect("Success.jsp?msg=Delete");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Java
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
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("/SelectDetails")
public class SelectDetails extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
Class.forName(DbUtil.driver);
} catch (ClassNotFoundException e) {
System.out.println("Class not found " + e);
}
try {
int id = 0;
String name = "", email = "", ph = "";
Connection conn = DriverManager.getConnection(DbUtil.url, DbUtil.user, DbUtil.password);
System.out.println("connection successful");
PreparedStatement st = conn.prepareStatement("select * from studentdetails where stuid=?");
st.setInt(1, Integer.valueOf(request.getParameter("id")));
ResultSet rs = st.executeQuery();
while (rs.next()) {
id = rs.getInt(1);
name = rs.getString(2);
email = rs.getString(3);
ph = rs.getString(4);
}
rs.close();
st.close();
conn.close();
response.sendRedirect("Result.jsp?id=" + id + "&name=" + name + "&email=" + email + "&phone=" + ph);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Java
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
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("/UpdateDetails")
public class UpdateDetails extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
Class.forName(DbUtil.driver);
} catch (ClassNotFoundException e) {
System.out.println("Class not found " + e);
}
try {
Connection conn = DriverManager.getConnection(DbUtil.url, DbUtil.user, DbUtil.password);
System.out.println("connection successful");
PreparedStatement st = conn
.prepareStatement("update studentdetails set stuname=?, email=?, phonenum=? where stuid=?");
st.setString(1, request.getParameter("name"));
st.setString(2, request.getParameter("email"));
st.setString(3, request.getParameter("phnum"));
st.setInt(4, Integer.valueOf(request.getParameter("id")));
st.executeUpdate();
st.close();
conn.close();
response.sendRedirect("Success.jsp?msg=Update");
} catch (Exception e) {
e.printStackTrace();
}
}
}
根据学生的选择,将显示相应的 JSP 页面。
插入.jsp
此页面从学生那里获取所需的值——学生 ID、学生姓名、电子邮件 ID 和电话号码,并将页面提交给 Insert servlet 以将值存储在 DB 中。
HTML
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
Insert Details
Fill in the details
根据指定的操作和方法,它将映射相应的 servlet 并转到该 servlet 中的 doPost 方法()。
删除.jsp
要从数据库中删除学生信息,我们需要学生的 ID。此页面从学生那里获取 id 并将值提交给 Delete servlet。
HTML
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
Delete Details
成功.jsp
在插入、更新和删除操作后显示成功消息。
HTML
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
Success Page
成功插入或删除值后,此页面将向 UI 显示成功消息。
选择.jsp
要从 DB 中填充学生信息,我们需要学生的 ID。此页面获取提供的 id 并将其提交给 Select servlet 以获取详细信息。
HTML
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
Select Details
结果.jsp
此页面用于在 UI 中填充学生信息。根据给定的 id 显示学生详细信息的结果集。
HTML
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
Student Details - Result
Details
更新.jsp
填充信息后,如果学生想要更新他们的详细信息,此页面会从学生那里获取更新的信息并将其提交给 Update servlet。
HTML
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
Update Details
Fill in your details
我们将 ID 值设为只读,这样它就不会被更改,并且信息将根据 ID 值进行更新。
第 4 步:创建 DBUtil。Java
要与 PostgreSQL 建立 JDBC 连接,我们需要指定 PostgreSQL 的驱动程序、URL、用户名和密码对象。为了在所有 servlet 中重用这些对象以与 DB 建立连接,我们可以在单独的类中提供这些值,如下所示。
Java
public class DbUtil {
public static String url = "jdbc:postgresql://localhost/postgres";
public static String user = "root";
public static String password = "root";
public static String driver = "org.postgresql.Driver";
}
除了使用Java类,我们也可以在属性文件中指定这些值。
第 5 步:创建相应的 servlet 类
Servlet 类和 JSP 页面可以通过 web.xml(部署描述符)或使用注释进行映射。在此示例中,我们使用 @WebServlet 注释将 jsp 页面映射到它们各自的 servlet。要使用 servlet,我们需要从 HttpServlet 扩展Java类。
插入详细信息。Java
当学生通过Insert.jsp输入数据并提交页面以将详细信息插入DB时,基于JSP页面中的URL“/InsertDetails”,InsertDetails。 Java servlet 类将被映射并执行。
Java
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
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("/InsertDetails")
public class InsertDetails extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Jdbc Connection
try {
Class.forName(DbUtil.driver);
} catch (ClassNotFoundException e) {
System.out.println("Class not found " + e);
}
try {
Connection conn = DriverManager.getConnection(DbUtil.url, DbUtil.user, DbUtil.password);
System.out.println("connection successful");
// Query/statement to insert the values
PreparedStatement st = conn.prepareStatement("insert into studentdetails values(?, ?, ?, ?)");
// set values into the query
st.setInt(1, Integer.valueOf(request.getParameter("id")));
st.setString(2, request.getParameter("name"));
st.setString(3, request.getParameter("email"));
st.setString(4, request.getParameter("phnum"));
// Execute the query
st.executeUpdate();
st.close();
conn.close();
// Redirect the response to success page
response.sendRedirect("Success.jsp?msg=Insert");
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 我们需要为 servlet 和 JDBC 连接导入所有必需的包。
- 要插入详细信息,我们需要使用 servlet 类的 doPost 方法。
- 首先,在 try/catch 块内建立 JDBC 连接以处理出现的异常。
- 使用 Class.forName(),加载 PostgreSQL 驱动程序。
- 然后使用 Connection 和 DriverManager 对象,获取到 PostgreSQL 服务器的连接。
- 使用插入查询准备语句对象,并将学生信息设置为相应的参数并执行查询。
- 执行查询后,关闭语句和连接对象以避免资源泄漏。
- 然后将页面重定向到 Success.jsp 页面,并在屏幕上显示一条成功消息。
删除详细信息。Java
与插入操作一样,删除 servlet 也将根据指定的 URL 进行映射。当学生输入ID值删除学生信息时,DeleteDetails。 Java servlet 类将被映射并执行。
Java
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
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("/DeleteDetails")
public class DeleteDetails extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
Class.forName(DbUtil.driver);
} catch (ClassNotFoundException e) {
System.out.println("Class not found " + e);
}
try {
Connection conn = DriverManager.getConnection(DbUtil.url, DbUtil.user, DbUtil.password);
System.out.println("connection successful");
PreparedStatement st = conn.prepareStatement("delete from studentdetails where stuid=?");
st.setInt(1, Integer.valueOf(request.getParameter("id")));
st.executeUpdate();
st.close();
conn.close();
response.sendRedirect("Success.jsp?msg=Delete");
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 正如在插入 servlet 中指定的那样,删除 servlet 的相同方式也将起作用。
- 首先,建立 JDBC 连接并准备删除以 ID 作为输入参数的语句。
- 删除操作完成后,在 UI 中显示成功消息。
选择详细信息。Java
根据提交的 ID 填充学生信息。
Java
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
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("/SelectDetails")
public class SelectDetails extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
Class.forName(DbUtil.driver);
} catch (ClassNotFoundException e) {
System.out.println("Class not found " + e);
}
try {
int id = 0;
String name = "", email = "", ph = "";
Connection conn = DriverManager.getConnection(DbUtil.url, DbUtil.user, DbUtil.password);
System.out.println("connection successful");
PreparedStatement st = conn.prepareStatement("select * from studentdetails where stuid=?");
st.setInt(1, Integer.valueOf(request.getParameter("id")));
ResultSet rs = st.executeQuery();
while (rs.next()) {
id = rs.getInt(1);
name = rs.getString(2);
email = rs.getString(3);
ph = rs.getString(4);
}
rs.close();
st.close();
conn.close();
response.sendRedirect("Result.jsp?id=" + id + "&name=" + name + "&email=" + email + "&phone=" + ph);
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 在这里,我们正在获取详细信息,因此我们需要使用 servlet 类的 doGet() 方法。
- 建立 JDBC 连接并准备一个以 ID 作为输入参数的 select 语句并获取所有详细信息。
- 为了显示此信息,请将这些值发送到 Result.jsp 页面。
更新详情。Java
如果学生想要更新任何信息,那么我们需要获取相应的 ID 并执行操作。
Java
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
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("/UpdateDetails")
public class UpdateDetails extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
Class.forName(DbUtil.driver);
} catch (ClassNotFoundException e) {
System.out.println("Class not found " + e);
}
try {
Connection conn = DriverManager.getConnection(DbUtil.url, DbUtil.user, DbUtil.password);
System.out.println("connection successful");
PreparedStatement st = conn
.prepareStatement("update studentdetails set stuname=?, email=?, phonenum=? where stuid=?");
st.setString(1, request.getParameter("name"));
st.setString(2, request.getParameter("email"));
st.setString(3, request.getParameter("phnum"));
st.setInt(4, Integer.valueOf(request.getParameter("id")));
st.executeUpdate();
st.close();
conn.close();
response.sendRedirect("Success.jsp?msg=Update");
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 我们正在更新学生信息,因此调用了 doPost() 方法。
- 建立 JDBC 连接并准备更新语句,将 ID 作为输入参数。
- 执行查询并在 UI 中显示成功消息。
第 6 步:运行应用程序
现在,使用 Run As -> Run on Server 运行应用程序。该应用程序将部署在 Tomcat 服务器上。在浏览器中运行 URL http://localhost:8081/ServletsPostgre/Home.jsp以获取应用程序的主页。
- 要插入详细信息,请单击插入数据。单击时,重定向到 Insert.jsp 页面并显示在 UI 下方。
- 输入所有详细信息,然后单击插入数据。
- 插入成功后,屏幕上会显示成功消息。
- 返回主页。
- 检查数据是否成功插入 PostgreSQL DB。
- 要从数据库中获取值,请单击主页上的选择数据。
- 输入您要获取详细信息的 ID,然后单击查看数据。
- 结果将显示在 Result.jsp 页面上。
- 如果需要更新数据,点击更新数据,或者如果不直接返回主页。
- 如果我们单击更新数据,则重定向到 Update.jsp 页面。
- 在这里,Id 将在页面加载时显示,并且是只读的。
- 更新数据并单击更新数据。更新成功后会显示信息。
- 检查 PostgreSQL 数据库中的数据是否更新。
- 最后,要从数据库中删除数据,请单击主页上的删除数据。
- 输入要删除的 ID,然后单击删除数据。
- 该信息将从数据库中删除,并显示成功消息,如下所示。
- 如果信息被删除,请检查数据库。
通过这种方式,我们可以使用带有 JDBC 的 Servlet 执行所有的插入、更新、删除和选择操作。