欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

javaweb圖書商城設(shè)計(jì)之訂單模塊(5)

 更新時(shí)間:2016年11月11日 11:55:19   作者:Android-Dev  
這篇文章主要為大家詳細(xì)介紹了javaweb圖書商城設(shè)計(jì)之訂單模塊,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

這篇文章是針對javaweb圖書商城中訂單模塊的研究,

1、創(chuàng)建相關(guān)類

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

/**
 * 訂單條目類
 */
public class OrderItem {
 private String iid;
 private int count;// 數(shù)量
 private double subtotal;// 小計(jì)
 private Order order;// 所屬訂單
 private Book book;// 所要購買的圖書
}
/**
 * 訂單類
 */
public class Order {
 private String oid;
 private Date ordertime;// 下單時(shí)間
 private double total;// 合計(jì)
 private int state;// 訂單狀態(tài)有四種:1未付款 2已付款但未發(fā)貨 3已發(fā)貨但未確認(rèn)收貨 4已確認(rèn)交易成功
 private User owner;// 訂單所有者
 private String address;// 收貨地址

 private List<OrderItem> orderItemList;//當(dāng)前訂單下所有條目 
}


public class OrderDao {
 private QueryRunner qr = new TxQueryRunner();

 /**
  * 添加訂單
  * @param order
  */
 public void addOrder(Order order) {
  try {
   String sql = "insert into orders values(?,?,?,?,?,?)";
   /*
    * 處理util的Date轉(zhuǎn)換成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是多個(gè)一維數(shù)組!
   * 每個(gè)一維數(shù)組都與sql在一起執(zhí)行一次,多個(gè)一維數(shù)組就執(zhí)行多次
   */
  try {
   String sql = "insert into orderitem values(?,?,?,?,?)";
   /*
    * 把orderItemList轉(zhuǎn)換成兩維數(shù)組
    * 把一個(gè)OrderItem對象轉(zhuǎn)換成一個(gè)一維數(shù)組
    */
   Object[][] params = new Object[orderItemList.size()][];
   // 循環(huán)遍歷orderItemList,使用每個(gè)orderItem對象為params中每個(gè)一維數(shù)組賦值
   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);//執(zhí)行批處理
  } catch(SQLException e) {
   throw new RuntimeException(e);
  }
 }

