mvc:三

回顾:

1.展示分类信息

  包含(动态包含和静态包含)

  ajax  $.post(url,params,fn,type)  $.get(url,params,fn,type)  $.ajax(选项)

    url:请求路径  params:请求参数,可以key-value写,可以json对象写  fn:回调函数,可以接受返回obj  type:返回类型

2.展示最新和热门商品

  入口  访问项目首页就发起请求展示

3.展示商品详情  简单:只需要将商品的id传过去即可

4.分页展示分类商品  需要将cid、第几页的数据传过去

  分页里面需要的5个数据:当前页、当前页的数据、每页展示大小、总页数、总记录数

解耦合思想

  其实就是引入了beans.xml,模仿了spring的核心配置文件,去将bean的注入而已

项目下引入beans.xml到src下,然后将BeanFactory添加到utils包下面,导入dom4j和jaxen包到lib下面

 现在的实现类在beans.xml配置文件里面配了并且有了BeanFactory类读文件,所以为了解耦合new的代码都换成了下面这样式的

 解决了service与dao层的耦合问题

把商品添加到购物车

需求:在商品的详情页面输入购买的数量,点击加入购物车就将该商品添加到购物车了

技术:分析:我先添加了一个商品到购物车,然后我回到商品详情页面,又添加了一个商品到购物车,发现之前添加的物品还在

  不可能添加到别人哪里,所以用会话技术保存session,专属于浏览器的,以后项目一、项目二也会用到这个东西会用cookie,只不过数据保存的地方不一样而已,都可以

涉及到实体:

购物车(cart)实体-------购物车的信息是不写到数据库里边的

属性:商品购买信息的集合(专业新名字:1.购物项信息Map<String pid,CartItem>,一个id删除一个购物项,非常方便)

    2.总金额  就这两个属性

方法:物品本身有方法才能调用,不是我们可以去把商品加入购物车,而是本来就有加入这个方法,我们去调用的而已,不是我们开着汽车跑,而是汽车本来就有跑的这个方法,我们去调用的

加入购物车add2cart(CartItem item){ 判断购物车是否有这个商品   如果有,修改购买数量,修改总金额;如果没有,直接put进去,修改金额}

从购物车移除removeFromCart(String pid){  由pid移除一个购物项,修改总金额}

清空购物车clearCart{ 清空购物车,修改总金额为0}

--------------------------------------------------------------------------------------------------------------------------------------------------

购物项(cartItem)实体

属性:1.商品对象(product) 2.购买数量(count)  3.小计(sbutotal)

方法:重写小计方法,算出数量*市场价=总额 显示在页面  

getSubstotal(){  return product.getShop_price*count  }

设计实体功能代码

 实现步骤分析

1.修改商品详情product_info.jsp页面

  添加一个表单:method=add2cart  商品的pid=xxx  商品的购买数量=:count=123123

  点击"加入购物车",将表单提交到/store/cart  和购物车相关,所以提交到cartservlet

2.编写cartservlet  基础baseservlet  编写add2cart方法

  获取商品的pid和购买数量count  调用productservice通过pid获取商品

  封装cartItem  new cartItem(Product,count)  将cartitem加入购物车  获取购物车(session中获取),调用add2car()方法即可 重定向到cart.jsp上

从购物车移除一个商品

 需求:在cart.jsp上,点击某一个商品的删除,弹出一个提示“您忍心抛弃我吗?”,点击确定就从购物车中移除,否则不删

步骤分析:1.给  删除  添加链接/store/cart?method = remove&pid=xxx

<td><!-- 先让移除超链接失效,然后弹出一个框 -->
   <a href="javascript:void(0);" onclick="removeFromCart('${ci.product.pid}')" class="delete">删除</a>
</td>

<script type="text/javascript">
   function removeFromCart(pid){
    if (confirm("你忍心抛弃我吗?")) {
      location.href="${pageContext.request.contextPath}/cart?method=remove&pid="+pid;
    }
   }
</script>

2.在cartservlet中编写remove方法  获取pid,获取cart,执行removeFormCart()方法,重定向到cart.jsp

