用户在购物车中提交订单,将购物车中的数据以订单/订单项的形式保存下来,之后清空购物车。

整体技术路线:客户端点击提交订单至OrderServlet中saveOrder方法中,将购物车中的购物信息以订单形式保存,清空购物车,之后将订单放入request,转发到订单详情页面。

将购物车中信息抽取成两个数据库表,分别是:

(1)order表:表示此次交易的所有商品项,类似于超市小票;

为订单表中插入一行数据,描述本次交易,这行数据部分数据是通过程序赋予,部分数据来自于购物车的,部分数据来自于session中的用户,其中字段包含:

oid:UUIDUtils     orderTime:new Date();     total: 从购物车获取    state:1      address: null     name:null     telephone:null  uid:从session中的用户获取

(2)orderitem表:表示此次订单中的每个订单项,类似于小票中的各个商品项;

向订单项表中插入数据,描述当前订单的详细的购买信息,部分数据来自于购物车,部分数据需要通过程序赋予

itemid: UUIDUtils     quantity:来自于购物车中的购物项    total:来自于购物车中的购物项   pid:来自于购物车上的购物项下商品对象pid    oid:来自于当前订单id

注:商品提交时需要加入事务,一旦订单或订单项提交失败,则全部回滚

思路:点击cart.jsp页面中的【提交订单】,调用服务器端的OrderServlet中的saveOrder方法,之后调用OrderService OrderServiceImp OrderDao OrderDaoImp中的saveOrder方法,最终将数据存入数据库。

代码如下:
购物车界面:cart.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1"><title>购物车</title><link rel="stylesheet" href="${pageContext.request.contextPath}/css/bootstrap.min.css" type="text/css" /><script src="${pageContext.request.contextPath}/js/jquery-1.11.3.min.js" type="text/javascript"></script><script src="${pageContext.request.contextPath}/js/bootstrap.min.js" type="text/javascript"></script><!-- 引入自定义css文件 style.css --><link rel="stylesheet" href="${pageContext.request.contextPath}/css/style.css" type="text/css"/><style>body {margin-top: 20px;margin: 0 auto;}.carousel-inner .item img {width: 100%;height: 300px;}.container .row div {/* position:relative;float:left; */}font {color: #3164af;font-size: 18px;font-weight: normal;padding: 0 10px;}</style></head><body><%@ include file="/jsp/header.jsp" %><div class="container"><c:if test="${empty cart.cartItems }"><div class="row"><div class="col-md-12"><h1>开启剁手模式</h1></div></div></c:if><c:if test="${not empty cart.cartItems }"><div class="row"><div style="margin:0 auto; margin-top:10px;width:950px;"><strong style="font-size:16px;margin:5px 0;">订单详情</strong><table class="table table-bordered"><tbody><tr class="warning"><th>图片</th><th>商品</th><th>价格</th><th>数量</th><th>小计</th><th>操作</th></tr><c:forEach items="${cart.cartItems}" var="item">   <tr class="active"><td width="60" width="40%"><input type="hidden" name="id" value="22"><img src="${pageContext.request.contextPath}/${item.product.pimage}" width="70" height="60"></td><td width="30%"><a target="_blank">${item.product.pname}</a></td><td width="20%">¥${item.product.shop_price}</td><td width="10%"><input type="text" name="quantity" value="${item.num}" maxlength="4" size="10"></td><td width="15%"><span class="subtotal">¥${item.subTotal}</span></td><td><a href="javascript:;" id="${item.product.pid}" class="delete">删除</a></td></tr></c:forEach></tbody></table></div></div><div style="margin-right:130px;"><div style="text-align:right;"><em style="color:#ff6600;">登录后确认是否享有优惠&nbsp;&nbsp;</em> 赠送积分: <em style="color:#ff6600;">${cart.total}</em>&nbsp; 商品金额: <strong style="color:#ff6600;">¥${cart.total}元</strong></div><div style="text-align:right;margin-top:10px;margin-bottom:10px;"><a href="${pageContext.request.contextPath}/CartServlet?method=clearCart" id="clear" class="clear">清空购物车</a><a href="${pageContext.request.contextPath}/OrderServlet?method=saveOrder"><%--提交表单 --%><input type="submit" width="100" value="提交订单" name="submit" border="0" style="background: url('${pageContext.request.contextPath}/img/register.gif') no-repeat scroll 0 0 rgba(0, 0, 0, 0);height:35px;width:100px;color:white;"></a></div></div></c:if></div><%@ include file="/jsp/footer.jsp" %></body>
<script>
$(function(){//页面加载完毕之后获取到class的值为delete元素,为其绑定点击事件$(".delete").click(function(){if(confirm("确认删除?")){//获取到被删除商品pidvar pid=this.id;window.location.href="/store_v5/CartServlet?method=removeCartItem&id="+pid;}});
});
</script>
</html>