 /**
  * 按uid查詢訂單
  * @param uid
  * @return
  */
 public List<Order> findByUid(String uid) {
  /*
   * 1. 通過uid查詢出當(dāng)前用戶的所有List<Order>
   * 2. 循環(huán)遍歷每個(gè)Order,為其加載他的所有OrderItem
   */
  try {
   /*
    * 1. 得到當(dāng)前用戶的所有訂單
    */
   String sql = "select * from orders where uid=?";
   List<Order> orderList = qr.query(sql, new BeanListHandler<Order>(Order.class), uid);

   /*
    * 2. 循環(huán)遍歷每個(gè)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=?";
  /*
   * 因?yàn)橐恍薪Y(jié)果集對應(yīng)的不再是一個(gè)javabean,所以不能再使用BeanListHandler,而是MapListHandler
   */
  List<Map<String,Object>> mapList = qr.query(sql, new MapListHandler(), order.getOid());
  /*
   * mapList是多個(gè)map,每個(gè)map對應(yīng)一行結(jié)果集
   * 一行:
   * {iid=C7AD5492F27D492189105FB50E55CBB6, count=2, subtotal=60.0, oid=1AE8A70354C947F8B81B80ADA6783155, bid=7, bname=精通Hibernate,price=30.0, author=張衛(wèi)琴, image=book_img/8991366-1_l.jpg, cid=2}
   * ...
   * 
   * 我們需要使用一個(gè)Map生成兩個(gè)對象:OrderItem、Book,然后再建立兩者的關(guān)系(把Book設(shè)置給OrderItem)
   */
  /*
   * 循環(huán)遍歷每個(gè)Map,使用map生成兩個(gè)對象,然后建立關(guān)系(最終結(jié)果一個(gè)OrderItem),把OrderItem保存起來
   */
  List<OrderItem> orderItemList = toOrderItemList(mapList);
  order.setOrderItemList(orderItemList);
 }

 /**
  * 把mapList中每個(gè)Map轉(zhuǎn)換成兩個(gè)對象,并建立關(guān)系
  * @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;
 }

 /**
  * 把一個(gè)Map轉(zhuǎn)換成一個(gè)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. 得到當(dāng)前用戶的所有訂單
    */
   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查詢訂單狀態(tài)
  * @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);
  }
 }

 /**
  * 修改訂單狀態(tài)
  * @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. 獲取訂單的狀態(tài)
   * * 如果狀態(tài)為1,那么執(zhí)行下面代碼
   * * 如果狀態(tài)不為1,那么本方法什么都不做
   */
  int state = orderDao.getStateByOid(oid);
  if(state == 1) {
   // 修改訂單狀態(tài)為2
   orderDao.updateState(oid, 2);
  }
 }

 /**
  * 添加訂單
  * 需要處理事務(wù)
  * @param order
  */
 public void add(Order order) {
  try {
   // 開啟事務(wù)
   JdbcUtils.beginTransaction();

   orderDao.addOrder(order);//插入訂單
   orderDao.addOrderItemList(order.getOrderItemList());//插入訂單中的所有條目

   // 提交事務(wù)
   JdbcUtils.commitTransaction();
  } catch(Exception e) {
   // 回滾事務(wù)
   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);
 }

 /**
  * 確認(rèn)收貨
  * @param oid
  * @throws OrderException
  */
 public void confirm(String oid) throws OrderException {
  /*
   * 1. 校驗(yàn)訂單狀態(tài),如果不是3,拋出異常
   */
  int state = orderDao.getStateByOid(oid);//獲取訂單狀態(tài)
  if(state != 3) throw new OrderException("訂單確認(rèn)失敗,您不是什么好東西!");

  /*
   * 2. 修改訂單狀態(tài)為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);
  /*
   * 準(zhǔn)備13參數(shù)
   */
  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";

  /*
   * 計(jì)算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);

  /*
   * 連接易寶的網(wǎng)址和13+1個(gè)參數(shù)
   */
  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;
 }

 /**
  * 這個(gè)方法是易寶回調(diào)方法 我們必須要判斷調(diào)用本方法的是不是易寶!
  * 
  * @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. 校驗(yàn)訪問者是否為易寶!
   */
  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) {//如果校驗(yàn)失敗
   request.setAttribute("msg", "您不是什么好東西!");
   return "f:/jsps/msg.jsp";
  }

  /*
   * 3. 獲取狀態(tài)訂單,確定是否要修改訂單狀態(tài),以及添加積分等業(yè)務(wù)操作
   */
  orderService.zhiFu(r6_Order);//有可能對數(shù)據(jù)庫進(jìn)行操作,也可能不操作!

  /*
   * 4. 判斷當(dāng)前回調(diào)方式
   * 如果為點(diǎn)對點(diǎn),需要回饋以success開頭的字符串
   */
  if(r9_BType.equals("2")) {
   response.getWriter().print("success");
  }

  /*
   * 5. 保存成功信息,轉(zhuǎn)發(fā)到msg.jsp
   */
  request.setAttribute("msg", "支付成功!等待賣家發(fā)貨!你慢慢等~");
  return "f:/jsps/msg.jsp";
 }

 /**
  * 確認(rèn)收貨
  * 
  * @param request
  * @param response
  * @return
  * @throws ServletException
  * @throws IOException
  */
 public String confirm(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  /*
   * 1. 獲取oid參數(shù) 2. 調(diào)用service方法 > 如果有異常,保存異常信息,轉(zhuǎn)發(fā)到msg.jsp 3.
   * 保存成功信息,轉(zhuǎn)發(fā)到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參數(shù) 2. 使用oid調(diào)用service方法得到Order 3.
   * 保存到request域,轉(zhuǎn)發(fā)到/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得到當(dāng)前用戶,再獲取其uid 2.
   * 使用uid調(diào)用orderService#myOrders(uid)得到該用戶的所有訂單List<Order> 3.
   * 把訂單列表保存到request域中,轉(zhuǎn)發(fā)到/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. 調(diào)用service方法完成添加訂單 4.
   * 保存order到request域中,轉(zhuǎn)發(fā)到/jsps/order/desc.jsp
   */
  // 從session中獲取cart
  Cart cart = (Cart) request.getSession().getAttribute("cart");
  // 把cart轉(zhuǎn)換成Order對象
  /*
   * 創(chuàng)建Order對象,并設(shè)置屬性
   * 
   * Cart --> Order
   */
  Order order = new Order();
  order.setOid(CommonUtils.uuid());// 設(shè)置編號
  order.setOrdertime(new Date());// 設(shè)置下單時(shí)間
  order.setState(1);// 設(shè)置訂單狀態(tài)為1,表示未付款
  User user = (User) request.getSession().getAttribute("session_user");
  order.setOwner(user);// 設(shè)置訂單所有者
  order.setTotal(cart.getTotal());// 設(shè)置訂單的合計(jì),從cart中獲取合計(jì)

  /*
   * 創(chuàng)建訂單條目集合
   * 
   * cartItemList --> orderItemList
   */
  List<OrderItem> orderItemList = new ArrayList<OrderItem>();
  // 循環(huán)遍歷Cart中的所有CartItem,使用每一個(gè)CartItem對象創(chuàng)建OrderItem對象,并添加到集合中
  for (CartItem cartItem : cart.getCartItems()) {
   OrderItem oi = new OrderItem();// 創(chuàng)建訂單條目

   oi.setIid(CommonUtils.uuid());// 設(shè)置條目的id
   oi.setCount(cartItem.getCount());// 設(shè)置條目的數(shù)量
   oi.setBook(cartItem.getBook());// 設(shè)置條目的圖書
   oi.setSubtotal(cartItem.getSubtotal());// 設(shè)置條目的小計(jì)
   oi.setOrder(order);// 設(shè)置所屬訂單

   orderItemList.add(oi);// 把訂單條目添加到集合中
  }

  // 把所有的訂單條目添加到訂單中
  order.setOrderItemList(orderItemList);

  // 清空購物車
  cart.clear();

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

  /*
   * 3. 調(diào)用orderService添加訂單
   */
  orderService.add(order);
  /*
   * 4. 保存order到request域,轉(zhuǎn)發(fā)到/jsps/order/desc.jsp
   */
  request.setAttribute("order", order);
  return "/jsps/order/desc.jsp";
 }
}

