前言:接上一篇文章,本篇文章写了订单结算,查看订单,查看订单详情的功能,同时修改了一点上一篇文章的代码,完善了购物车项目,感兴趣的朋友们可以看一看,也希望大家可以为我提一点建议(●'◡'●)。
目录
购物车项目
运行效果:
我的登陆密码是加密的,在登陆代码里有写
在首页选择商品加入购物车后点击购物车按钮,跳转页面
商品数量可以加减,我这里商品数量有限购条件,有的商品限购五件,点击清空购物车在商品会被全部删除。点击订单结算购物车会被清空,但会生成一个订单项,点击查看订单可以看到。
这是生成的订单项 ,点击查看详情可以看到详细的购买记录
这是订单详情
1.业务逻辑层代码的编写
biz(接口)代码
IOrderBiz:
int maxPK();
int insert(Order order);
List<Order> list(int userId);
IOrderItemBiz:
int maxPk();
int insert(OrderItem item);
List<OrderItem> list(Integer id);
biz.impl代码
OrderBizImpl:
package com.zking.biz.impl;
import java.util.List;
import com.zking.biz.IOrderBiz;
import com.zking.dao.IOrderDao;
import com.zking.dao.impl.OrderDaoImpl;
import com.zking.pojo.Order;
public class OrderBizImpl implements IOrderBiz{
private IOrderDao orderDao = new OrderDaoImpl();
@Override
public int maxPK() {
return orderDao.maxPK();
}
@Override
public int insert(Order order) {
return orderDao.insert(order);
}
@Override
public List<Order> list(int userId) {
return orderDao.list(userId);
}
}
OrderItemBizImpl:
package com.zking.biz.impl;
import java.util.List;
import com.zking.biz.IOrderItemBiz;
import com.zking.dao.IOrderItemDao;
import com.zking.dao.impl.OrderItemDaoImpl;
import com.zking.pojo.OrderItem;
public class OrderItemBizImpl implements IOrderItemBiz{
private IOrderItemDao orderItemDao = new OrderItemDaoImpl();
@Override
public int maxPk() {
return orderItemDao.maxPk();
}
@Override
public int insert(OrderItem item) {
return orderItemDao.insert(item);
}
@Override
public List<OrderItem> list(Integer id) {
return orderItemDao.list(id);
}
}
2.数据库访问层代码的编写
dao(接口)代码
IOrderDao:
int maxPK();
int insert(Order order);
List<Order> list(int userId);
IOrderItemDao:
int maxPk();
int insert(OrderItem item);
List<OrderItem> list(Integer id);
dao.impl代码
OrderDaoImpl:
package com.zking.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.zking.dao.IOrderDao;
import com.zking.pojo.Order;
import com.zking.utli.DBHelper;
public class OrderDaoImpl implements IOrderDao{
private Connection con;
private PreparedStatement ps;
private ResultSet rs;
@Override
public int maxPK() {
try {
con = DBHelper.getCon();
ps=con.prepareStatement("select nvl(max(id),0)+1 from car_order ");
rs=ps.executeQuery();
if(rs.next()){
return rs.getInt(1);
}
}catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.close(con,ps,rs);
}
return 0;
}
@Override
public int insert(Order order) {
try {
con = DBHelper.getCon();
ps=con.prepareStatement("insert into car_order values(?,?,?) ");
ps.setInt(1, order.getId());
ps.setInt(2, order.getUserId());
ps.setInt(3, order.getTotal());
return ps.executeUpdate();
}catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.close(con,ps,rs);
}
return 0;
}
@Override
public List<Order> list(int userId) {
List<Order> list = new ArrayList<>();
try {
con = DBHelper.getCon();
ps = con.prepareStatement("select * from car_order where user_id=? ");
ps.setInt(1, userId);
rs = ps.executeQuery();
while(rs.next()) {
Order order = new Order();
order.setId(rs.getInt(1));
order.setUserId(rs.getInt(2));
order.setTotal(rs.getInt(3));
list.add(order);
}
}catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.close(con,ps,rs);
}
return list;
}
}
OrderItemDaoImpl:
package com.zking.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.zking.dao.IGoodsDao;
import com.zking.dao.IOrderItemDao;
import com.zking.pojo.OrderItem;
import com.zking.utli.DBHelper;
public class OrderItemDaoImpl implements IOrderItemDao{
private IGoodsDao goodsDao = new GoodsDaoImpl();
private Connection con;
private PreparedStatement ps;
private ResultSet rs;
@Override
public int maxPk() {
try {
con = DBHelper.getCon();
ps=con.prepareStatement("select nvl(max(id),0)+1 from car_order_item ");
rs=ps.executeQuery();
if(rs.next()){
return rs.getInt(1);
}
}catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.close(con,ps,rs);
}
return 0;
}
@Override
public int insert(OrderItem item) {
try {
con = DBHelper.getCon();
ps=con.prepareStatement("insert into car_order_item values(?,?,?,?,?) ");
ps.setInt(1, item.getId());
ps.setInt(2, item.getOrderId());
ps.setInt(3, item.getGoods().getId());
ps.setInt(4, item.getQuantity());
ps.setInt(5, item.getTotal());
return ps.executeUpdate();
}catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.close(con,ps,rs);
}
return 0;
}
@Override
public List<OrderItem> list(Integer orderId) {
List<OrderItem> list = new ArrayList<>();
try {
con = DBHelper.getCon();
ps = con.prepareStatement("select * from car_order_item where order_id=? ");
ps.setInt(1, orderId);
rs = ps.executeQuery();
while(rs.next()) {
OrderItem item = new OrderItem();
item.setId(rs.getInt(1));
item.setOrderId(rs.getInt(2));
item.setGoods(goodsDao.one(rs.getInt(3)));
item.setQuantity(rs.getInt(4));
item.setTotal(rs.getInt(5));
list.add(item);
}
}catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.close(con,ps,rs);
}
return list;
}
}
3.实体类(pojo)代码
Order:
package com.zking.pojo;
public class Order {
private Integer id;
private Integer userId;
private Integer total;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public Integer getTotal() {
return total;
}
public void setTotal(Integer total) {
this.total = total;
}
public Order(Integer id, Integer userId, Integer total) {
super();
this.id = id;
this.userId = userId;
this.total = total;
}
public Order() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Order [id=" + id + ", userId=" + userId + ", total=" + total + "]";
}
}
OrderItem:
package com.zking.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
public class OrderItem {
private Integer id;
private Integer orderId;
private Goods goods;
private Integer quantity;
private Integer total;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getOrderId() {
return orderId;
}
public void setOrderId(Integer orderId) {
this.orderId = orderId;
}
public Goods getGoods() {
return goods;
}
public void setGoods(Goods goods) {
this.goods = goods;
}
public Integer getQuantity() {
return quantity;
}
public void setQuantity(Integer quantity) {
this.quantity = quantity;
}
public Integer getTotal() {
return total;
}
public void setTotal(Integer total) {
this.total = total;
}
public OrderItem(Integer id, Integer orderId, Goods goods, Integer quantity, Integer total) {
super();
this.id = id;
this.orderId = orderId;
this.goods = goods;
this.quantity = quantity;
this.total = total;
}
public OrderItem() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "OrderItem [id=" + id + ", orderId=" + orderId + ", goods=" + goods + ", quantity=" + quantity
+ ", total=" + total + "]";
}
}
4.表示层代码的编写
CalcServlet:
package com.zking.servlet;
import java.io.IOException;
import java.util.List;
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 com.zking.biz.IOrderBiz;
import com.zking.biz.IOrderItemBiz;
import com.zking.biz.impl.OrderBizImpl;
import com.zking.biz.impl.OrderItemBizImpl;
import com.zking.pojo.Order;
import com.zking.pojo.OrderItem;
import com.zking.pojo.User;
/**
* 结算的servlet
* @author zjjt
*
*/
@WebServlet("/calc.do")
public class CalcServlet extends HttpServlet{
private IOrderBiz orderBiz = new OrderBizImpl();
private IOrderItemBiz orderItemBiz = new OrderItemBizImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//购物车在哪里?
List<OrderItem> car = (List<OrderItem>)req.getSession().getAttribute("car");
//获得用户
User user = (User)req.getSession().getAttribute("user");
//将数据放到订单
if(car.isEmpty()) {
//返回购物车
resp.sendRedirect("car.jsp");
return;
}
//计算总和
int sum=0;
for (OrderItem item : car) {
sum+=item.getTotal();
}
//优先结算订单
Order order = new Order();
order.setId(orderBiz.maxPK());
order.setUserId(user.getId());
order.setTotal(sum);
//将订单放到数据库
int i = orderBiz.insert(order);
if(i>0) {
//如果订单插入成功,则插入订单项
for (OrderItem item : car) {
//item没有id
item.setId(orderItemBiz.maxPk());
//没有订单编号
item.setOrderId(order.getId());
orderItemBiz.insert(item);
}
}
//结算完毕
car.clear();
//清空价格
req.getSession().setAttribute("total", 0);
//返回购物车
resp.sendRedirect("car.jsp");
}
}
ItemServlet:
package com.zking.servlet;
import java.io.IOException;
import java.util.List;
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 com.zking.biz.IOrderItemBiz;
import com.zking.biz.impl.OrderItemBizImpl;
import com.zking.pojo.OrderItem;
import com.zking.pojo.User;
@WebServlet("/item.do")
public class ItemServlet extends HttpServlet{
private IOrderItemBiz orderItemBiz = new OrderItemBizImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接收订单的id
Integer id = Integer.parseInt(req.getParameter("id"));
//根据订单id查询对应的订单项
List<OrderItem> list = orderItemBiz.list(id);
//放到请求作用域中
req.setAttribute("list", list);
//返回order.jsp
req.getRequestDispatcher("item.jsp").forward(req, resp);
}
}
OrderServlet:
package com.zking.servlet;
import java.io.IOException;
import java.util.List;
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 com.zking.biz.IOrderBiz;
import com.zking.biz.impl.OrderBizImpl;
import com.zking.pojo.Order;
import com.zking.pojo.User;
@WebServlet("/order.do")
public class OrderServlet extends HttpServlet{
private IOrderBiz orderBiz = new OrderBizImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获得用户
User user = (User)req.getSession().getAttribute("user");
List<Order> list = orderBiz.list(user.getId());
//放到请求作用域中
req.setAttribute("list", list);
//返回order.jsp
req.getRequestDispatcher("order.jsp").forward(req, resp);
}
}
5.filter的使用
这一篇文章我修改了filter的使用
package com.zking.filter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebFilter("/*")//所有的请求都会被拦截
public class LoginFilter implements Filter{
//如果登陆了 正常通行
//如果没有登陆 返回登陆页面
//集合中放你不需要拦截的路径
List<String> list = new ArrayList<>();
{
list.add("/login.jsp");
list.add("login.do");
list.add(".css");
list.add(".js");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//有一些页面需要放行【login.do】
//强转
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
//拿到路径
String path = req.getServletPath();
//判断访问路径是否在list集合中
boolean f = false;
for (String p : list) {
if(path.endsWith(p)) {//是否以p结尾
f = true;
break;
}
}
//如果存在list集合中,就放行
if(f) {
chain.doFilter(request, response);//放行
return;
}
// 判断是否通行【有没有登陆:session中是否有user属性】
Object user = req.getSession().getAttribute("user");
if(user == null) {
resp.sendRedirect("login.jsp");
return;
}else {
chain.doFilter(request, response);//放行
}
}
}
6.jsp界面代码
car.jsp(购物车页面):
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap.css">
<script src="bootstrap-3.3.7-dist/js/jquery-3.5.1.js"></script>
<script src="bootstrap-3.3.7-dist\js\bootstrap.js"></script>
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>我的购物车</title>
</head>
<body>
<div class="container">
<h1>
${user.account},您好, <small>这是首页</small>
</h1>
<h1>
<a href="index.jsp" class="btn btn-default">继续购买</a>
<a href="calc.do" class="btn btn-default">订单结算</a>
<a href="order.do" class="btn btn-default">查看订单</a>
<a href="clear.do" class="btn btn-default">清空🛒</a>
</h1>
<table class="table table-bordered table-striped">
<tbody>
<tr>
<th>商品编号</th>
<th>商品名称</th>
<th>商品数量</th>
<th>商品总价</th>
<th>商品操作</th>
</tr>
<c:forEach items="${car}" var="item">
<tr>
<td>${item.goods.id}</td>
<td>${item.goods.name}</td>
<td>${item.quantity}</td>
<td>${item.total}</td>
<td>
<a href="del.do?id=${item.goods.id}" class="btn btn-default">删除</a>
<a href="upd.do?id=${item.goods.id}&type=1" class="btn btn-default">+1</a>
<a href="upd.do?id=${item.goods.id}&type=-1" class="btn btn-default">-1</a>
</td>
</tr>
</c:forEach>
</tbody>
</table>
<h1>
总价: ${total}
</h1>
</div>
</body>
</html>
Item.jsp(查看订单详情页面):
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:if test="${list == null}">
<c:redirect url="item.do"/>
</c:if>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/css/bootstrap.css">
<script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/jquery-3.5.1.js"></script>
<script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/bootstrap.js"></script>
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>我的订单项</title>
</head>
<body>
<div class="container">
<h1>
${user.account},您好, <small>这是订单项界面</small>
</h1>
<h1>
<a href="index.jsp" class="btn btn-default">继续购买</a>
<a href="car.jsp" class="btn btn-default">返回购物车</a>
</h1>
<table class="table table-bordered table-striped">
<tbody>
<tr>
<th>订单项编号</th>
<th>订单项商品名称</th>
<th>订单项商品单价</th>
<th>订单项下单数量</th>
<th>订单项下单总价</th>
</tr>
<c:forEach items="${list}" var="item">
<tr>
<td>${item.id}</td>
<td>${item.goods.name}</td>
<td>${item.goods.price}</td>
<td>${item.quantity}</td>
<td>${item.total}</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</body>
</html>
order.jsp(订单页面):
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:if test="${list == null}">
<c:redirect url="order.do"/>
</c:if>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/css/bootstrap.css">
<script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/jquery-3.5.1.js"></script>
<script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/bootstrap.js"></script>
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>我的订单</title>
</head>
<body>
<div class="container">
<h1>
${user.account},您好, <small>这是订单界面</small>
</h1>
<h1>
<a href="index.jsp" class="btn btn-default">继续购买</a>
<a href="car.jsp" class="btn btn-default">返回购物车</a>
</h1>
<table class="table table-bordered table-striped">
<tbody>
<tr>
<th>订单编号</th>
<th>订单总价</th>
<th>订单操作</th>
</tr>
<c:forEach items="${list}" var="order">
<tr>
<td>${order.id}</td>
<td>${order.total}</td>
<td>
<a href="item.do?id=${order.id}" class="btn btn-default">查看详情</a>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</body>
</html>
这个购物车项目算是写完了,欢迎各位大佬为我提一点建议,这篇文章就到这里结束了