购物商城---购物车,结算

本文介绍了一个基于Java的购物车功能实现方案,包括商品添加、删除、清空及结算流程。通过对HTTP请求处理、Cookie操作、JSON序列化和反序列化的详细讲解,帮助读者理解购物车功能的具体实现。

这里写图片描述

1商品详情页面点击购买到购物车页面

点击购物,刷新购物车页面 流程图
这里写图片描述

代码实现

    // 购买按钮,通过页面cookie获取数据
    @RequestMapping(value = "/shopping/buyCart.shtml")
    public String buyCart(HttpServletRequest request, ModelMap modelMap, Integer skuId, Integer amount,
            Integer buyLimit, Integer productId, HttpServletResponse response) {

        BuyCart buyCart = null;
        // 对象转json,json 转对象
        ObjectMapper om = new ObjectMapper();

        // 去掉json中value=null的key 和value
        om.setSerializationInclusion(Inclusion.NON_NULL);
        // 获取页面cookie信息
        Cookie[] cookies = request.getCookies();
        if (cookies != null && cookies.length > 0) {// 页面有cookie
            for (Cookie cookie : cookies) {
                // cookies 存在购买者cookie
                if (Constans.BUYCART_COOKIE.equals(cookie.getName())) {
                    String value = cookie.getValue();
                    // json 转 对象
                    try {
                        buyCart = om.readValue(value, BuyCart.class);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    break;
                }
            }
        }
        if (buyCart == null) {// 最佳
            buyCart = new BuyCart();
        }

        // skuId  != null:   页面点击购买的请求
        //skuId  == null: 购物车页面刷新情况,不改动cookie,页面展示以前购物信息.
        if (skuId != null) {
            Sku sku = new Sku();
            sku.setId(skuId);

            //buyLimit != null  点击购买的情况
            //buyLimit == null   购物车页面+-    对原有购物车的商品数量进行+-
            //购物车页面+  window.location.href='/shopping/buyCart.shtml?skuId='+skuId+"&amount=1";
            if (buyLimit != null) {
                sku.setSkuUpperLimit(buyLimit);
            }
            // 购物项
            BuyItem item = new BuyItem();
            item.setSku(sku);
            item.setAmount(amount);
            // 购物车
            buyCart.addItem(item);
            //productId != null  点击购买的情况
            //productId == null  购物车页面+-    对原有购物车的商品数量进行+-
            if (productId != null) {
                // 最后一款商品的ID
                buyCart.setProductId(productId);
            }

            // 对象转json,写的过程,json 是只字符串流
            StringWriter out = new StringWriter();

            try {
                om.writeValue(out, buyCart);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            // 购物车持久化
            Cookie cookie = new Cookie(Constans.BUYCART_COOKIE, out.toString());

            // 关闭浏览器也要存在
            // 默认-1,代表关闭浏览器就销毁cookie
            // 0 代表马上销毁cookie
            // expiry 设置时间,秒,代表关闭浏览器后还要多少时间才销毁cookie
            cookie.setMaxAge(60 * 60 * 24);// 设置cookie保存一天

            // 路径设置setPath 设置cookie存放目录
            // 请求路径/shopping/buyCart.shtml
            // 默认路径/shopping
            // 如果不设置"/"的后果:
            // 所有页面都能访问根目录下面的cookie。如果cookie的路径为/shopping,那么只有/shopping下的目录或者子目录下(或者/shopping/*.jsp请求页面)的页面或者代码才能访问cookie
            // 如果默认/shopping,用户在前台页面想要查看购物车,因为没有cookie,所以购物车信息为空
            cookie.setPath("/");

            // 发送到页面去
            response.addCookie(cookie);// 节省性能,cookie只装skuID
        }
        // 装满购物车
        for (BuyItem buyItem : buyCart.getItems()) {
            Sku s = skuService.getSkuByKey(buyItem.getSku().getId());
            buyItem.setSku(s);
        }
        modelMap.addAttribute("buyCart", buyCart);

        return "product/cart";
    }

    // 清空购物车
    @RequestMapping(value = "/shopping/clearCart.shtml")
    public String clearCart(HttpServletResponse response) {
        Cookie cookie = new Cookie(Constans.BUYCART_COOKIE, null);
        cookie.setPath("/");
        cookie.setMaxAge(0);
        response.addCookie(cookie);
        return "product/cart";
    }

    // deleteItem删除购物项
    @RequestMapping(value="/shopping/deleteItem.shtml")
    public String deleteItem(HttpServletRequest request,HttpServletResponse response,Integer skuId){
        BuyCart buyCart = null;
        // 对象转json,json 转对象
        ObjectMapper om = new ObjectMapper();
        // 去掉json中value=null的key 和value
        om.setSerializationInclusion(Inclusion.NON_NULL);
        // 获取页面cookie信息
        Cookie[] cookies = request.getCookies();
        if (cookies != null && cookies.length > 0) {// 页面有cookie
            for (Cookie cookie : cookies) {
                // cookies 存在购买者cookie
                if (Constans.BUYCART_COOKIE.equals(cookie.getName())) {
                    String value = cookie.getValue();
                    // json 转 对象
                    try {
                        buyCart = om.readValue(value, BuyCart.class);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    break;
                }
            }
        }
        // sku信息
        if (buyCart != null) {// 购物车页面刷新情况,没有skuid则不添加购物车,如果只是添加购物车,则重新把信息发到cookie,否则购物车页面刷新,不添加cookie
            Sku sku = new Sku();
            sku.setId(skuId);
            // 购物项
            BuyItem item = new BuyItem();
            item.setSku(sku);
            // 购物车
            buyCart.deleteItem(item);

            // 对象转json,写的过程,json 是只字符串流
            StringWriter out = new StringWriter();

            try {
                om.writeValue(out, buyCart);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            // 购物车持久化
            Cookie cookie = new Cookie(Constans.BUYCART_COOKIE, out.toString());

            // 关闭浏览器也要存在
            // 默认-1,代表关闭浏览器就销毁cookie
            // 0 代表马上销毁cookie
            // expiry 设置时间,秒,代表关闭浏览器后还要多少时间才销毁cookie
            cookie.setMaxAge(60 * 60 * 24);// 设置cookie保存一天

            // 路径设置setPath 设置cookie存放目录
            // 请求路径/shopping/buyCart.shtml
            // 默认路径/shopping
            // 如果不设置"/"的后果:
            // 所有页面都能访问根目录下面的cookie。如果cookie的路径为/shopping,那么只有/shopping下的目录或者子目录下(或者/shopping/*.jsp请求页面)的页面或者代码才能访问cookie
            // 如果默认/shopping,用户在前台页面想要查看购物车,因为没有cookie,所以购物车信息为空
            cookie.setPath("/");
            // 发送到页面去
            response.addCookie(cookie);// 节省性能,cookie只装skuID
    }
        return "redirect:/shopping/buyCart.shtml";
}

    //结算
    @RequestMapping(value = "/buyer/trueBuy.shtml")
    public String trueBuy(HttpServletRequest request,HttpServletResponse response,ModelMap modelMap){
        //先从cookie获取购物车信息
        BuyCart buyCart = null;
        // 对象转json,json 转对象
        ObjectMapper om = new ObjectMapper();
        // 去掉json中value=null的key 和value
        om.setSerializationInclusion(Inclusion.NON_NULL);
        // 获取页面cookie信息
        Cookie[] cookies = request.getCookies();
        if (cookies != null && cookies.length > 0) {// 页面有cookie
            for (Cookie cookie : cookies) {
                // cookies 存在购买者cookie
                if (Constans.BUYCART_COOKIE.equals(cookie.getName())) {
                    String value = cookie.getValue();
                    // json 转 对象
                    try {
                        buyCart = om.readValue(value, BuyCart.class);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    break;
                }
            }
        }

        //如果购物车时间过长,cookie不存在,cookie存在,获取存在购物车,但不存在购物项,这些情况都去刷新购物车页面
        if(buyCart!=null){
            List<BuyItem> items = buyCart.getItems();//初始购物车长度

            if(items!=null&&items.size()>0){
                //由于时间太久,购物项商品的库存有的可能为0,或者小于购物数量
                int L = items.size();//初始购物车长度
            for (BuyItem buyItem : items) {
                //当前sku的库存
                Sku s = skuService.getSkuByKey(buyItem.getSku().getId());
                //当前sku的库存,小于cookie中的购买数量,把该商品移除
                if(s.getStockInventory()<buyItem.getAmount()){
                    buyCart.deleteItem(buyItem);
                }
            }
            int O = buyCart.getItems().size();//和数据库对比后的购物车长度
            if(L>O){//说明购物车数据有删除
                // 对象转json,写的过程,json 是只字符串流
                StringWriter out = new StringWriter();

                try {
                    om.writeValue(out, buyCart);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                // 购物车持久化
                Cookie cookie = new Cookie(Constans.BUYCART_COOKIE, out.toString());

                // 关闭浏览器也要存在
                // 默认-1,代表关闭浏览器就销毁cookie
                // 0 代表马上销毁cookie
                // expiry 设置时间,秒,代表关闭浏览器后还要多少时间才销毁cookie
                cookie.setMaxAge(60 * 60 * 24);// 设置cookie保存一天

                // 路径设置setPath 设置cookie存放目录
                // 请求路径/shopping/buyCart.shtml
                // 默认路径/shopping
                // 如果不设置"/"的后果:
                // 所有页面都能访问根目录下面的cookie。如果cookie的路径为/shopping,那么只有/shopping下的目录或者子目录下(或者/shopping/*.jsp请求页面)的页面或者代码才能访问cookie
                // 如果默认/shopping,用户在前台页面想要查看购物车,因为没有cookie,所以购物车信息为空
                cookie.setPath("/");

                // 发送到页面去
                response.addCookie(cookie);// 节省性能,cookie只装skuID
                return "/shopping/buyCart.shtml";//刷新购物车页面

            }else{//cookie购物车的数据与数据库的数据一致,跳转结算功能
                //收获地址
                Buyer buyer =(Buyer) sessionProvider.getAttribute(request, Constans.BUYER_SESSION,response);
                AddrQuery addrQuery=new AddrQuery();
                addrQuery.setBuyerId(buyer.getUsername());
                //默认地址
                addrQuery.setIsDef(1);
                List<Addr> addrList = addrService.getAddrList(addrQuery); 
                if(addrList.size()>0){
                    modelMap.addAttribute("addr",addrList.get(0));
                }
                for (BuyItem buyItem : buyCart.getItems()) {
                    Sku s = skuService.getSkuByKey(buyItem.getSku().getId());
                    buyItem.setSku(s);
                }
                modelMap.addAttribute("buyCart", buyCart);
                return "product/productOrder";
            }

            }else{
                return "/shopping/buyCart.shtml";//刷新购物车页面
            }
        }else{
            return "/shopping/buyCart.shtml";//刷新购物车页面
        }
    }
1. 首先设置网上购物系统。 (1) 确认“JDK+Tomcat”的运行环境已经搭建好。 (2) 从光盘中将shopping目录拷贝到电脑中,这里假定拷贝在“D:\shopping”,即把包含了网上购物系统所有文件的shopping目录放到D盘中。 (3) 在Tomcat安装目录的conf\Catalina\localhost目录下新建一个shop.xml配置文件,在其中添加一个Context元素,代码如下: (4) 将Oracle驱动程序“classes12.jar”(从Oracle安装目录,例如C:\oracle中搜索)拷贝到Tomcat安装目录下的 common\lib子目录中。 2. 在正式运行这个网上购物系统之前,要先建立相应的数据库和表,操作如下。 (1) 建立Oracle数据库。 对于本网上购物系统,我们需要建立一个名为myorc的Oracle数据库。具体创建方法可以参考本书第5章的内容(需建立SCOTT账户)。 (2) 通过PL/SQL Developer直接导入光盘中提供的数据记录,方法如下: ①在PL/SQL Developer工具中以SCOTT用户身份登录Oracle数据库myorc(请注意使用Normal登录!)。 ②选择【工具】|【导入表】菜单命令,选择“SQL插入”选项卡,然后导入“D:/shopping/数据库/shop.sql”文件,接着选择“Oracle导入”选项卡,然后导入“D:/shopping/数据库/shop.dmp”文件,这样,我们就成功地导入了对象和表数据。 3. 到此,网上购物系统已经可以正常运行了。 (1) 启动Tomcat服务器。 (2) 打开浏览器,在地址栏中输入http://localhost:8080/shop,即可打开网上购物系统登录界面。 (3) 注册新用户,然后使用注册时使用的用户名和密码登录网上购物系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值