2、生成訂單

3、我的訂單(按用戶查)

4、加載訂單(按id查)

5、確認(rèn)收貨

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Java注解的實(shí)現(xiàn)與使用方法

    詳解Java注解的實(shí)現(xiàn)與使用方法

    這篇文章主要介紹了詳解Java注解的實(shí)現(xiàn)與使用方法的相關(guān)資料,希望通過本文大家能夠理解掌握J(rèn)ava注解的知識,需要的朋友可以參考下
    2017-09-09
  • Java利用AQS實(shí)現(xiàn)自定義鎖

    Java利用AQS實(shí)現(xiàn)自定義鎖

    本文主要介紹了Java利用AQS實(shí)現(xiàn)自定義鎖,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • JavaWeb開發(fā)基于ssm的校園服務(wù)系統(tǒng)(實(shí)例詳解)

    JavaWeb開發(fā)基于ssm的校園服務(wù)系統(tǒng)(實(shí)例詳解)

    這篇文章主要介紹了JavaWeb開發(fā)基于ssm的校園服務(wù)系統(tǒng),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java基礎(chǔ)之打印萬年歷的簡單實(shí)現(xiàn)(案例)

    Java基礎(chǔ)之打印萬年歷的簡單實(shí)現(xiàn)(案例)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)之打印萬年歷的簡單實(shí)現(xiàn)(案例)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-07-07
  • Java實(shí)現(xiàn)計(jì)網(wǎng)循環(huán)冗余檢驗(yàn)算法的方法示例

    Java實(shí)現(xiàn)計(jì)網(wǎng)循環(huán)冗余檢驗(yàn)算法的方法示例

    這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)計(jì)網(wǎng)循環(huán)冗余檢驗(yàn)算法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • SpringBoot整合FastJson過程解析

    SpringBoot整合FastJson過程解析

    這篇文章主要介紹了SpringBoot整合FastJson過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 快速校驗(yàn)實(shí)體類時(shí),@Valid,@Validated,@NotNull注解無效的解決

    快速校驗(yàn)實(shí)體類時(shí),@Valid,@Validated,@NotNull注解無效的解決

    這篇文章主要介紹了快速校驗(yàn)實(shí)體類時(shí),@Valid,@Validated,@NotNull注解無效的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • MyBatisPlus分頁時(shí)排序的實(shí)現(xiàn)

    MyBatisPlus分頁時(shí)排序的實(shí)現(xiàn)

    本文主要介紹了MyBatisPlus分頁時(shí)排序的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java使用延時(shí)隊(duì)列搞定超時(shí)訂單處理的場景

    Java使用延時(shí)隊(duì)列搞定超時(shí)訂單處理的場景

    這篇文章主要介紹了Java使用延時(shí)隊(duì)列搞定超時(shí)訂單處理,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • Spring多種加載Bean方式解析

    Spring多種加載Bean方式解析

    本篇文章主要介紹了Spring多種加載Bean方式解析,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04

最新評論