OrderServlet.java

ackage cn.itcast.store.web.servlet;import java.util.Date;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import cn.itcast.store.domain.Cart;
import cn.itcast.store.domain.CartItem;
import cn.itcast.store.domain.Order;
import cn.itcast.store.domain.OrderItem;
import cn.itcast.store.domain.PageModel;
import cn.itcast.store.domain.User;
import cn.itcast.store.service.OrderService;
import cn.itcast.store.service.serviceImp.OrderServiceImp;
import cn.itcast.store.utils.PaymentUtil;
import cn.itcast.store.utils.UUIDUtils;
import cn.itcast.store.web.base.BaseServlet;public class OrderServlet extends BaseServlet {// saveOrder  将购物车中的信息以订单的形式保存public String saveOrder(HttpServletRequest req, HttpServletResponse resp) throws Exception {//确认用户登录状态User user=(User)req.getSession().getAttribute("loginUser");if(null==user){req.setAttribute("msg", "请登录之后在下单");return "/jsp/info.jsp";}//获取购物车Cart cart=(Cart)req.getSession().getAttribute("cart");//创建订单对象,为订单对象赋值Order order=new Order();order.setOid(UUIDUtils.getCode());order.setOrdertime(new Date());order.setTotal(cart.getTotal());order.setState(1);order.setUser(user);//遍历购物项的同时,创建订单项,为订单项赋值for (CartItem item : cart.getCartItems()) {OrderItem orderItem=new OrderItem();orderItem.setItemid(UUIDUtils.getCode());orderItem.setQuantity(item.getNum());orderItem.setTotal(item.getSubTotal());orderItem.setProduct(item.getProduct());//设置当前的订单项属于哪个订单:程序的角度体检订单项和订单对应关系orderItem.setOrder(order);order.getList().add(orderItem);}//调用业务层功能:保存订单OrderService OrderService=new OrderServiceImp();//将订单数据,用户的数据,订单下所有的订单项都传递到了service层OrderService.saveOrder(order);//清空购物车cart.clearCart();//将订单放入requestreq.setAttribute("order", order);//转发/jsp/order_info.jspreturn "/jsp/order_info.jsp";}
}

OrderService.java

package cn.itcast.store.service;import java.util.List;import cn.itcast.store.domain.Order;
import cn.itcast.store.domain.PageModel;
import cn.itcast.store.domain.User;public interface OrderService {void saveOrder(Order order)throws Exception;
}

OrderServiceImp.java

