一.课程计划
- 购物车实现
- 订单确认页面展示
二.购物车的实现
2.1 功能分析
- 购物车是一个独立的表现层工程。
- 添加购物车不要求登录。可以指定购买商品的数量。
- 展示购物车列表页面
- 修改购物车商品数量
- 删除购物车商品
2.2 工程搭建
全部参考content项目
三.未登录状态下购物车的实现
3.1 添加购物车
3.1.1 功能分析
在不登陆的情况下也可以添加购物车。把购物车信息写入cookie。
优点:
- 不占用服务端存储空间
- 用户体验好。
- 代码实现简单。
缺点:
- cookie中保存的容量有限。最大4k
- 把购物车信息保存在cookie中,更换设备购物车信息不能同步。
改造商品详情页面
3.1.2 Controller
请求的url:/cart/add/{itemId}
参数:
- 商品id: Long itemId
- 商品数量: int num
业务逻辑:
- 从cookie中查询商品列表。
- 判断商品在商品列表中是否存在。
- 如果存在,商品数量相加。
- 不存在,根据商品id查询商品信息。
- 把商品添加到购车列表。
- 把购车商品列表写入cookie。
返回值:逻辑视图
Cookie保存购物车
- key:cart
- Value:购物车列表转换成json数据。需要对数据进行编码。
- Cookie的有效期:保存7天。
商品列表:
List
读写cookie可以使用CookieUtils工具类实现。
1 | /** |
3.2 展示购物车商品列表
请求的url:/cart/cart
参数:无
返回值:逻辑视图
业务逻辑:
- 从cookie中取商品列表。
- 把商品列表传递给页面
3.2.1 Controller
1 | @RequestMapping("/cart/cart") |
3.3 修改购物车商品数量
3.3.1 功能分析
- 在页面中可以修改商品数量
- 重新计算小计和总计。
- 修改需要写入cookie。
每次修改都需要向服务端发送一个ajax请求,在服务端修改cookie中的商品数量。
请求的url:/cart/update/num/{itemId}/{num}
参数:long itemId、int num
业务逻辑:
- 接收两个参数
- 从cookie中取商品列表
- 遍历商品列表找到对应商品
- 更新商品数量
- 把商品列表写入cookie。
- 响应e3Result。Json数据。
返回值:
e3Result。Json数据
1 | @RequestMapping("/cart/update/num/{itemId}/{num}") |
406一般是缺少jackson的jar或者是以.html结尾的页面无法返回json
3.3.2 解决请求*.html后缀无法返回json数据的问题
在springmvc中请求*.html不可以返回json数据。
修改web.xml,添加url拦截格式。
1 | <servlet-mapping> |
再添加一个
就行了,让它别以*.html请求了不就完事了吗
3.4 删除购物车商品
3.4.1 功能分析
请求的url:/cart/delete/{itemId}
参数:商品id
返回值:展示购物车列表页面。Url需要做redirect跳转。
业务逻辑:
- 从url中取商品id
- 从cookie中取购物车商品列表
- 遍历列表找到对应的商品
- 删除商品。
- 把商品列表写入cookie。
返回逻辑视图:在逻辑视图中做redirect跳转
1 | @RequestMapping("/cart/delete/{itemId}") |
3.4.2 Controller
1 | @RequestMapping("/cart/delete/{itemId}") |
四.登录状态下购物车实现
4.1 功能分析
购物车数据保存位置:
- 未登录状态下,将购物车数据保存到cookie中
- 登录状态下需要把购物车数据保存到服务端。需要永久保存,可以保存到数据库中。可以把购物车数据保存到redis中。
redis使用的数据类型:
- 使用Hash数据类型
- Hash的key应该是用户id。Hash中的field是商品id,value可以把商品信息转换为json
添加购物车:
- 登录状态下直接将商品数据放在redis中
- 未登录状态下保存到cookie中
如何判断是否登录?:
- 从cookie中取token
- 取不到就是未登录
- 取到token,到redis中查询token是否过期
- 如果过期就是未登录状态
- 没过期就是登录状态
4.2 判断用户是否登录
4.2.1 功能分析
应该使用springmvc的拦截器
- 实现一个HandlerInterceptor接口
- 在执行handler方法之前做业务处理
- 从cookie中取token。使用CookieUtils工具类实现
- 没有取到token,用户未登录。放行
- 取到token,调用sso系统的服务,根据token查询用户信息
- 没有返回用户信息。登录已过期,未登录,放行。
- 返回用户信息。用户是否是登录状态。可以把用户对象保存到request中,在Controller中可以通过判断request中是否包含用户对象,确定是否为登录状态
4.2.2 LoginInterceptor
1 | /** |
4.3 修改原来的Controller
1 | @RequestMapping("/cart/add/{itemId}") |
4.4 登录状态下展示购物车列表
4.4.1 功能分析
- 判断用户是否为登录状态
- 如果是登录状态
- 从cookie中取购物车列表
- 如果不为空,把cookie中的购物车商品和服务端的购物车商品合并
- 把cookie中的购物车删除
- 从服务端取购物车列表
- 未登录状态
- 从cookie中取购物车列表
其中未登录状态下从cookie中取购物车列表我们已经做完了
4.4.2 完成Service服务
接口
1 | public interface CartService { |
实现合并购物车
1 | @Override |
从redis中取hash的值
从redis中取购物车列表
1 | @Override |
Controller
1 | /** |
测试成功
4.5 登录状态下修改、删除购物车(这个简单)
4.5.1 接口
1 | package yp.e3mall.cart.service; |
4.5.2 实现类
1 | package yp.e3mall.cart.service.impl; |
4.5.3 Controller(也很简单)
1 | /** |