今天就写一下购物车吧。这里先提四个问题:1)用户没有用用户名和密码登录,添加商品,没有用用户名和密码登录,关闭浏览器又重新打开 问:Shopping车内物品还在吗可用的?2)用户用用户名和密码登录,添加商品,关闭浏览器重新打开用户名和密码没有登录 问:购物车里的商品还在吗?3)用户登录用户名和密码,添加产品,关闭浏览器,再次打开,登录用户名和密码。Q:购物车里的商品还在吗?4)用户用用户名和密码登录,添加产品,关闭浏览器,在外地老家打开浏览器用用户名和密码登录。Q:购物车里的商品还在吗?以上四道题都是以京东为模板,猜猜结果是什么?1)In2)Notin3)In4)如果你能猜到答案,那你就真的很厉害了,那你是如何做到这四点的呢? (如果有不认识的小伙伴,可以用京东来做实验。)下面先说一下购物车的原理,再说说具体的代码实现。1)用户未登录,添加商品。此时的商品是被添加到浏览器的cookie中的,所以当你再次访问时(没有登录),该商品还在cookie中,所以购物车中的商品依然存在。2)用户登录并添加商品,此时会添加cookie将用户选择的商品添加到购物车中,然后删除cookie中的商品。所以当用户再次访问时(没有登录),cookie中购物车中的商品已经被删除,所以此时购物车中的商品已经不存在了。3)用户登录并添加产品。此时,产品被添加到数据库中进行持久化存储。再次打开登录用户名和密码。用户选择的商品肯定还存在,所以购物车里的商品还是存在的。4)原因3)先说说不用登录把商品保存到Cookie的优点和保存到Session和数据库的对比:1:Cookie:优点:节省用户浏览器(不用浪费我们公司的服务器)缺点:禁用Cookies,不提供存储2:Session:(Redis:浪费大量服务器内存:实现,禁用cookies)速度快3:数据库(Mysql、Redis、SOlr)数据库如果能持久化速度太慢所以今天要讲的是:用户未登录:购物车添加到cookie用户登录:将购物车保存到Redis(不带数据库)总体思路图:接下来是实现购物车功能的代码示例:首先,我们看一下购物车和购物项目一个JavaBean的设计:shoppingcart:buyerCart.java@这里使用JsonIgonre注解是因为tBuyerCart需要转成Json格式,而这些字段只有get方法,所以不能转,需要忽略Json。以下是购物项目:buy??erItem.java1。将产品添加到购物车。这里传入的参数是skuId(库存表的主键,库存表中保存的商品id、颜色、尺码、库存等信息)、采购金额。然后我们看Controller是如何处理的:这里有一个知识点:对象转json串/json串转对象。这里我们先写一个小demo来演示json和对象之间的转换。这里使用了Springmvc的ObjectMapper类。执行结果:这里我们使用如果使用Include.NON_NULL,如果TestTb中的属性为null,则不会转为Json。从对象-->Json字符串,使用objectMapper.writeValue()。从Json字符串-->对象,使用objectMapper。读取值()。回到我们上面项目中的代码,这个商品只有在没有登录的情况下才会添加到cookie中。我们在debug中可以看到:这里已经将objectshoppingcart对象buyerCart转换成了Json格式。将商品加入购物车,无论是否登录,都必须先取出cookie中的购物车,然后将当前选中的商品加入购物车。然后,如果你登陆了,清除cookie中的购物车,把购物车的内容添加到Redis中进行持久化存储。如果您没有登录,请将所选产品添加到Cookie。将购物车添加到Redis的代码:insertBuyerCartToRedis(包括判断添加的商品是否相同)判断用户是否登录:Stringusername=sessionProviderService.getAttributeForUsername(RequestUtils.getCSessionId(request,response));2.购物车展示页面***重定向到购物车展示页面:return"redirect:/shopping/toCart";在这里进入结算页面有两种打开方式:1)在商品详情页点击加入购物车。2)直接点击购物车按钮,进入购物车结账页面。我们看一下结账页面的代码:这里是购物车详情展示页面,这里需要注意,如果连续添加同一个商品,需要合并。购物车详情展示页面包括两部分,1)商品详情2)总计(商品总金额,运费)其中1)商品详情包括商品尺寸,商品颜色,购买商品数量,是否有货.取出Redis中的购物车:buyerCart=cartService.selectBuyerCartFromRedis(username);填写购物车,将skuId放入购物车即可,这里需要查看sku详情:List
