javaweb图书商城设计之订单模块(5)

这篇文章是针对javaweb图书商城中订单模块的研究,

1、创建相关类

domain:
Order
OrderItem
dao:OrderDao
service:OrderService
web.servlete:OrderServlet

/**
 * 订单条目类
 */
public class OrderItem {
 private String iid;
 private int count;// 数量
 private double subtotal;// 小计
 private Order order;// 所属订单
 private Book book;// 所要购买的图书
}
/**
 * 订单类
 */
public class Order {
 private String oid;
 private Date ordertime;// 下单时间
 private double total;// 合计
 private int state;// 订单状态有四种:1未付款 2已付款但未发货 3已发货但未确认收货 4已确认交易成功
 private User owner;// 订单所有者
 private String address;// 收货地址

 private List<OrderItem> orderItemList;//当前订单下所有条目
}
public class OrderDao {
 private QueryRunner qr = new TxQueryRunner();

 /**
  * 添加订单
  * @param order
  */
 public void addOrder(Order order) {
  try {
   String sql = "insert into orders values(?,?,?,?,?,?)";
   /*
    * 处理util的Date转换成sql的Timestamp
    */
   Timestamp timestamp = new Timestamp(order.getOrdertime().getTime());
   Object[] params = {order.getOid(), timestamp, order.getTotal(),
     order.getState(), order.getOwner().getUid(),
     order.getAddress()};
   qr.update(sql, params);
  } catch(SQLException e) {
   throw new RuntimeException(e);
  }
 }

 /**
  * 插入订单条目
  * @param orderItemList
  */
 public void addOrderItemList(List<OrderItem> orderItemList) {
  /**
   * QueryRunner类的batch(String sql, Object[][] params)
   * 其中params是多个一维数组!
   * 每个一维数组都与sql在一起执行一次,多个一维数组就执行多次
   */
  try {
   String sql = "insert into orderitem values(?,?,?,?,?)";
   /*
    * 把orderItemList转换成两维数组
    * 把一个OrderItem对象转换成一个一维数组
    */
   Object[][] params = new Object[orderItemList.size()][];
   // 循环遍历orderItemList,使用每个orderItem对象为params中每个一维数组赋值
   for(int i = 0; i < orderItemList.size(); i++) {
    OrderItem item = orderItemList.get(i);
    params[i] = new Object[]{item.getIid(), item.getCount(),
      item.getSubtotal(), item.getOrder().getOid(),
      item.getBook().getBid()};
   }
   qr.batch(sql, params);//执行批处理
  } catch(SQLException e) {
   throw new RuntimeException(e);
  }
 }

 /**
  * 按uid查询订单
  * @param uid
  * @return
  */
 public List<Order> findByUid(String uid) {
  /*
   * 1. 通过uid查询出当前用户的所有List<Order>
   * 2. 循环遍历每个Order,为其加载他的所有OrderItem
   */
  try {
   /*
    * 1. 得到当前用户的所有订单
    */
   String sql = "select * from orders where uid=?";
   List<Order> orderList = qr.query(sql, new BeanListHandler<Order>(Order.class), uid);

   /*
    * 2. 循环遍历每个Order,为其加载它自己所有的订单条目
    */
   for(Order order : orderList) {
    loadOrderItems(order);//为order对象添加它的所有订单条目
   }

   /*
    * 3. 返回订单列表
    */
   return orderList;
  } catch(SQLException e) {
   throw new RuntimeException(e);
  }
 }

 /**
  * 加载指定的订单所有的订单条目
  * @param order
  * @throws SQLException
  */
 private void loadOrderItems(Order order) throws SQLException {
  /*
   * 查询两张表:orderitem、book
   */
  String sql = "select * from orderitem i, book b where i.bid=b.bid and oid=?";
  /*
   * 因为一行结果集对应的不再是一个javabean,所以不能再使用BeanListHandler,而是MapListHandler
   */
  List<Map<String,Object>> mapList = qr.query(sql, new MapListHandler(), order.getOid());
  /*
   * mapList是多个map,每个map对应一行结果集
   * 一行:
   * {iid=C7AD5492F27D492189105FB50E55CBB6, count=2, subtotal=60.0, oid=1AE8A70354C947F8B81B80ADA6783155, bid=7, bname=精通Hibernate,price=30.0, author=张卫琴, image=book_img/8991366-1_l.jpg, cid=2}
   * ...
   *
   * 我们需要使用一个Map生成两个对象:OrderItem、Book,然后再建立两者的关系(把Book设置给OrderItem)
   */
  /*
   * 循环遍历每个Map,使用map生成两个对象,然后建立关系(最终结果一个OrderItem),把OrderItem保存起来
   */
  List<OrderItem> orderItemList = toOrderItemList(mapList);
  order.setOrderItemList(orderItemList);
 }

