技术支持:JAVA、JSP
编程软件:IntelliJ IDEA 2021.1.3 x64
前文几个功能的实现的博客
基于JSP、java、Tomcat、mysql三层交互的项目实战--校园交易网(1)-项目搭建(前期准备工作)-CSDN博客
基于JSP、java、Tomcat、mysql三层交互的项目实战--校园交易网(2)登录功能实现_tomcat jsp mysql-CSDN博客
基于JSP、java、Tomcat三者的项目实战--校园交易网(2)注册功能实现-CSDN博客
基于JSP、java、Tomcat三者的项目实战--校园交易网(3)主页-显示清单(list)-CSDN博客
基于JSP、java、Tomcat三者的项目实战--校园交易网(3)主页--数据库也显示清单遗漏问题-CSDN博客
基于JSP、java、Tomcat三者的项目实战--校园交易网(3)主页--添加商品功能-CSDN博客
基于JSP、java、Tomcat三者的项目实战--校园交易网(3)主页--实现修改商品的名字与价格功能(万字爆更)增查改删,三端交互样样齐全-CSDN博客
基于JSP、java、Tomcat三者的项目实战--校园交易网(3)主页->处理从客户端提交过来的总金额数据,并将其存储到数据库中-CSDN博客
接下来,我们就来讲解这最后一个功能实现,历史清单
网页端
Checkout.jsp
<%@ page import="entiy.Total" %>
<%@ page import="java.util.*" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@page contentType="text/html;charset=utf-8" pageEncoding="utf-8" %>
<html>
<head>
<title>Title</title>
<style>
.table {
width: 100%;
border-collapse: collapse;
}
.table_header {
background-color: lightgray;
}
.table td, .table th {
border: 1px solid black;
padding: 8px;
}
.button {
padding: 10px 20px;
background-color: #4CAF50;
color: white;
border: none;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 16px;
cursor: pointer;
}
</style>
</head>
<body>
<h1>
查看您的历史清单
</h1>
<h2>
<p>
<%
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
%>
<%=sdf.format(date)%>
<br />
</p >
</h2>
<table class="table">
<tr class="table_header">
<td>
ID
</td>
<td>
消费金额
</td>
</tr>
<%
List<Total> totals = (List<Total>) request.getAttribute("total");
if (totals != null && !totals.isEmpty()) {
for (int i = 0; i < totals.size(); i++) {
Total e = totals.get(i);
%>
<tr>
<td><%= e.getId() %></td>
<td><%= e.getTotal() %></td>
</tr>
<%
}
} else {
%>
<tr>
<td colspan="2">没有找到消费金额记录。</td>
</tr>
<%
}
%>
</table>
<p>
<input type="button" class="button" value="返回主页面" onclick="location='list'"/>
</p >
</div>
</div>
<div id="footer">
<div id="footer_bg">
sdjyy@444.com
</div>
</div>
</div>
</body>
</html>
这个网页主要是用于展示用户的消费历史清单。
- 使用了一个HTML表格
<table>
来展示消费历史记录。- 表头使用
<tr class="table_header">
定义,显示了两列:ID 和 消费金额。 - 使用Java代码从请求中获取
total
属性(假设是由Servlet或其他JSP传递的消费记录列表),并遍历显示每条消费记录。
- 表头使用
-
条件判断和循环:
- 使用了Java中的条件判断和循环语句来动态生成HTML表格的行。
- 如果
total
列表不为空且有内容,则通过for
循环遍历每个Total
对象,显示其ID和消费金额。 - 如果
total
列表为空或没有内容,则显示一条表格行,告知用户没有找到消费金额记录。
-
返回按钮:
- 页面底部有一个返回按钮
<input type="button">
,点击后会跳转回主页面(假设是通过相对路径list
定义的)。
- 页面底部有一个返回按钮
-
页脚:
- 最后部分有一个简单的页脚
<div id="footer">
,显示了一个联系邮箱。
- 最后部分有一个简单的页脚
服务端
TotalServlet
package Servlet;
import dao.StudentDAO;
import entiy.Product;
import entiy.Total;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class TotalServlet extends HttpServlet {
public void service(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String total = request.getParameter("total");
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
try {
StudentDAO dao = new StudentDAO();
Total e1 = new Total();
e1.setTotal(Double.parseDouble(total));
System.out.println(e1.getTotal());
dao.totalprice(e1);
response.sendRedirect("list");
} catch (Exception e) {
e.printStackTrace();
out.println("系统繁忙,请稍后再试!");
}
out.close();
}
}
主要功能是接收来自前端的请求,获取消费总额信息,然后将其存储到数据库中,并最终重定向到另一个页面以显示存储的消费总额列表。
-
服务方法 (
service
方法):service
方法是Servlet的核心方法,在接收到HTTP请求时被调用。- 首先设置请求字符编码为UTF-8,以确保能正确处理中文字符。
- 使用
request.getParameter("total")
获取名为 "total" 的请求参数,该参数通常是前端页面提交的消费总额数据。 - 设置响应的内容类型为
text/html;charset=utf-8
,并获取响应输出流PrintWriter out
,以便向客户端输出响应。
-
业务逻辑处理:
- 在
try
块中,创建StudentDAO
对象dao
,用于访问数据库。 - 创建一个新的
Total
对象e1
,用于封装消费总额信息。 - 将从请求参数获取的消费总额数据
total
转换为double
类型,并设置到e1
对象中。 - 调用
dao.totalprice(e1)
方法,将e1
对象传递给StudentDAO
对象,实现将消费总额存储到数据库中的操作。
- 在
-
异常处理:
- 如果在数据库操作过程中发生异常,捕获并打印异常堆栈信息,并向客户端输出简单的错误信息 "系统繁忙,请稍后再试!"。
-
响应处理:
- 最后调用
response.sendRedirect("list")
方法,重定向到名为 "list" 的页面(假设这是一个展示消费总额列表的页面)。 - 关闭输出流
out
,释放资源。
- 最后调用
这段代码通过Servlet接收前端的HTTP请求,从请求中获取消费总额数据,将其封装成对象并存储到数据库中,处理可能出现的异常情况,并将用户重定向到展示消费总额列表的页面。它展示了在Web应用中如何使用Servlet处理用户请求、访问数据库,并进行简单的异常处理和页面重定向操作。
dao层
totalprice
public void totalprice(Total e) throws Exception {
Connection conn = null;
PreparedStatement prep = null;
try {
conn = DBUtil.getConnection();
prep = conn.prepareStatement(
"INSERT INTO Total (total) VALUES (?)");
prep.setDouble(1, e.getTotal());
prep.executeUpdate();
} catch (Exception e1) {
e1.printStackTrace();
throw e1;
} finally {
// Close PreparedStatement and Connection
if (prep != null) {
try {
prep.close();
} catch (SQLException e2) {
e2.printStackTrace();
}
}
DBUtil.close(conn);
}
}
这是 StudentDAO
类中的 totalprice
方法,用于将消费总额数据插入到数据库中的 Total
表中
-
数据库连接和准备语句设置:
Connection conn
和PreparedStatement prep
被声明为null
,用于建立数据库连接和执行预编译的SQL语句。- 在
try
块中,通过DBUtil.getConnection()
获取数据库连接conn
。 - 使用
conn.prepareStatement()
方法准备 SQL 语句"INSERT INTO Total (total) VALUES (?)"
,其中?
是一个占位符,用于接受传入的消费总额数据。
-
设置参数和执行更新:
- 调用
prep.setDouble(1, e.getTotal())
将Total
对象e
中的消费总额值设置到 SQL 语句的第一个参数位置。 - 使用
prep.executeUpdate()
执行更新操作,将消费总额数据插入到数据库的Total
表中。
- 调用
-
异常处理:
- 在
try
块中捕获可能抛出的异常,如果发生异常,则会在控制台打印异常堆栈信息 (e1.printStackTrace()
)。 catch
块中再次抛出捕获到的异常e1
,以便让调用者进一步处理或通知错误。
- 在
-
资源释放:
finally
块用于确保资源的释放,即使在发生异常时也能执行到。- 在
finally
块中,关闭PreparedStatement
对象prep
,释放数据库连接conn
。
-
数据库连接和关闭:
- 在
finally
块中,检查并关闭prep
对象,避免资源泄漏。 - 调用
DBUtil.close(conn)
方法关闭数据库连接conn
,确保释放数据库连接资源。
- 在
这段代码负责将传入的消费总额数据存储到数据库的 Total
表中。它利用了预编译的 PreparedStatement
来执行 SQL 插入操作,通过 DBUtil
类提供的方法获取和关闭数据库连接,确保了资源的有效管理和异常情况的处理。
Total类
package entiy;
public class Total {
private double total;
private int id;
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
public Total(/*, 其他属性 */) {
this.total = total;
this.id = id;
// 初始化其他属性
}
public void setTotal(double total) {
this.total = total;
}
public double getTotal() {
return total;
}
@Override
public String toString() {
return "Total{" +
"total=" + total +
", id=" + id +
'}';
}
}
web.xml
<servlet>
<servlet-name>total</servlet-name>
<servlet-class>Servlet.TotalServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>total</servlet-name>
<url-pattern>/total</url-pattern>
</servlet-mapping>
LSQDServlet
package Servlet;
import dao.StudentDAO;
import entiy.Total;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
public class LSQDServlet extends HttpServlet {
public void service(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
try {
StudentDAO dao = new StudentDAO();
List<Total> totals = dao.findtotals();
request.setAttribute("total",totals);
RequestDispatcher rd = request.getRequestDispatcher("Checkout.jsp");
rd.forward(request,response);
} catch (Exception e) {
e.printStackTrace();
out.println("系统繁忙,请稍后再试!");
}
}
}
主要是用于处理HTTP请求并将消费总额数据传递到JSP页面进行显示。
-
service 方法:
- 设置响应的内容类型为
text/html;charset=utf-8
。 - 获取
PrintWriter
对象,用于输出响应内容。 - 在
try-catch
块中处理请求:- 创建一个
StudentDAO
对象dao
,用于访问数据库。 - 调用
dao.findtotals()
方法获取消费总额的列表数据,并将结果存储在List<Total> totals
中。 - 使用
request.setAttribute("total", totals)
将获取到的消费总额列表设置为请求属性,以便传递给JSP页面。 - 获取
RequestDispatcher
对象rd
,并使用rd.forward(request, response)
将请求转发到名为Checkout.jsp
的JSP页面,实现了数据和控制的分离。
- 创建一个
- 设置响应的内容类型为
-
异常处理:
- 如果在数据库访问或转发过程中发生异常,会打印异常堆栈信息,并向输出流
out
写入一条系统繁忙的错误信息。
- 如果在数据库访问或转发过程中发生异常,会打印异常堆栈信息,并向输出流
-
JSP 页面的处理:
- JSP页面(假设为
Checkout.jsp
)会根据request.getAttribute("total")
获取到的消费总额列表数据,动态生成HTML内容展示给用户。
- JSP页面(假设为
这段代码的主要逻辑是通过Servlet从数据库中获取消费总额数据,并将其传递到JSP页面进行展示,实现了MVC(Model-View-Controller)模式中的控制器(Controller)部分。
dao层
findTotal
public List<Total> findtotals() throws Exception {
List<Total> totals = new ArrayList<Total>();
Connection conn = null;
PreparedStatement prep = null;
ResultSet rst = null;
try {
conn = DBUtil.getConnection();
prep = conn.prepareStatement("select * from Total");
rst = prep.executeQuery();
while (rst.next()){
int id = rst.getInt("id");
double total = rst.getDouble("total");
Total e1 = new Total();
System.out.println(e1);
e1.setId(id);
e1.setTotal(total);
totals.add(e1);
}
} catch (Exception e) {
e.printStackTrace();
throw e;
}finally {
DBUtil.close(conn);
}
return totals;
}
这段代码是 StudentDAO
类中的 findtotals()
方法实现,用于从数据库中查询消费总额数据并返回一个 List<Total>
对象。
-
方法签名:
- 返回类型为
List<Total>
,表示消费总额的集合。 - 方法名为
findtotals()
,没有参数。 - 方法可能会抛出
Exception
异常,表示可能会处理各种数据库操作中可能发生的异常情况。
- 返回类型为
-
方法实现:
- 创建一个空的
ArrayList
对象totals
,用于存储从数据库查询到的消费总额数据。 - 声明数据库连接对象
conn
、预处理语句对象prep
和结果集对象rst
,并初始化为null
。
- 创建一个空的
-
数据库操作:
- 在
try
块中:- 调用
DBUtil.getConnection()
获取数据库连接对象conn
。 - 使用连接对象
conn
创建预处理语句prep
,并执行 SQL 查询语句"select * from Total"
,将结果存储在结果集rst
中。 - 使用
while
循环遍历结果集rst
,每次迭代:- 从结果集中获取
id
和total
字段的值。 - 创建一个新的
Total
对象e1
。 - 设置
e1
的id
和total
属性。 - 将
e1
添加到totals
集合中。
- 从结果集中获取
- 调用
- 在
-
异常处理:
- 如果在数据库连接、预处理语句创建、查询执行过程中发生异常,将会打印异常堆栈信息,并将异常继续抛出。
-
资源释放:
- 在
finally
块中调用DBUtil.close(conn)
方法关闭数据库连接,确保资源被正确释放。
- 在
-
返回结果:
- 返回存储了从数据库中查询到的消费总额数据的
totals
集合。
- 返回存储了从数据库中查询到的消费总额数据的
这段代码的主要功能是执行一个简单的数据库查询操作,将查询到的消费总额数据封装成 Total
对象,并将这些对象存储在一个列表中返回。
Total类
package entiy;
public class Total {
private double total;
private int id;
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
public Total(/*, 其他属性 */) {
this.total = total;
this.id = id;
// 初始化其他属性
}
public void setTotal(double total) {
this.total = total;
}
public double getTotal() {
return total;
}
@Override
public String toString() {
return "Total{" +
"total=" + total +
", id=" + id +
'}';
}
}
web.xml
<servlet>
<servlet-name>LSQD</servlet-name>
<servlet-class>Servlet.LSQDServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LSQD</servlet-name>
<url-pattern>/LSQD</url-pattern>
</servlet-mapping>