黑马商城项目(三)之一

来源:互联网 发布:linux fm驱动 编辑:程序博客网 时间:2024/06/08 04:47

黑马商城项目(三)

  • 黑马商城项目三
    • 购物车模块
      • 添加到购物车
        • 购物车的javabean
      • 清空购物车
      • 从购物车移除一个商品

购物车模块

添加到购物车

在单个商品详情页面有如下表单:

<form method="post" action="${pageContext.request.contextPath}/cart"><input type="hidden" name="pid" value="${p.pid}"><input type="hidden" name="method" value="addCart"><input ... value="加入购物车" type="submit"></form>

用户点击加入购物车按钮后,表单提交到CartServlet中的addCart()方法 (注意商品pid和方法名称都需要通过定义隐藏域的方式进行提交)。

CartServlet中的addCart()方法:

    // 对购物车添加购物项    public String addCart(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException    {        try {            //获取参数            String pid = request.getParameter("pid");            int count = Integer.parseInt(request.getParameter("count"));            // 根据商品pid获取对应的商品对象            ProductService ps =(ProductService)FactoryDemo.getBean("ProductService");            Product product = ps.findBypid(pid);            // 创建一个购物项对象            CartItem item = new CartItem();            item.setCount(count);            item.setProduct(product);            // 创建一个购物车对象 (唯一)            Cart cart = getCart(request);            // 把购物项放在购物车中            cart.add(item);            // 重定向到cart.jsp            response.sendRedirect(request.getContextPath()+"/jsp/cart.jsp");        } catch (Exception e) {        }        return null;    }

注意:向购物车中添加购物项,需要保证购物车对象是唯一的,实现唯一的方法是在Servlet中定义一个getCart()方法:

public Cart getCart(HttpServletRequest request){        //获取session对象        HttpSession session = request.getSession();        //从session中获取cart对象        Cart cart = (Cart)session.getAttribute("cart");        //如果session中没有,则new一个实例出来赋给cart并存到session中        if(cart==null){            cart = new Cart();            session.setAttribute("cart",cart);        }        //返回唯一的一个cart对象        return cart;    }

购物车的javabean:

public class Cart implements Serializable{        // 商品的总金额        private double total;        // 购物项的集合        Map<String,CartItem> map=new LinkedHashMap<String,CartItem>();        // 添加购物项--- 总金额=总金额+购物项的小计        public void add(CartItem item)        {        /*        注意下面,购物项的id直接使用了商品的pid,因为都是唯一的。        */            CartItem _item = map.get(item.getProduct().getPid());            // 判断map里面有没有            if(_item==null)            {                // 没有 map直接添加  修改总金额=总金额+添加商品的小计                map.put(item.getProduct().getPid(),item);                total=total+item.getSubtotal();            }else            {                // 有    把数量累加了=小计自动变化      修改总金额=总金额+添加商品的小计                _item.setCount(_item.getCount()+item.getCount());                total=total+item.getSubtotal();            }        }        // 删除购物项--- 总金额=总金额-被删除的购物项小计        public void remove(String key)        {            // 删除购物项            CartItem item = map.remove(key);            // 总金额=总结额-被删除购物项的小计            total=total-item.getSubtotal();        }        // 清空购物项---  总金额=0        public void removeAll()        {            // 清空购物车            map.clear();            // 总金额为0            total=0;        }}//购物项的 javabean:        // 商品的对象        private Product product;        // 商品数量        private int count;        // 商品小计        private double subtotal;

注意:购物车中定义了购物项的Map集合(还有购物车的总金额),而购物项中又定义了商品对象(还有该商品的数量和小计)。用图片来理解设计思路:

这里写图片描述

这里写图片描述

清空购物车

        Cart cart = getCart(request);        cart.removeAll();        // 重定向到cart.jsp        response.sendRedirect(request.getContextPath()+"/jsp/cart.jsp");

从购物车移除一个商品

        String key = request.getParameter("id");        Cart cart = getCart(request);        cart.remove(key);        // 重定向到cart.jsp        response.sendRedirect(request.getContextPath()+"/jsp/cart.jsp");
原创粉丝点击