 /**
  * 把mapList中每个Map转换成两个对象,并建立关系
  * @param mapList
  * @return
  */
 private List<OrderItem> toOrderItemList(List<Map<String, Object>> mapList) {
  List<OrderItem> orderItemList = new ArrayList<OrderItem>();
  for(Map<String,Object> map : mapList) {
   OrderItem item = toOrderItem(map);
   orderItemList.add(item);
  }
  return orderItemList;
 }

 /**
  * 把一个Map转换成一个OrderItem对象
  * @param map
  * @return
  */
 private OrderItem toOrderItem(Map<String, Object> map) {
  OrderItem orderItem = CommonUtils.toBean(map, OrderItem.class);
  Book book = CommonUtils.toBean(map, Book.class);
  orderItem.setBook(book);
  return orderItem;
 }

 /**
  * 加载订单
  * @param oid
  * @return
  */
 public Order load(String oid) {
  try {
   /*
    * 1. 得到当前用户的所有订单
    */
   String sql = "select * from orders where oid=?";
   Order order = qr.query(sql, new BeanHandler<Order>(Order.class), oid);

   /*
    * 2. 为order加载它的所有条目
    */
   loadOrderItems(order);

   /*
    * 3. 返回订单列表
    */
   return order;
  } catch(SQLException e) {
   throw new RuntimeException(e);
  }
 }

 /**
  * 通过oid查询订单状态
  * @param oid
  * @return
  */
 public int getStateByOid(String oid) {
  try {
   String sql = "select state from orders where oid=?";
   return (Integer)qr.query(sql, new ScalarHandler(), oid);
  } catch(SQLException e) {
   throw new RuntimeException(e);
  }
 }

 /**
  * 修改订单状态
  * @param oid
  * @param state
  * @return
  */
 public void updateState(String oid, int state) {
  try {
   String sql = "update orders set state=? where oid=?";
   qr.update(sql, state, oid);
  } catch(SQLException e) {
   throw new RuntimeException(e);
  }
 }
}
public class OrderService {
 private OrderDao orderDao = new OrderDao();

 /**
  * 支付方法
  * @param oid
  */
 public void zhiFu(String oid) {
  /*
   * 1. 获取订单的状态
   * * 如果状态为1,那么执行下面代码
   * * 如果状态不为1,那么本方法什么都不做
   */
  int state = orderDao.getStateByOid(oid);
  if(state == 1) {
   // 修改订单状态为2
   orderDao.updateState(oid, 2);
  }
 }

 /**
  * 添加订单
  * 需要处理事务
  * @param order
  */
 public void add(Order order) {
  try {
   // 开启事务
   JdbcUtils.beginTransaction();

   orderDao.addOrder(order);//插入订单
   orderDao.addOrderItemList(order.getOrderItemList());//插入订单中的所有条目

   // 提交事务
   JdbcUtils.commitTransaction();
  } catch(Exception e) {
   // 回滚事务
   try {
    JdbcUtils.rollbackTransaction();
   } catch (SQLException e1) {
   }
   throw new RuntimeException(e);
  }
 }

 /**
  * 我的订单
  * @param uid
  * @return
  */
 public List<Order> myOrders(String uid) {
  return orderDao.findByUid(uid);
 }

 /**
  * 加载订单
  * @param oid
  * @return
  */
 public Order load(String oid) {
  return orderDao.load(oid);
 }

 /**
  * 确认收货
  * @param oid
  * @throws OrderException
  */
 public void confirm(String oid) throws OrderException {
  /*
   * 1. 校验订单状态,如果不是3,抛出异常
   */
  int state = orderDao.getStateByOid(oid);//获取订单状态
  if(state != 3) throw new OrderException("订单确认失败,您不是什么好东西!");

  /*
   * 2. 修改订单状态为4,表示交易成功
   */
  orderDao.updateState(oid, 4);
 }
}
public class OrderServlet extends BaseServlet {
 private OrderService orderService = new OrderService();

