0
点赞
收藏
分享

微信扫一扫

MVC购物车第二部分

肉肉七七 2022-04-29 阅读 76

今天我们来完成昨天未完成的订单结算和查看订单部分吧

老样子我们先看看效果图吧

一、订单结算

需要的数据

  1. 购物车数据
  2. 用户id

但是他们都在session里面,所以我们在跳转页面的时候是不需要带的

那么什么是订单结算嘞?

就是将购物车数据添加到订单表和订单项表之中

怎么制作订单结算呢?

从购物车跳转calc.do(这是路径,实际我们需要写一个实现这个功能的类——CalcServlet.java)

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@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="${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.do" 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 }1" class="btn btn-default">+1</a>
<a href="upd.do?id=${item.goods.id }-1" class="btn btn-default">-1</a>
</td>
</tr>
</c:forEach>
</tbody></table>
<h1>
total:${total }
</h1>
</div>

</body></html>

先创建一个订单实体类(Order)和订单项实体类(OrderItem)

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() {
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Order [id=" + id + ", userId=" + userId + ", total=" + total + "]";
}



}
package com.zking.pojo;

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() {
super();
// TODO Auto-generated constructor stub
}
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;
}


}

 我们需要一个订单的dao(IOrderDao)和订单项的dao(IOrderItemDao)

package com.zking.dao;

import java.util.List;

import com.zking.pojo.Order;

public interface IOrderDao {

int maxPK();

int insert(Order order);

List<Order> list(int userId);
}
package com.zking.dao;

import com.zking.pojo.OrderItem;

import java.util.List;

@SuppressWarnings("all")
public interface IOrderItemDao {

int maxPK();

int insert(OrderItem item);

List<OrderItem> list(Integer id);

}

订单dao接口实现(OederDaoImpl)

nvl(max(id),0)+1   id有可能为null所以可以设置为只要是null就为0,+1是为了实现递增

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.util.DBHelper;

public class OrderDaoImpl implements IOrderDao{

//定义资源
private Connection con;
private PreparedStatement ps;
private ResultSet rs;

/**
* 查当前最大的id
*/

@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;
}
}

订单项dao接口实现(OederItemDaoImpl)

package com.zking.dao.impl;

import com.zking.dao.IGoodsDao;
import com.zking.dao.IOrderItemDao;
import com.zking.pojo.Order;
import com.zking.pojo.OrderItem;
import com.zking.util.DBHelper;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

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;
}

}

订单biz接口(IOrderBiz)

package com.zking.biz;

import java.util.List;

import com.zking.pojo.Order;

public interface IOrderBiz {
int maxPK();

int insert(Order order);

List<Order> list(int userId);
}

订单项biz接口(IOrderItemBiz)

package com.zking.biz;

import com.zking.pojo.OrderItem;

import java.util.List;

@SuppressWarnings("all")
public interface IOrderItemBiz {

int maxPK();

int insert(OrderItem item);

List<OrderItem> list(Integer id);

}

订单biz接口实现(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) {
// TODO Auto-generated method stub
return orderDao.list(userId);
}



}

订单biz接口实现(OrderItemBizImpl)

package com.zking.biz.impl;

import com.zking.biz.IOrderItemBiz;
import com.zking.dao.IOrderItemDao;
import com.zking.dao.impl.OrderItemDaoImpl;
import com.zking.pojo.OrderItem;

import java.util.List;

@SuppressWarnings("all")
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);
}

}

结算的servlet(CalcServlet.java)

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");

}

}

二、订单显示

创建一个订单显示界面(order.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@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="${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>
<c:if test="${list==null }">
<c:redirect url="order.do"></c:redirect>
</c:if>
<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>

因为我是先写完才发出来的所以说我的一些包中的方法在上面就有可能已经发了,订单显示的接口和实现在上面的订单结算都有写哦

订单显示的servlet(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.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;
@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);
//返回购物车
req.getRequestDispatcher("order.jsp").forward(req, resp);

}
}

查看详情界面

创建一个详情界面(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>

查看详情的servlet(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.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;

@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);
// 返回购物车
req.getRequestDispatcher("item.jsp").forward(req, resp);

}
}

好啦,到这里就没有咯,这个购物车项目还有许多不足之处,希望对你们有用,还有欢迎点赞留言哦,下次见咯。

举报

相关推荐

0 条评论