目录
前言
这里会讲解一开始的jsp混合前后端分离,再到框架实现购物车
jsp混合购物车
https://blog.csdn.net/yzj17025693/article/details/88358112 session部分
基于servlet的前后端分离购物车
bean类
还需要写一个Product类,里面有商品名称,价格,图片路径,pid
其他的字段记得设置get/set方法
还有就是需要购物车类Cart.class,上面只是购物车的购物项CartItem,购物车本体还需要bean类
需要注意的是用list接收购物项,也可以用map接收(后面会讲解区别)
购物车本体
肯定还有本体自带的方法,比如删除,添加
删除方法要注意的就是用迭代器删除
//删除某一个购物项,需要传过来pid
public void removeCartItem(String pid)
{
//遍历list,看每个CartItem上的product上的id是否与传过来的id相同,如果相同,就删除
//删除购物项用不了remove
//在遍历第一个pid时因为符合删除条件,所以将该元素从数组中删除,并且将后一个元素移动
//至当前位置(因为arrylist会动态移动),导致下一次循环遍历时删除那个元素的后一个元素并没有遍历到
//因为删除那个元素的后一个元素已经移到前面去了,所以无法删除
//这个情况应该是用迭代器
Iterator<CartItem>iterator=list.iterator();
while (iterator.hasNext())
{
CartItem cartItem = (CartItem) iterator.next();
if (cartItem.getProduct().getPid().equals(pid))
{
iterator.remove();
}
}
}
//获取总价
public double getTotal()
{
//获取到List或者Map中所有的购物项
for (CartItem cartItem : list)
{
total+=cartItem.getSubTotal();
}
return total;
}
//清空购物车
public void clearCart()
{
list.clear();
}
添加方法
需要注意,不能使用list自带的contains来判断判断是否已经有相同的物品了,因为不能判断对象
需要重写bean类的equals方法,这里我们不重写,直接遍历
public void addCartItemToCart(CartItem cartItem)
{
//根据传过来的cartItem,判断是否已经有相同的物品了,如果有那就数量+1
//但是不能使用list自带的contains来判断判断是否已经有相同的物品了,因为不能判断对象
//需要重写bean类的equals方法,这里我们不重写,直接遍历
//设置变量默认为false,没买过商品
boolean flag=false;
CartItem oldCartItem=null;
for (CartItem cartItem2 : list)
{
if (cartItem2.getProduct().getPid().equals(cartItem.getProduct().getPid()))
{
//如果相等,那就是买过了这个商品
flag=true;
//是相同的商品,则为oldCartItem赋值,
oldCartItem=cartItem2;
}
}
//执行到这一步,如果还是没有相同的商品,那么就把新的购物项加入到list里
if (flag==false)
{
list.add(cartItem);
}else {
//如果是相同的,获取原先的数量,再获取本次的数量,相加后再设置到原购物项上
//因为上面oldCartItem=cartItem2; 所以相当于list里面也改变了
oldCartItem.setNum(oldCartItem.getNum()+cartItem.getNum());
}
}
使用map实现
public void addCartItemToCart2(CartItem cartItem)
{
//获取现在购物车中添加商品的pid
String pidString=cartItem.getProduct().getPid();
//判断是否买过这类商品
if (map.containsKey(pidString))
{
//获取到原先的购物项
CartItem oldCartItem=map.get(pidString);
oldCartItem.setNum(oldCartItem.getNum()+cartItem.getNum());
}else {
//如果没买过这类商品
map.put(pidString, cartItem);
}
}
Cart类的所有方法
新增了getCartItems(获取所有商品)和findObject(填充数据并查找)
public class Cart
{
//用list接收数量不确定的购物车项,还可以用map接收
List<CartItem>list=new ArrayList<CartItem>();
//用map接收数量不确定的购物车项
Map<String, CartItem>map=new HashMap<String, CartItem>();
//所有商品的价格
private double total;
//删除某一个购物项,需要传过来pid
public void removeCartItem(String pid)
{
//遍历list,看每个CartItem上的product上的id是否与传过来的id相同,如果相同,就删除
//删除购物项用不了remove
//在遍历第一个pid时因为符合删除条件,所以将该元素从数组中删除,并且将后一个元素移动
//至当前位置(因为arrylist会动态移动),导致下一次循环遍历时删除那个元素的后一个元素并没有遍历到
//因为删除那个元素的后一个元素已经移到前面去了,所以无法删除
//这个情况应该是用迭代器
Iterator<CartItem>iterator=list.iterator();
while (iterator.hasNext())
{
CartItem cartItem = (CartItem) iterator.next();
if (cartItem.getProduct().getPid().equals(pid))
{
iterator.remove();
}
}
}
//获取总价
public double getTotal()
{
//获取到List或者Map中所有的购物项
for (CartItem cartItem : list)
{
total+=cartItem.getSubTotal();
}
return total;
}
//清空购物车
public void clearCart()
{
list.clear();
}
//添加购物项到购物车
public void addCartItemToCart(CartItem cartItem)
{
//根据传过来的cartItem,判断是否已经有相同的物品了,如果有那就数量+1
//但是不能使用list自带的contains来判断判断是否已经有相同的物品了,因为不能判断对象
//需要重写bean类的equals方法,这里我们不重写,直接遍历
//设置变量默认为false,没买过商品
boolean flag=false;
CartItem oldCartItem=null;
for (CartItem cartItem2 : list)
{
if (cartItem2.getProduct().getPid().equals(cartItem.getProduct().getPid()))
{
//如果相等,那就是买过了这个商品
flag=true;
//是相同的商品,则为oldCartItem赋值,
oldCartItem=cartItem2;
}
}
//执行到这一步,如果还是没有相同的商品,那么就把新的购物项加入到list里
if (flag==false)
{
list.add(cartItem);
}else {
//如果是相同的,获取原先的数量,再获取本次的数量,相加后再设置到原购物项上
//因为上面oldCartItem=cartItem2; 所以相当于list里面也改变了
oldCartItem.setNum(oldCartItem.getNum()+cartItem.getNum());
}
}
public void addCartItemToCart2(CartItem cartItem)
{
//获取现在购物车中添加商品的pid
String pidString=cartItem.getProduct().getPid();
//判断是否买过这类商品
if (map.containsKey(pidString))
{
//获取到原先的购物项
CartItem oldCartItem=map.get(pidString);
oldCartItem.setNum(oldCartItem.getNum()+cartItem.getNum());
}else {
//如果没买过这类商品
map.put(pidString, cartItem);
}
}
//因为不查数据库,我们自己填充product
public Product findObject(String pid)
{
List<Product>products=new ArrayList<Product>();
products.add(new Product("1","苹果",1.3));
products.add(new Product("2","梨子",4.3));
products.add(new Product("3","桃子",5.3));
products.add(new Product("4","笔记本",68.32));
products.add(new Product("5","铅笔",2.32));
products.add(new Product("6","套套",9.32));
for (Product product : products)
{
if (product.getPid().equals(pid))
{
return product;
}
}
return null;
}
//获取所有商品
public Collection getCartItems()
{
return list;
}
}
在servlet里
每点击一次商品就会跳转到购物车,还需要完善,点击去购物车结算才去购物车,不过目前就先这样
public class CartServlet extends BaseServlet
{
//添加购物项到购物车
public String addCartItemToCart(HttpServletRequest request,HttpServletResponse response) throws IOException
{
//从session获取购物车
Cart cart=(Cart) request.getSession().getAttribute("cart");
if (null==cart)
{
//如果获取不到,创建购物车对象放到session中
cart=new Cart();
request.getSession().setAttribute("cart", cart);
}else {
//如果获取到了,获取到商品id,查询商品对象
String pid=request.getParameter("pid");
int num=Integer.parseInt(request.getParameter("num"));
//通过商品id查询商品对象,这个是从数据库查询出来的
// product是我们自己填充的
Product product=cart.findObject(pid);
//获取购物项
CartItem cartItem=new CartItem();
cartItem.setNum(num);
cartItem.setProduct(product);
//调用购物车的方法
cart.addCartItemToCart(cartItem);
//重定向到/jsp/cart.jsp
response.sendRedirect("/cart.jsp");
}
return "/cart.jsp";
}
}
在cart.jsp里
只是简单的展示了下商品
<html>
<head>
</head>
<body>
<c:forEach items="${cart.list}" var="item">
<li>名称:${item.product.name} 数量${item.num}</li> <br/>
</c:forEach>
</body>
</html>