 /**
  * 支付之去银行
  *
  * @param request
  * @param response
  * @return
  * @throws ServletException
  * @throws IOException
  */
 public String zhiFu(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  Properties props = new Properties();
  InputStream input = this.getClass().getClassLoader()
    .getResourceAsStream("merchantInfo.properties");
  props.load(input);
  /*
   * 准备13参数
   */
  String p0_Cmd = "Buy";
  String p1_MerId = props.getProperty("p1_MerId");
  String p2_Order = request.getParameter("oid");
  String p3_Amt = "0.01";
  String p4_Cur = "CNY";
  String p5_Pid = "";
  String p6_Pcat = "";
  String p7_Pdesc = "";
  String p8_Url = props.getProperty("p8_Url");
  String p9_SAF = "";
  String pa_MP = "";
  String pd_FrpId = request.getParameter("pd_FrpId");
  String pr_NeedResponse = "1";

  /*
   * 计算hmac
   */
  String keyValue = props.getProperty("keyValue");
  String hmac = PaymentUtil.buildHmac(p0_Cmd, p1_MerId, p2_Order, p3_Amt,
    p4_Cur, p5_Pid, p6_Pcat, p7_Pdesc, p8_Url, p9_SAF, pa_MP,
    pd_FrpId, pr_NeedResponse, keyValue);

  /*
   * 连接易宝的网址和13+1个参数
   */
  StringBuilder url = new StringBuilder(props.getProperty("url"));
  url.append("?p0_Cmd=").append(p0_Cmd);
  url.append("&p1_MerId=").append(p1_MerId);
  url.append("&p2_Order=").append(p2_Order);
  url.append("&p3_Amt=").append(p3_Amt);
  url.append("&p4_Cur=").append(p4_Cur);
  url.append("&p5_Pid=").append(p5_Pid);
  url.append("&p6_Pcat=").append(p6_Pcat);
  url.append("&p7_Pdesc=").append(p7_Pdesc);
  url.append("&p8_Url=").append(p8_Url);
  url.append("&p9_SAF=").append(p9_SAF);
  url.append("&pa_MP=").append(pa_MP);
  url.append("&pd_FrpId=").append(pd_FrpId);
  url.append("&pr_NeedResponse=").append(pr_NeedResponse);
  url.append("&hmac=").append(hmac);

  System.out.println(url);

  /*
   * 重定向到易宝
   */
  response.sendRedirect(url.toString());

  return null;
 }

 /**
  * 这个方法是易宝回调方法 我们必须要判断调用本方法的是不是易宝!
  *
  * @param request
  * @param response
  * @return
  * @throws ServletException
  * @throws IOException
  */
 public String back(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  /*
   * 1. 获取11 + 1
   */
  String p1_MerId = request.getParameter("p1_MerId");
  String r0_Cmd = request.getParameter("r0_Cmd");
  String r1_Code = request.getParameter("r1_Code");
  String r2_TrxId = request.getParameter("r2_TrxId");
  String r3_Amt = request.getParameter("r3_Amt");
  String r4_Cur = request.getParameter("r4_Cur");
  String r5_Pid = request.getParameter("r5_Pid");
  String r6_Order = request.getParameter("r6_Order");
  String r7_Uid = request.getParameter("r7_Uid");
  String r8_MP = request.getParameter("r8_MP");
  String r9_BType = request.getParameter("r9_BType");

  String hmac = request.getParameter("hmac");

  /*
   * 2. 校验访问者是否为易宝!
   */
  Properties props = new Properties();
  InputStream input = this.getClass().getClassLoader()
    .getResourceAsStream("merchantInfo.properties");
  props.load(input);
  String keyValue = props.getProperty("keyValue");

  boolean bool = PaymentUtil.verifyCallback(hmac, p1_MerId, r0_Cmd,
    r1_Code, r2_TrxId, r3_Amt, r4_Cur, r5_Pid, r6_Order, r7_Uid,
    r8_MP, r9_BType, keyValue);

  if(!bool) {//如果校验失败
   request.setAttribute("msg", "您不是什么好东西!");
   return "f:/jsps/msg.jsp";
  }

  /*
   * 3. 获取状态订单,确定是否要修改订单状态,以及添加积分等业务操作
   */
  orderService.zhiFu(r6_Order);//有可能对数据库进行操作,也可能不操作!

  /*
   * 4. 判断当前回调方式
   * 如果为点对点,需要回馈以success开头的字符串
   */
  if(r9_BType.equals("2")) {
   response.getWriter().print("success");
  }

  /*
   * 5. 保存成功信息,转发到msg.jsp
   */
  request.setAttribute("msg", "支付成功!等待卖家发货!你慢慢等~");
  return "f:/jsps/msg.jsp";
 }

 /**
  * 确认收货
  *
  * @param request
  * @param response
  * @return
  * @throws ServletException
  * @throws IOException
  */
 public String confirm(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  /*
   * 1. 获取oid参数 2. 调用service方法 > 如果有异常,保存异常信息,转发到msg.jsp 3.
   * 保存成功信息,转发到msg.jsp
   */
  String oid = request.getParameter("oid");
  try {
   orderService.confirm(oid);
   request.setAttribute("msg", "恭喜,交易成功!");
  } catch (OrderException e) {
   request.setAttribute("msg", e.getMessage());
  }
  return "f:/jsps/msg.jsp";
 }

