java web 基于servlet的购物车功能

目录

基于servlet的前后端分离购物车

bean类

购物车本体

添加方法

使用map实现

Cart类的所有方法

在servlet里

在cart.jsp里


前言

这里会讲解一开始的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}&nbsp;&nbsp;数量${item.num}</li>	<br/>
	</c:forEach>

  </body>
</html>

猜你喜欢

转载自blog.csdn.net/yzj17025693/article/details/88572259