如图
为什么不能存在session中 ————>因为session生命周期太短,浏览器关闭数据就消失了,应该存在cookie中
应为在本地浏览器中不要求用户
把什么存到cookie中的问题-->这里使用商品的ID
要把sku_id 和购买的数量 存到cookie中
例如:格式[{skuid:1001,quantity:3},{skuid:1002,quantity:1}]
购物车数据加一:先要判断库存,库存足够才能加一
购物车数据减一:如果当前数量是一直接删除,不是也要判断库存是否足够
代码的实现
创建模型类
EbCart.java
public class EbCart {
private Long skuId; //商品号
private Integer quantity;//数量 使用的时候用以上俩 查询的时候全部查出
private EbSku sku; //规格
get/set方法
}
EbSKu.java
模型类
private EbItem item;
get/set 方法
EbCartController.java
package com.rl.controller;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.rl.model.EbCart;
import com.rl.model.EbShipAddr;
import com.rl.model.EbSku;
import com.rl.model.TsPtlUser;
import com.rl.service.EbCartService;
import com.rl.service.EbShipAddrService;
import com.rl.service.EbSkuService;
@Controller
@RequestMapping("/cart")
public class EbCartController {
@Autowired
EbCartService cartService;
@Autowired
EbSkuService skuService;
@Autowired
EbShipAddrService addrService;
@RequestMapping("/listCart.do")
public String listCart(HttpServletRequest request, HttpServletResponse response, Model model){
List<EbCart> cartList = cartService.listCart(request, response);
model.addAttribute("cartList", cartList);
Integer itemNum = 0;
BigDecimal bd = new BigDecimal(0);
for(EbCart cart :cartList){
itemNum = itemNum + cart.getQuantity();
bd = bd.add(cart.getSku().getSkuPrice().multiply(new BigDecimal(cart.getQuantity())));
}
model.addAttribute("itemNum", itemNum);
model.addAttribute("totalPrice", bd);
return "shop/car";
}
@RequestMapping("/removeCart.do")
public String removeCart(HttpServletRequest request, HttpServletResponse response, Long skuId){
cartService.removeCart(request, response, skuId);
return "redirect:listCart.do";
}
/**
* 添加购物车
*/
@RequestMapping("/addCart.do")
public void addCart(Long skuId, Integer quantity, HttpServletRequest request, HttpServletResponse response, PrintWriter out){
cartService.addCart(request, response, skuId, quantity);
out.write("success");
}
/**
* 验证库存
*/
@RequestMapping("/validStockByQuantity.do")
public void validStockByQuantity(Long skuId, Integer quantity, PrintWriter out){
EbSku sku = skuService.selectSkuById(skuId);
String flag = "yes";
if(sku.getStockInventory() < quantity){
flag = "no";
}
out.write(flag);
}
@RequestMapping("/validStockCart.do")
public void validStockCart(HttpServletRequest request, HttpServletResponse response) throws Exception{
String tip = cartService.validStockCart(request, response);
JSONObject jo = new JSONObject();
if(tip == null){
jo.accumulate("isHave", "yes");
}else{
jo.accumulate("isHave", "no");
}
jo.accumulate("tip", tip);
//{isHave:yes, tip:null}
String result = jo.toString();
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write(result);
}
@RequestMapping("/toSubmitOrder.do")
public String toSubmitOrder( HttpServletRequest request, HttpServletResponse response,HttpSession session, Model model){
TsPtlUser user = (TsPtlUser) session.getAttribute("user");
List<EbShipAddr> addrList = new ArrayList<EbShipAddr>();
if(user != null){
addrList = addrService.selectAddrByUserId(user.getPtlUserId());
}else{
return "redirect:/user/toLogin.do";
}
model.addAttribute("addrList", addrList);
List<EbCart> cartList = cartService.listCart(request, response);
model.addAttribute("cartList", cartList);
Integer itemNum = 0;
BigDecimal bd = new BigDecimal(0);
for(EbCart cart :cartList){
itemNum = itemNum + cart.getQuantity();
bd = bd.add(cart.getSku().getSkuPrice().multiply(new BigDecimal(cart.getQuantity())));
}
model.addAttribute("itemNum", itemNum);
model.addAttribute("totalPrice", bd);
return "shop/confirmProductCase";
}
}
EbCartService.java
package com.rl.service;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.rl.model.EbCart;
public interface EbCartService {
public void addCart(HttpServletRequest request, HttpServletResponse response,Long skuId, Integer quantity);
public void removeCart(HttpServletRequest request, HttpServletResponse response,Long skuId);
/**
* 购物车数量加一
* @param request
* @param response
* @param skuId
*/
public void addNum(HttpServletRequest request, HttpServletResponse response,Long skuId);
/**
* 购物车数量减一
* @param request
* @param response
* @param skuId
*/
public void reduceNum(HttpServletRequest request, HttpServletResponse response,Long skuId);
/**
* 查询购物车数据
* @param request
* @param response
* @return
*/
public List<EbCart> listCart(HttpServletRequest request, HttpServletResponse response);
/**
* 清空购物车
* @param request
* @param response
*/
public void clearCart(HttpServletRequest request, HttpServletResponse response);
/**
* 验证购物车的库存
* @param request
* @param response
*/
public String validStockCart(HttpServletRequest request, HttpServletResponse response);
}
EbCartServiceImpl.java 实现类
package com.rl.service.impl;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONArray;
import net.sf.json.JSONSerializer;
import net.sf.json.JsonConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.rl.dao.EbSkuDao;
import com.rl.model.EbCart;
import com.rl.model.EbSku;
import com.rl.service.EbCartService;
import com.rl.util.Constants;
@Service
public class EbCartServiceImpl implements EbCartService {
@Autowired
private EbSkuDao skuDao;
/**
* 第一种:购物车没有当前要添加的数据,直接添加即可
* 第二种:购物车已经存在要添加的数据,数量做累加
*
*/
public void addCart(HttpServletRequest request,
HttpServletResponse response, Long skuId, Integer quantity) {
//创建JSON的配置对象
JsonConfig jc = new JsonConfig();
jc.setRootClass(EbCart.class);
//设置不操作的属性
String [] excludes = {"sku"};
jc.setExcludes(excludes);
List<EbCart> cartList = new ArrayList<EbCart>();
//获得到本地的所有cookie
Cookie[] cookies = request.getCookies();
if(cookies != null && cookies.length > 0){
for(Cookie cookie : cookies){
//获得cookie的名字
String cookieName = cookie.getName();
if(Constants.ecps_cookie.equals(cookieName)){
//获得cookie数据
String cookieValue = cookie.getValue();
//解码[{skuId:1001, quantity:3},{skuId:1003,quantity:2},...]
cookieValue = URLDecoder.decode(cookieValue);
//把JSON字符串转换成JSON的数组
JSONArray ja = JSONArray.fromObject(cookieValue);
//把JSON对象转换成java对象
cartList = (List<EbCart>) JSONSerializer.toJava(ja, jc);
//设置一个标志,用来查看在原有的cookie是否存在当前添加的sku
boolean isHave = false;
for(EbCart cart : cartList){
if(cart.getSkuId().longValue() == skuId.longValue()){
cart.setQuantity(cart.getQuantity()+quantity);
isHave = true;
break;
}
}
if(!isHave){
EbCart cart = new EbCart();
cart.setSkuId(skuId);
cart.setQuantity(quantity);
cartList.add(cart);
}
}
}
}
if(cartList.size() == 0){
EbCart cart = new EbCart();
cart.setSkuId(skuId);
cart.setQuantity(quantity);
cartList.add(cart);
}
//把cartList转换成JSON的数组对象
JSONArray ja = JSONArray.fromObject(cartList, jc);
//把JSON数组转换成字符串
String cookieValue = ja.toString();
//把字符串编码
cookieValue = URLEncoder.encode(cookieValue);
//创建cookie对象
Cookie cookie = new Cookie(Constants.ecps_cookie, cookieValue);
cookie.setMaxAge(Integer.MAX_VALUE);
cookie.setPath("/");
response.addCookie(cookie);
}
public void removeCart(HttpServletRequest request,
HttpServletResponse response, Long skuId) {
//创建JSON的配置对象
JsonConfig jc = new JsonConfig();
jc.setRootClass(EbCart.class);
//设置不操作的属性
String [] excludes = {"sku"};
jc.setExcludes(excludes);
List<EbCart> cartList = new ArrayList<EbCart>();
//获得到本地的所有cookie
Cookie[] cookies = request.getCookies();
if(cookies != null && cookies.length > 0){
for(Cookie cookie : cookies){
//获得cookie的名字
String cookieName = cookie.getName();
if(Constants.ecps_cookie.equals(cookieName)){
//获得cookie数据
String cookieValue = cookie.getValue();
//解码[{skuId:1001, quantity:3},{skuId:1003,quantity:2},...]
cookieValue = URLDecoder.decode(cookieValue);
//把JSON字符串转换成JSON的数组
JSONArray ja = JSONArray.fromObject(cookieValue);
//把JSON对象转换成java对象
cartList = (List<EbCart>) JSONSerializer.toJava(ja, jc);
//设置一个标志,用来查看在原有的cookie是否存在当前添加的sku
boolean isHave = false;
for(EbCart cart : cartList){
if(cart.getSkuId().longValue() == skuId.longValue()){
cartList.remove(cart);
break;
}
}
}
}
}
//把cartList转换成JSON的数组对象
JSONArray ja = JSONArray.fromObject(cartList, jc);
//把JSON数组转换成字符串
String cookieValue = ja.toString();
//把字符串编码
cookieValue = URLEncoder.encode(cookieValue);
//创建cookie对象
Cookie cookie = new Cookie(Constants.ecps_cookie, cookieValue);
cookie.setMaxAge(Integer.MAX_VALUE);
cookie.setPath("/");
response.addCookie(cookie);
}
public void addNum(HttpServletRequest request,
HttpServletResponse response, Long skuId) {
// TODO Auto-generated method stub
}
public void reduceNum(HttpServletRequest request,
HttpServletResponse response, Long skuId) {
// TODO Auto-generated method stub
}
public List<EbCart> listCart(HttpServletRequest request,
HttpServletResponse response) {
//创建JSON的配置对象
JsonConfig jc = new JsonConfig();
jc.setRootClass(EbCart.class);
//设置不操作的属性
String [] excludes = {"sku"};
jc.setExcludes(excludes);
List<EbCart> cartList = new ArrayList<EbCart>();
//获得到本地的所有cookie
Cookie[] cookies = request.getCookies();
if(cookies != null && cookies.length > 0){
for(Cookie cookie : cookies){
//获得cookie的名字
String cookieName = cookie.getName();
if(Constants.ecps_cookie.equals(cookieName)){
//获得cookie数据
String cookieValue = cookie.getValue();
//解码[{skuId:1001, quantity:3},{skuId:1003,quantity:2},...]
cookieValue = URLDecoder.decode(cookieValue);
//把JSON字符串转换成JSON的数组
JSONArray ja = JSONArray.fromObject(cookieValue);
//把JSON对象转换成java对象
cartList = (List<EbCart>) JSONSerializer.toJava(ja, jc);
for(EbCart cart : cartList){
EbSku sku = skuDao.selectSkuAndItemById(cart.getSkuId());
cart.setSku(sku);
}
}
}
}
return cartList;
}
public void clearCart(HttpServletRequest request,
HttpServletResponse response) {
//创建JSON的配置对象
JsonConfig jc = new JsonConfig();
jc.setRootClass(EbCart.class);
//设置不操作的属性
String [] excludes = {"sku"};
jc.setExcludes(excludes);
List<EbCart> cartList = new ArrayList<EbCart>();
//获得到本地的所有cookie
Cookie[] cookies = request.getCookies();
if(cookies != null && cookies.length > 0){
for(Cookie cookie : cookies){
//获得cookie的名字
String cookieName = cookie.getName();
if(Constants.ecps_cookie.equals(cookieName)){
//获得cookie数据
String cookieValue = cookie.getValue();
//解码[{skuId:1001, quantity:3},{skuId:1003,quantity:2},...]
cookieValue = URLDecoder.decode(cookieValue);
//把JSON字符串转换成JSON的数组
JSONArray ja = JSONArray.fromObject(cookieValue);
//把JSON对象转换成java对象
cartList = (List<EbCart>) JSONSerializer.toJava(ja, jc);
cartList.clear();
}
}
}
//把cartList转换成JSON的数组对象
JSONArray ja = JSONArray.fromObject(cartList, jc);
//把JSON数组转换成字符串
String cookieValue = ja.toString();
//把字符串编码
cookieValue = URLEncoder.encode(cookieValue);
//创建cookie对象
Cookie cookie = new Cookie(Constants.ecps_cookie, cookieValue);
cookie.setMaxAge(Integer.MAX_VALUE);
cookie.setPath("/");
response.addCookie(cookie);
}
public String validStockCart(HttpServletRequest request,
HttpServletResponse response) {
String tip = null;
//创建JSON的配置对象
JsonConfig jc = new JsonConfig();
jc.setRootClass(EbCart.class);
//设置不操作的属性
String [] excludes = {"sku"};
jc.setExcludes(excludes);
List<EbCart> cartList = new ArrayList<EbCart>();
//获得到本地的所有cookie
Cookie[] cookies = request.getCookies();
if(cookies != null && cookies.length > 0){
for(Cookie cookie : cookies){
//获得cookie的名字
String cookieName = cookie.getName();
if(Constants.ecps_cookie.equals(cookieName)){
//获得cookie数据
String cookieValue = cookie.getValue();
//解码[{skuId:1001, quantity:3},{skuId:1003,quantity:2},...]
cookieValue = URLDecoder.decode(cookieValue);
//把JSON字符串转换成JSON的数组
JSONArray ja = JSONArray.fromObject(cookieValue);
//把JSON对象转换成java对象
cartList = (List<EbCart>) JSONSerializer.toJava(ja, jc);
for(EbCart cart : cartList){
EbSku sku = skuDao.selectSkuAndItemById(cart.getSkuId());
if(sku != null && sku.getStockInventory().intValue() < cart.getQuantity().intValue()){
tip = sku.getItem().getItemName()+"库存不足";
break;
}
}
}
}
}
return tip;
}
}
定义一个工具类
Constants.java
package com.rl.util;
public interface Constants {
/**
* 图片服务器的主机路径
*/
public static final String image_path = "http://localhost:8088/ecps-image/";
public static final String ws_pass = "12345";
/**
* 商城cookie的名字
*/
public static final String ecps_cookie = "ecps_cookie";
}