 /**
  * 加载订单
  *
  * @param request
  * @param response
  * @return
  * @throws ServletException
  * @throws IOException
  */
 public String load(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  /*
   * 1. 得到oid参数 2. 使用oid调用service方法得到Order 3.
   * 保存到request域,转发到/jsps/order/desc.jsp
   */
  request.setAttribute("order",
    orderService.load(request.getParameter("oid")));
  return "f:/jsps/order/desc.jsp";
 }

 /**
  * 我的订单
  *
  * @param request
  * @param response
  * @return
  * @throws ServletException
  * @throws IOException
  */
 public String myOrders(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  /*
   * 1. 从session得到当前用户,再获取其uid 2.
   * 使用uid调用orderService#myOrders(uid)得到该用户的所有订单List<Order> 3.
   * 把订单列表保存到request域中,转发到/jsps/order/list.jsp
   */
  User user = (User) request.getSession().getAttribute("session_user");
  List<Order> orderList = orderService.myOrders(user.getUid());
  request.setAttribute("orderList", orderList);
  return "f:/jsps/order/list.jsp";
 }

 /**
  * 添加订单 把session中的车用来生成Order对象
  *
  * @param request
  * @param response
  * @return
  * @throws ServletException
  * @throws IOException
  */
 public String add(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  /*
   * 1. 从session中得到cart 2. 使用cart生成Order对象 3. 调用service方法完成添加订单 4.
   * 保存order到request域中,转发到/jsps/order/desc.jsp
   */
  // 从session中获取cart
  Cart cart = (Cart) request.getSession().getAttribute("cart");
  // 把cart转换成Order对象
  /*
   * 创建Order对象,并设置属性
   *
   * Cart --> Order
   */
  Order order = new Order();
  order.setOid(CommonUtils.uuid());// 设置编号
  order.setOrdertime(new Date());// 设置下单时间
  order.setState(1);// 设置订单状态为1,表示未付款
  User user = (User) request.getSession().getAttribute("session_user");
  order.setOwner(user);// 设置订单所有者
  order.setTotal(cart.getTotal());// 设置订单的合计,从cart中获取合计

  /*
   * 创建订单条目集合
   *
   * cartItemList --> orderItemList
   */
  List<OrderItem> orderItemList = new ArrayList<OrderItem>();
  // 循环遍历Cart中的所有CartItem,使用每一个CartItem对象创建OrderItem对象,并添加到集合中
  for (CartItem cartItem : cart.getCartItems()) {
   OrderItem oi = new OrderItem();// 创建订单条目

   oi.setIid(CommonUtils.uuid());// 设置条目的id
   oi.setCount(cartItem.getCount());// 设置条目的数量
   oi.setBook(cartItem.getBook());// 设置条目的图书
   oi.setSubtotal(cartItem.getSubtotal());// 设置条目的小计
   oi.setOrder(order);// 设置所属订单

   orderItemList.add(oi);// 把订单条目添加到集合中
  }

  // 把所有的订单条目添加到订单中
  order.setOrderItemList(orderItemList);

  // 清空购物车
  cart.clear();

  // ////////////////////////////////////////////

  /*
   * 3. 调用orderService添加订单
   */
  orderService.add(order);
  /*
   * 4. 保存order到request域,转发到/jsps/order/desc.jsp
   */
  request.setAttribute("order", order);
  return "/jsps/order/desc.jsp";
 }
}

2、生成订单

3、我的订单(按用户查)

4、加载订单(按id查)

