Day20

作者: 开发猛男 | 来源:发表于2019-05-20 19:53 被阅读0次

    完成购物车、订单功能

    实体说明

    1. 购物车Cart,Map<String, CartItem>、Double total
    2. 购物项CartItem ,Product product、Integer count 、Double subtotal
    3. 订单Order中有String Oid, Date ordertime等属性,还有List<CartItem> items保存多个订单项
    4. 订单项OrderItem其实和购物项类似

    案例实现

    案例1-将商品添加到购物车

    需求说明:在商品信息页面,写好数量,点击加入购物车,跳转到购物车页面,展示购物车内容。
    步骤分析:
    1. 一个购物车Cart中包含多个购物项Map<String, CartItem> 、购物车总金额total
    2. 一个购物项CartItem包含商品信息、商品数量、小计金额
    3. 只需根据商品详情页 提交的 商品id 和 商品数量 ,查询商品信息,拼装成CartItem,再通过Session获取购物车Cart,向里面添加CartItem, 再页面重定向。
    技术实现:
    1. 编写form表单,点击加入购物车,提交到/cart?method=add
    <form action="/day18/cart?method=add" method="post" id="formId">
      ...
      <input ... onclick=addCart() >
    </form>
    <script type="text/javascript">
        function addCart(){
        //获取表单form 点击提交
          $("#formId").submit();
        //document.getElementById("formId").submit();
        }
    </script>
    
    1. 编写CartServlet中的add方法
    1.获取商品的pid和商品数量count
    2.获取购物车Cart session域中
      2.1 如果session中没有Cart就创建
      Cart cart = new Cart();
      request.getSession().setAttribute("cart", cart);
      2.2 若有则直接获取
      Cart cart = (Cart) request.getSession().getAttribute("cart");
    3.调用Service 根据pid查询商品信息 拼装成CartItem
      Product product = new ProductServiceImpl().getInfoById(pid);
    4.将CartItem添加到Cart中
    5.请求转发 展示购物车Cart
    

    案例2-将商品从购物车中移除

    需求描述:点击购物车中删除按钮,移除该购物车项
    实现步骤:
    1. 给按钮添加onclick事件,点击时弹出确认框
    function remove(pid){
      if(confirm("真的要删除吗?"){
        location.href = "/day18/cart?method=remove&pid="+pid;
      }
    }
    
    1. 确认后,将该CartItem.product.pid 发送到CartServlet,获取购物车,map.remove(pid)
    2. 页面重定向 "/jsp/cart.jsp"刷新

    案例3-清空购物车

    步骤分析:
    1. 点击清空购物车,/day18/cart?method=clear
    2. 获取session中的购物车Cart,map.clear();

    案例4-生成订单

    需求说明:将购物车所有项生成一个订单
    技术分析:
    1. 理清实体之间的关系
    2. 点击生成订单,OrderServlet判断用户登录、设置订单属性、遍历购物车中的购物车项,将购物车项CartItem依次改写为OrderItem,并依次加入Order的List<OrderItem>中
    3. 将order加入request域中
    4. 清空购物车

    知识总结:

    1. 对象和引用变量

    转自java对象与对象引用变量

    理清对象和对象的引用,需要先了解java中的两块存储区域

    • 栈:保存基本类型变量和对象的引用变量
    • 堆:保存由new指令创建的对象和数组

    引用变量保存在栈中,用于引用该类的实例,和指针类似。

    class Dog{
      String name;
      int age;
    }
    Dog dog = new Dog();
    1. new Dog 在堆空间中创建一个Dog类对象
    2. ()表示创建对象后 立即调用构造函数对其初始化
    3. Dog dog 创建了一个可以指向Dog类的引用变量dog
    4. = 即让dog引用了该对象,dog就相当于实例的名称
    5. 现在可以通过修改dog来实现对原对象的修改
    

    2. 将Map中的value值 封装成集合 ,写成bean属性 便于前端展示

    //Cart.java
    Map<String , CartItem> map = new LinkedHashMap<>();
    // 有了getItems()方法 ,items就相当于bean属性,可通过${Cart.items}访问
    public Collection<CartItem> getItems(){
      Collection<CartItem> values = map.values();
      return values;
    }
    
    

    3. 事务

    1. 默认为自动事务,手动事务需手动开启
    2. 操作数据库前 手动开启, 操作完之后提交
    try{
        DataSourceUtils.startTransaction();
        OrderDao od = (OrderDao) BeanFactory.getBean("OrderDao");
        od.add(order);
        ...
        DataSourceUtils.commitAndClose();
    } catch(Exception e) {
        DataSourceUtils.rollbanckAndClose();
        throw e;
    }
    3. 创建Queryrunner时,不能提供连接
    QueryRunner qr = new QueryRunner();
    //执行操作时,需传入连接
    qr.update(DataSourceUtils.getConnection(), sql, params...);
    

    4. 数据备份

    • 导出:
      1. 图形操作 右键数据库back up database as sql dump...
      2. 通过命令备份
        mysqldump -uroot -p123456 store28>d:\1.sql
    • 还原
      1.图形 右键 restore from sql dump..

    5.input 隐藏域

    使用form表单,post方法提交时,可以通过input隐藏域提交数据
    <input type="hidden" name="pid" value="${p.pid}">

    相关文章

      网友评论

          本文标题:Day20

          本文链接:https://www.haomeiwen.com/subject/nviiaqtx.html