清空购物车

需求:点击cart.jsp上的清空购物车,需要将购物车中所有商品移除掉

步骤分析:1.修改  清空购物车的连接/store/cart?method=clear

2.编写clear方法  获取购物车,执行clearCart() 重定向到cart.jsp上

3.判断购物车中是否有商品,有则展示,无则提示

生成订单(提交订单)

需求:在cart.jsp上,点击“提交订单”,将购物车中的商品,最终保存到数据库中(肯定需要一张表保存把bean)

实体分析:

  用户  订单  商品  用户和订单:一对多  订单和商品:多对多

表分析:用户表  商品表  订单表    用户和订单是一对多,在订单表中添加外键    订单和商品是多对多,引入一张

订单表:(见第一天的分析)       id  订单状态  订单金额  下单时间  收货人信息  user_id(用户外键)

订单项表:(见第一天的分析)  pid  oid  itemid  某个商品的购买数量  小计

实体具体分析:上面分析的是表,这里分析的是java类,有相同

  订单java类属性:id  订单状态  订单金额  下单时间  收货人信息  user对象(在一对多的关系处理的时候需要在多的一方放一个一的一方的引用)  订单项列表List<OrderItem> list;

  订单项java类属性:product对象(pid)  order对象(oid)  itemid  count(某个商品的购买数量)  subtotal(小计)

再分析----一个订单里面有多个订单项,那么怎么查看订单里面的订单项呢?所以订单里面有一个订单项的列表,需要在一的一方放一个多的一方的集合

 步骤分析:

  保存订单:在orders中插入一条数据  在orderitems中插入多条数据

  1.在cart.jsp上,点击提交订单,发送请求  路径:/store/order?method=save

public String save(HttpServletRequest request, HttpServletResponse response) throws IOException {
        try {
            //-1.从session中获取user,没登录生成订单没用
            User user = (User) request.getSession().getAttribute("user");
            if (user == null) {
                request.setAttribute("msg","请先登录");
                return "/jsp/msg.jsp";
            }
            //0.获取购物车
            Cart cart = (Cart) request.getSession().getAttribute("cart");
            
            //1.封装订单对象
            //1.1创建对象
                Order order = new Order();
            //1.2设置oid
                order.setOid(UUIDUtils.getId());
            //1.3设置ordertime
                order.setOrdertime(new Date());
            //1.4设置total
                order.setTotal(cart.getTotal());
            //1.5设置state
                order.setState(Constant.ORDER_WEIFUKUAN);
            //1.6设置user
                order.setUser(user);
            //1.7设置items(订单项表),需要遍历购物项列表
                for (CartItem ci : cart.getCartItems()) {
                    //1.7.1封装成orderitem
                    OrderItem oi = new OrderItem();
                    //a 创建一个orderitem
                    oi.setItemid(UUIDUtils.getId());
                    //b 设置itemid uuid
                    oi.setCount(ci.getCount());
                    //c 设置count 从ci中获取
                    oi.setSubtotal(ci.getSubtotal());
                    //d 设置subtotal 从ci中获取
                    oi.setProduct(ci.getProduct());
                    //e 设置product    从ci中获取
                    //f 设置order 
                    oi.setOrder(order);
                    //1.7.2将orderitem加入order的items
                    order.getItems().add(oi);
                }
            //2.调用orderservice完成保存操作
            OrderService os = (OrderService) BeanFactory.getBean("OrderService");
            os.save(order);
            //3.请求转发到order_info.jsp
            request.setAttribute("bean",order);
        } catch (Exception e) {
        }
        return "/jsp/order_info.jsp";

 

 下面需要在页面展示出来就可以了

 找到order_info.jsp

 总结:

购物车设计

  添加到购物车

  从购物车移除一个商品

  清空购物车(设计的是map集合)

订单实体  user对象  List<OrderItem>集合  二者一对多的关系  

订单项实体  order对象  product对象

原文地址:https://www.cnblogs.com/djlindex/p/11442198.html