5、确认收货

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 利用Java异常机制实现模拟借书系统

    本文介绍的是利用java语言实现一个控制台版的模拟借书系统,在开始本文的正式内容之前,我们先来了解一下Java异常机制. 什么是异常? 异常,不正常也.Exception是Exception event的缩写,因此异常是一个事件,该事件发生在程序运行时. 异常会影响程序的连续性,使程序中断.在Java中,一切皆对象,所以要定义异常,也需要使用对象.异常对象里 封装了异常类型和程序发生异常时的状态. 我们经常说的抛出异常就是创建异常对象,并提交给运行系统. 异常捕获机制与try-catch 当异常

  • javaweb图书商城设计之用户模块(1)

    本文主要为大家分析了图书商城的用户模块,具体内容如下 1.用户模块的相关类创建 domain:User dao:UserDao service:UserDao web.servlet:UserServlet 2.用户注册 2.1 注册流程 /jsps/user/regist.jsp -> UserServlet#regist() -> msg.jsp 2.2 注册页面 <%@ page language="java" import="java.util.*&

  • Java设计模块系列之书店管理系统单机版(一)

    书店管理系统: 项目练习目标 : 1.Java应用程序基本分析 2.培养面向对象编程的基本思想 3.Java基本设计模式综合应用 4.掌握分层和接口的基本设计 5.构建合理的Java应用程序包结构 6.综合应用JSE所学习的知识 7.在应用中合理使用集合框架 8.在应用中综合使用swing的常用组件 9.基本的表现层的实现机制 10.IO流和文件的基本操作 11.培养良好的Java编程习惯 12.培养调试Java程序的能力,培养改错的能力 项目功能需求 : 1.能进行操作用户的注册,修改基本信息

  • javaweb图书商城设计之图书模块(4)

    本文接着上一篇图书商城分类模块进行学习,供大家参考,具体内容如下 1.创建相关类 cn.itcast.bookstore.book domain:Book dao:BookDao service :BookService web.servle:BookServlet Book public class Book { private String bid; private String bname; private double price; private String author; priv

  • Java设计模块系列之书店管理系统单机版(二)

    Java-单机版的书店管理系统(练习设计模块和思想_系列 一 ): http://www.jb51.net/article/91004.htm 介绍 小提示:上面一点有一个目录,可以快速定位到自己需要看的类. 今天对前面的代码有了小小的修改,让代码更加完善了一点. 至于用户唯一标识码uuid,会在以后修改成程序内部生成的, 现在的uuid还是由用户自己设置. 今天对这个程序,添加了用户界面的表现层的一部分,增加了公共类 枚举, 下面贴出目前我写的这个程序的全部代码:我会逐渐的写完这个程序的,请大

  • java网上图书商城(4)购物车模块1

    本文实例为大家分享了购物车模块的具体代码,供大家参考,具体内容如下 使用的不是session,也不是cookie,而是表 > 添加购物条目 > 修改购物条目的数量 > 删除条目 > 批量删除条目 > 我的购物车,即按用户查询条目 > 查询勾选的条目 1.数据表 复制代码 代码如下: insert  into `t_cartitem`(`cartItemId`,`quantity`,`bid`,`uid`,`orderBy`) values ('B8939FC551314

  • javaweb图书商城设计之购物车模块(3)

    本文继续为大家分享了javaweb图书商城中购物车模块,供大家参考,具体内容如下 购物车存储 保存在session中 保存在cookie中 保存在数据库中 1.创建相关类 购物车的结构: CartItem:购物车条目,包含图书和数量 Cart:购物车,包含一个Map /** * 购物车类 */ public class Cart { private Map<String,CartItem> map = new LinkedHashMap<String,CartItem>(); /*

  • JavaWeb搭建网上图书商城毕业设计

    以前一直接触.net相关的web开发,现在猛然使用javaWeb还是很不习惯,就连搭个框架也是第一次. 一.谈谈项目架构 一开始接触.net相关的开发所以对于.net相关的开发还是比较熟悉的,但我在学校学的java方向的开发,而我打算把这两种平台结合起来,使用java做后台也就是服务提供者,将所有业务逻辑在java平台完成并使用我比较熟悉的.net做Web端的开发.这样一来安卓app,web端就都有了.客户端统一通过分布式框架调用服务.找了很久最终选择了Hprose,这一轻量级.跨语言.跨平台.

  • 一个简陋的java图书管理系统

    本文代码为原创一个简陋的管理系统,只做功能的测试.并没有去完善所有应有的功能,只做了输入输出查找,仅供参考! 菜单部分: import java.util.Scanner; public class Menu { int Min = 1; int Max = 3; public void getMenu(){ System.out.println("1.显示/2.输入/3.查找"); } public void getFindMenu(){ System.out.println(&qu

  • 图书管理系统java版

    本文的目的就是通过图书管理系统掌握数据库编程技术,能正确连接数据库,能对数据库中信息进行查询.插入.删除.修改. 内容:在数据库中创建一张书目信息表,包括书名.作者.出版社.出版日期.书号.价格字段.设计一个GUI界面进行书目管理.在该界面上有四个选项卡,分别是查询.插入.删除.修改.点击查询选项卡,出现的界面上有书名.作者.出版社.书号四个文本框,一个按钮和一个只读文本区.文本框内容可以为空,输入相应的查询信息后(例如根据书名查询可以仅输入书名),点击界面上的"查询"按钮,可以在界面

随机推荐