package cn.itcast.store.service.serviceImp;import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;import cn.itcast.store.dao.OrderDao;
import cn.itcast.store.dao.daoImp.OrderDaoImp;
import cn.itcast.store.domain.Order;
import cn.itcast.store.domain.OrderItem;
import cn.itcast.store.domain.PageModel;
import cn.itcast.store.domain.User;
import cn.itcast.store.service.OrderService;
import cn.itcast.store.utils.JDBCUtils;public class OrderServiceImp implements OrderService {OrderDao orderDao=new OrderDaoImp();
@Overridepublic void saveOrder(Order order) throws SQLException {//保存订单和订单下所有的订单项(同时成功,失败)/*try {JDBCUtils.startTransaction();OrderDao orderDao=new OrderDaoImp();orderDao.saveOrder(order);for(OrderItem item:order.getList()){orderDao.saveOrderItem(item);}JDBCUtils.commitAndClose();} catch (Exception e) {JDBCUtils.rollbackAndClose();}*/Connection conn=null;try {//获取连接conn=JDBCUtils.getConnection();//开启事务conn.setAutoCommit(false);//保存订单orderDao.saveOrder(conn,order);//保存订单项for (OrderItem item : order.getList()) {orderDao.saveOrderItem(conn,item);   }//提交conn.commit();} catch (Exception e) {//回滚conn.rollback();}}
}

OrderDao.java

package cn.itcast.store.dao;import java.sql.Connection;
import java.util.List;import cn.itcast.store.domain.Order;
import cn.itcast.store.domain.OrderItem;
import cn.itcast.store.domain.User;public interface OrderDao {void saveOrder(Connection conn, Order order)throws Exception;void saveOrderItem(Connection conn, OrderItem item)throws Exception;
}

OrderDaoImp.java

package cn.itcast.store.dao.daoImp;import java.sql.Connection;
import java.util.List;
import java.util.Map;import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.DateConverter;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;import cn.itcast.store.dao.OrderDao;
import cn.itcast.store.domain.Order;
import cn.itcast.store.domain.OrderItem;
import cn.itcast.store.domain.Product;
import cn.itcast.store.domain.User;
import cn.itcast.store.utils.JDBCUtils;public class OrderDaoImp implements OrderDao {@Overridepublic void saveOrder(Connection conn, Order order) throws Exception {String sql="INSERT INTO orders VALUES(?,?,?,?,?,?,?,?)";QueryRunner qr=new QueryRunner();Object[] params={order.getOid(),order.getOrdertime(),order.getTotal(),order.getState(),order.getAddress(),order.getName(),order.getTelephone(),order.getUser().getUid()};qr.update(conn,sql,params);}@Overridepublic void saveOrderItem(Connection conn, OrderItem item) throws Exception {String sql="INSERT INTO orderitem VALUES(?,?,?,?,?)";QueryRunner qr=new QueryRunner();Object[] params={item.getItemid(),item.getQuantity(),item.getTotal(),item.getProduct().getPid(),item.getOrder().getOid()};qr.update(conn,sql,params);}}

Order.java

package cn.itcast.store.domain;import java.util.ArrayList;
import java.util.Date;
import java.util.List;public class Order {private String oid; //订单编号private Date ordertime; //下单时间private double total; //总计private int state; //状态private String address; //收货人地址private String name; //收货人姓名private String telephone; //收货人电话// private String uid;// 1_程序对象和对象发生关系,而不是对象和对象的属性发生关系// 2_设计Order目的:让order携带订单上的数据向service,dao传递,user对象是可以携带更多的数据private User user;// 程序中体现订单对象和订单项之间关系,我们再项目中的部分功能中有类似的需求:查询订单的同时还需要获取订单下所有的订单项private List<OrderItem> list = new ArrayList<OrderItem>();public String getOid() {return oid;}public void setOid(String oid) {this.oid = oid;}public Date getOrdertime() {return ordertime;}public void setOrdertime(Date ordertime) {this.ordertime = ordertime;}public double getTotal() {return total;}public void setTotal(double total) {this.total = total;}public int getState() {return state;}public void setState(int state) {this.state = state;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getTelephone() {return telephone;}public void setTelephone(String telephone) {this.telephone = telephone;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}public List<OrderItem> getList() {return list;}public void setList(List<OrderItem> list) {this.list = list;}}

OrderItem.java

package cn.itcast.store.domain;public class OrderItem {private String itemid; //idprivate int quantity; //数量private double total; //小计//1_对象对应对象//2_product,order携带更多的数据private Product product;private Order order;public String getItemid() {return itemid;}public void setItemid(String itemid) {this.itemid = itemid;}public int getQuantity() {return quantity;}public void setQuantity(int quantity) {this.quantity = quantity;}public double getTotal() {return total;}public void setTotal(double total) {this.total = total;}public Product getProduct() {return product;}public void setProduct(Product product) {this.product = product;}public Order getOrder() {return order;}public void setOrder(Order order) {this.order = order;}}

order_info.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1"><title>下订单</title><link rel="stylesheet" href="${pageContext.request.contextPath}/css/bootstrap.min.css" type="text/css" /><script src="${pageContext.request.contextPath}/js/jquery-1.11.3.min.js" type="text/javascript"></script><script src="${pageContext.request.contextPath}/js/bootstrap.min.js" type="text/javascript"></script><!-- 引入自定义css文件 style.css --><link rel="stylesheet" href="${pageContext.request.contextPath}/css/style.css" type="text/css"/><style>body {margin-top: 20px;margin: 0 auto;}.carousel-inner .item img {width: 100%;height: 300px;}</style></head><body><%@ include file="/jsp/header.jsp" %><div class="container"><form id="orderForm" method="post" action="${pageContext.request.contextPath}/OrderServlet?method=payOrder"><div class="row"><div style="margin:0 auto;margin-top:10px;width:950px;"><strong>订单详情</strong><table class="table table-bordered"><tbody><tr class="warning"><th colspan="5">订单编号:${order.oid}</th></tr><tr class="warning"><th>图片</th><th>商品</th><th>价格</th><th>数量</th><th>小计</th></tr><c:forEach items="${order.list}" var="item"> <tr class="active"><td width="60" width="40%"><input type="hidden" name="id" value="22"><img src="${pageContext.request.contextPath}/${item.product.pimage}" width="70" height="60"></td><td width="30%"><a target="_blank">${item.product.pname}</a></td><td width="20%">¥${item.product.shop_price}</td><td width="10%">${item.quantity}</td><td width="15%"><span class="subtotal">¥${item.total}</span></td></tr></c:forEach></tbody></table></div><div style="text-align:right;margin-right:120px;">商品金额: <strong style="color:#ff6600;">¥${order.total }元</strong></div></div><div><hr/><div class="form-group"><label for="username" class="col-sm-1 control-label">地址</label><div class="col-sm-5"><input type="text" name="address" class="form-control" id="username" placeholder="请输入收货地址"></div></div><div class="form-group"><label for="inputPassword3" class="col-sm-1 control-label">收货人</label><div class="col-sm-5"><input type="text" name="name" class="form-control" id="inputPassword3" placeholder="请输收货人"></div></div><div class="form-group"><label for="confirmpwd" class="col-sm-1 control-label">电话</label><div class="col-sm-5"><input type="text" name="telephone" class="form-control" id="confirmpwd" placeholder="请输入联系方式"><input type="hidden" name="oid" value="${order.oid}"/></div></div><hr/><div style="margin-top:5px;margin-left:150px;"><strong>选择银行:</strong><p><br/><input type="radio" name="pd_FrpId" value="ICBC-NET-B2C" checked="checked" />工商银行<img src="${pageContext.request.contextPath}/img/bank_img/icbc.bmp" align="middle" />&nbsp;&nbsp;&nbsp;&nbsp;<input type="radio" name="pd_FrpId" value="BOC-NET-B2C" />中国银行<img src="${pageContext.request.contextPath}/img/bank_img/bc.bmp" align="middle" />&nbsp;&nbsp;&nbsp;&nbsp;<input type="radio" name="pd_FrpId" value="ABC-NET-B2C" />农业银行<img src="${pageContext.request.contextPath}/img/bank_img/abc.bmp" align="middle" /><br/><br/><input type="radio" name="pd_FrpId" value="BOCO-NET-B2C" />交通银行<img src="${pageContext.request.contextPath}/img/bank_img/bcc.bmp" align="middle" />&nbsp;&nbsp;&nbsp;&nbsp;<input type="radio" name="pd_FrpId" value="PINGANBANK-NET" />平安银行<img src="${pageContext.request.contextPath}/img/bank_img/pingan.bmp" align="middle" />&nbsp;&nbsp;&nbsp;&nbsp;<input type="radio" name="pd_FrpId" value="CCB-NET-B2C" />建设银行<img src="${pageContext.request.contextPath}/img/bank_img/ccb.bmp" align="middle" /><br/><br/><input type="radio" name="pd_FrpId" value="CEB-NET-B2C" />光大银行<img src="${pageContext.request.contextPath}/img/bank_img/guangda.bmp" align="middle" />&nbsp;&nbsp;&nbsp;&nbsp;<input type="radio" name="pd_FrpId" value="CMBCHINA-NET-B2C" />招商银行<img src="${pageContext.request.contextPath}/img/bank_img/cmb.bmp" align="middle" /></p><hr/><p style="text-align:right;margin-right:100px;"><a href="javascript:document.getElementById('orderForm').submit();"><img src="${pageContext.request.contextPath}/img/finalbutton.gif" width="204" height="51" border="0" /></a></p><hr/></div></div></form></div><%@ include file="/jsp/footer.jsp" %></body></html>

java 订单模块实现相关推荐

  1. java批量生成订单号_【笔记6-支付及订单模块】从0开始 独立完成企业级Java电商网站开发(服务端)...

    支付模块 实际开发工作中经常会遇见如下场景,一个支付模块,一个订单模块,有一定依赖,一个同事负责支付模块,另一个同事负责订单模块,但是开发支付模块的时候要依赖订单模块的相关类 ,方法,或者工具类,这些 ...

  2. 【笔记6-支付及订单模块】从0开始 独立完成企业级Java电商网站开发(服务端)

    支付模块 实际开发工作中经常会遇见如下场景,一个支付模块,一个订单模块,有一定依赖,一个同事负责支付模块,另一个同事负责订单模块,但是开发支付模块的时候要依赖订单模块的相关类 ,方法,或者工具类,这些 ...

  3. java电商项目搭建-------订单模块

    努力好了,时间会给你答案.--------magic_guo 订单模块的流程以及用户操作如下: 1.当用户选定购物车需要结算的商品并单击结算按钮时,会跳转到订单页面,此时会将选定的购物车信息展示在订单 ...

  4. Android 简单实现订单模块类APP的物流详情页

    不废话,需求:做一个订单模块类APP的物流详情页,怎么办? 这个功能完全是看到别人写的好,自己学习一下,主要写一下自己对别人代码的理解.参考文章:https://blog.csdn.net/weixi ...

  5. rabbitmq订单模块_RabbitMQ播放模块! 构架

    rabbitmq订单模块 RabbitMQ提供了具有可预测且一致的吞吐量和延迟的高可用性,可伸缩和便携式消息传递系统. RabbitMQ是AMQP (业务消息传递的开放标准)的领先实现 ,并且通过适配 ...

  6. java订单表字段_javaweb企业订单管理系统

    今天将为大家分析一个基于javaweb的企业订单管理系统, 物流管理的最大特点是以客户为中心,围绕客户构建各种业务流程支持的形式,物流管理系统支持多形式客户的数据共享以提高工作效率,监控整个物品流通的 ...

  7. 微服务项目-订单模块

    准备工作 参照之前的文章搭建好项目架构,接下来开始写订单模块的后端接口.接口文档在开源仓库上有,仓库地址在第一篇博客上有. 新建订单服务模块 1.创建新模块 模块继承主工程依赖依赖 2.导入相关依赖 ...

  8. EureKa服务注册与发现(集群部署Eureka与支付模块集群部署、订单模块访问负载均衡调用支付服务实现)

    上一遍文章完成了,聚合父工程.消费模块.支付模块.公共模块的搭建.RestTemplate调用支付模块 该篇项目创建gitv2.0的管理分子完成学习 1.Eureka基础知识 1.1. 什么是服务治理 ...

  9. Spring Boot电商项目59:订单模块八:【后台:订单列表】接口;

     说明: (1)本篇博客的主要内容是开发[后台:订单列表]接口: (2)本篇博客没什么难点:只需要注意:[前台:订单列表]接口是查询当前登录用户的订单数据:[后台:订单列表]接口是查询所有用户的订单数 ...

  10. 项目阶段六:查看我的订单模块

    3.1.编写查看我的订单模块的 Dao 程序和测试 OrderDao 接口 : /*** 根据用户编号查询订单信息* @param id* @return*/ List<Order> qu ...

最新文章

  1. Java 程序员一次有趣的面试 | 每日趣闻
  2. 开发顺序工作流时注意的几个事项
  3. clickhouse hbase性能对比_QQ音乐PB级ClickHouse实时数据平台架构演进之路
  4. python学习-装饰器(decorator)
  5. 那些被.NET大厂拒绝的大佬们,究竟弱在哪里?
  6. 点击ride界面edit空白_『技术锦囊』如何在SOLIDWORKS界面调用宏程序?
  7. 机器学习的练功方式(六)——朴素贝叶斯
  8. axureux中后台管理信息系统通用原型方案 v2_前端公共图表数据大盘方案
  9. QueryDict对象
  10. 一种无限循环轮播图的实现原理
  11. (7)ISE14.7无用引脚设置上下拉或高阻态(FPGA不积跬步101)
  12. selenium2 webdriver要点理解
  13. English trip EM2-PE 5B Presentation yourself favorite food Teacher:Ashley
  14. QQ浏览器,正式推出,9.0版本又多些好东西!
  15. php色子,jQuery+PHP实现的掷色子抽奖游戏实例,jquery色子_PHP教程
  16. Oracle9i的1467错误
  17. 安卓眼球追踪_iPhone 11 Pro 可配合 Eyeware Beam 眼球追踪玩 PC 大屏游戏
  18. 快慢缓急总相宜|ONES 人物
  19. dnf一天能获得多少黑暗之眼_DNF洞察之眼每天能打几次?洞察之眼奖励及入场方式一览_52pk...
  20. 氨基苯酚/多巴胺仿生修饰碳纳米管/α-氧化铝/ CNTs-Ag纳米复合材料

热门文章

  1. 机器学习中的数学——优化技术:参数初始化策略
  2. 微信小程序第三方平台开发配置
  3. oracle数据库导表操作
  4. java算法编程题:计算球的体积
  5. 吃白菜一样用micropython玩esp32(三)—— 触摸按键、ADC
  6. sci结构及写作顺序
  7. android 悬浮球简书,Android-悬浮窗效果FloatingView
  8. java 格林尼治生僻时间转换
  9. 11月书讯(下) | 拿下这些新书,赢在起跑线
  10. [996]如何申请高德地图用户Key