商城类网站购物车的实现思路

购物车的思路原理如同去超市买东西,首先要有一个购物车,买过的东西都打包成袋子,一个袋子一个袋子都贴上标签,然后放进购物车中。

两个bean

购物车bean

package com.yinhe.bean;

import java.util.HashMap;

public class Cart {

	private HashMap<String,CartItem> cartItems=new HashMap<String,CartItem>();//如同是打包的小袋子。键值对MAP存的是一个键对应一个CartItem对象
	  
	private double total;//总计

	public HashMap<String, CartItem> getCartItems() {
		return cartItems;
	}

	public void setCartItems(HashMap<String, CartItem> cartItems) {
		this.cartItems = cartItems;
	}

	public double getTotal() {
		return total;
	}

	public void setTotal(double total) {
		this.total = total;
	}
	
	
}
CartItem   bean也就是小袋子

package com.yinhe.bean;

public class CartItem {

	  private Product product;//商品
	  
	  private int buyNum;//个数
	  
	  private double subTotal;//小计

	public Product getProduct() {
		return product;
	}

	public void setProduct(Product product) {
		this.product = product;
	}

	public int getBuyNum() {
		return buyNum;
	}

	public void setBuyNum(int buyNum) {
		this.buyNum = buyNum;
	}

	public double getSubTotal() {
		return subTotal;
	}

	public void setSubTotal(double subTotal) {
		this.subTotal = subTotal;
	}
	  
	  
	  
}

servlet中实现,前台点击购物车,传到下一个页面参数有,商品ID,数量

	public void addProductToCar(HttpServletRequest request,
			HttpServletResponse response) throws IOException{
		String pid = request.getParameter("pid");
		                     //根据pid查询出商品详细内容
		Product product = ps.findProductByPid(pid);
		//获取前台加入购物车的商品数量
		int buyNum = Integer.parseInt(request.getParameter("quantity"));
		//获取购物车
		Cart cart = (Cart) request.getSession().getAttribute("cart");
		//判空如果不判断 则会出现空指针异常
		if (cart == null){
			//新建cart对象 
			cart = new Cart();
		}
		//先判断是否已经购买过了
		if (cart.getCartItems().containsKey(pid)){
			CartItem cartItem = cart.getCartItems().get(pid);
			//修改数量
			cartItem.setBuyNum(cartItem.getBuyNum() + buyNum);
			//修改小计
			cartItem.setSubTotal(cartItem.getSubTotal() + product.getShop_price() * buyNum);
		}else{//购买商品不在购物车中
			//封装carItem对象
			CartItem cartItem = new CartItem();
			cartItem.setProduct(product);
			cartItem.setBuyNum(buyNum);
			cartItem.setSubTotal(cartItem.getProduct().getShop_price() * buyNum);
			cart.getCartItems().put(pid, cartItem);	
		}
		//修改购物车总价
		cart.setTotal(cart.getTotal() + product.getShop_price() * buyNum);
		request.getSession().setAttribute("cart", cart);
		System.out.println("总价:"+cart.getTotal()+","+"map对应的键值对个数"+cart.getCartItems().size());
		response.sendRedirect("/ShopStore/cart.jsp");
	}
前台显示的时候 用c:foreach循环遍历购物车中的商品

<c:forEach var="entry" items="${cart.cartItems}">
<c:set var="carItem" value="${entry.value}"></c:set>
其中${entry.value}该el表达式获取的是CartItem的对象MAP中 每个键中的CartItem对象  

例如 获取商品详细中的商品名字,商品详细的bean对象封装在MAp中,名为product    便可以在foreach中写入el表达式获取:{carItem.product.pname}

获取 个数的话  因为个数没有在product对象中,但是在CartItem的对象MAP中,此时便可以直接使用${carItem.buyNum}进行获取,

若要获取购物车cart中的内容,例如获取总价,因为servlet中已经计算好了总价,并把cart对象存入了session中,便可以直接使用${cart.total}获取 

以下有图可表示购物车的思路关系

猜你喜欢

转载自blog.csdn.net/qq_40100214/article/details/78105311