一、展示购物车信息
1.Controller
/**
* 展示购物车信息
* @param request
* @param response
* @param model
* @return
*/
@RequestMapping("/cart/cart")
public String showCart(HttpServletRequest request, HttpServletResponse response, Model model){
List<TbItem> list = getCartList(request, response);
model.addAttribute("cartList", list);
return "cart";
}
2. cart.jsp
3. cartSuccess.jsp
4. 测试
5. 调试bug
如图所示,如果我们一直刷新的话,去购物车结算时,商品数量变多了
解决办法:通过redirect方式跳转,就不会一直刷新数量了
在添加购物车成功时不让它直接跳转到成功页面(cartSuccess.jsp),而是经过一下跳转即可
二、修改购物车商品数量
1.
2.Controller
/**
* 修改购物车中商品数量
* @param itemId
* @param num
* @param request
* @param response
* @return
*/
@RequestMapping("/cart/update/num/{itemId}/{num}")
@ResponseBody
public TaotaoResult updateCartItemNum(@PathVariable Long itemId, @PathVariable Integer num,
HttpServletRequest request, HttpServletResponse response){
//1.从cookie中查询出购物车
List<TbItem> list = getCartList(request, response);
//2.遍历购物车
for (TbItem tbItem : list) {
if (tbItem.getId()==itemId.longValue()) {//购物车中的商品id与前端传过来的商品id相同
tbItem.setNum(num);//3.修改购物车中商品数量
list.add(tbItem);//将商品添加到购物车中
break;
}
}
//4.将购物车保存到cookie中,设置生命周期,通常是7天,按秒算
CookieUtils.setCookie(request, response, TT_CART, JsonUtils.objectToJson(list), COOKIE_CART_EXPIRE);
return TaotaoResult.ok();
}
三、删除购物车
1. cart.jsp
2. Controller
/**
* 删除购物车商品
* @param itemId
* @param request
* @param response
* @return
*/
@RequestMapping("/cart/delete/{itemId}")
@ResponseBody
public String deleteCartItem(@PathVariable Long itemId, HttpServletRequest request, HttpServletResponse response){
//1.从cookie中查询出购物车
List<TbItem> list = getCartList(request, response);
//2.遍历购物车
for (TbItem tbItem : list) {
if (tbItem.getId()==itemId.longValue()) {//购物车中的商品id与前端传过来的商品id相同
list.remove(tbItem);//删除购物车中商品
break;
}
}
//4.将购物车保存到cookie中,设置生命周期,通常是7天,按秒算
CookieUtils.setCookie(request, response, TT_CART, JsonUtils.objectToJson(list), COOKIE_CART_EXPIRE);
return "redirect:/cart/cart.html";
}
3. 测试
四、购物车总结
购物车很复杂,但是因为我们时间有限,所以只是简单的用cookie实现了一下。
但是在实际应用中,购物车很复杂,就拿京东来说,购物车会涉及到满减(比如:满500减99等)、京豆(比如:500京豆可以抵30元),这样如果用户买了许多商品,付款后,突然有一,两件商品觉得不好,要退款,这里就麻烦了,是退全部的钱,还是只退优惠后的钱,等等,这里涉及到的逻辑就够复杂的。
其实淘宝就是一套很好的业务逻辑,他们在用户未登陆之前是不能将商品添加到购物车中的,这是商品是添加到cookie中的,在用户登录成功以后,会将商品保存到redis中。
- 在用户未登录情况下写cookie。当用户登录后,访问购物车列表时,
- 把cookie中的数据同步到redis。
- 把cookie中的数据删除
- 展示购物车列表时以redis为准。
- 如果redis中有数据cookie中也有数据,需要做数据合并。相同商品数量相加,不同商品添加一个新商品。
- 如果用户登录状态,展示购物车列表以redis为准。如果未登录,以cookie为准。