购物车的思路原理如同去超市买东西,首先要有一个购物车,买过的东西都打包成袋子,一个袋子一个袋子都贴上标签,然后放进购物车中。
两个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}获取
以下有图可表示购物车的思路关系