Java Web 网络商城案例演示十三(抽取购物车模块,实现购物车功能)

}

public void setSubTotal(double subTotal) {

this.subTotal = subTotal;

}

public CartItem() {

// TODO Auto-generated constructor stub

}

public CartItem(Product product, int num, double subTotal) {

super();

this.product = product;

this.num = num;

this.subTotal = subTotal;

}

@Override

public String toString() {

return “CartItem [product=” + product + “, num=” + num + “, subTotal=” + subTotal + “]”;

}

}

抽取购物车Cart

Cart (map类型)

package cn.itzheng.store.domain;

//2个属性3个方法

public class Cart {

// 总计/积分

private double total = 0;

// 个数不确定的购物项 键商品的pid《=====》cartItem

Map<String, CartItem> map = new HashMap<String, CartItem>();

// 添加购物项到购物车

// 当用户点击加入购物车按钮,可以将当前要购买的商品和商品的id和商品的数量发送到服务端,服务端根据商品的id查询到商品的信息

// 有了商品的信息Product对象,有了要购买商品的数量,当前的购物项也就可以获取到了

public void addCartItemToCar(CartItem cartItem) {

// 获取到从前端购物车传入的cartIte对象当中的的Product对象当中Pid对象

String pid = cartItem.getProduct().getPid();

// 将当前购物项加入购物车之前,判断之前是否买过这类商品

// 如果没有买过 list.add();

// 如果买过:获取到原先的数量,获取到本次的数量,相加之后设置到原先购物项上

if (map.containsKey(pid)) {// 查看当前map集合当中有没有和传递进来的pid相同的key

// 获取到原先的购物项

CartItem oldItem = map.get(pid);

oldItem.setNum(oldItem.getNum() + cartItem.getNum());

} else {

// 如果没有对应的key对应pid的话说明之前没有商品

map.put(pid, cartItem);// 将该商品放入到map对象集合当中

}

}

// 移除购物项

public void removeCartItem(String pid) {

map.remove(pid);

}

// 用户点击移除购物项的链接的时候,可以将当前的的购物类别的商品的id发送到服务端

// 清空购物车

public void clearCart() {

map.clear();

}

// 总计是可以经过计算获取到

public double getTotal() {

//向让总计清零

total=0;

// 获取到Map集合中所有的购物项

Collection values = map.values();

// 遍历所有的购物项,将购物项上的小计相加

for (CartItem cartItem : values) {

total += cartItem.getSubTotal();

}

return total;// 返回的是所有价格的总和

}

public void setTotal(double total) {

this.total = total;

}

public Map<String, CartItem> getMap() {

return map;

}

public void setMap(Map<String, CartItem> map) {

this.map = map;

}

}

Cart (list类型)

//2个属性3个方法

public class Cart02 {

// 总计/积分

private double total;

//个数不确定的购物项

private List list = new ArrayList();

// 添加购物项到购物车

// 当用户点击加入购物车按钮,可以将当前要购买的商品和商品的id和商品的数量发送到服务端,服务端根据商品的id查询到商品的信息

// 有了商品的信息Product对象,有了要购买商品的数量,当前的购物项也就可以获取到了

public void addCartItemToCart(CartItem cartItem) {

// 将当前的购物项加入购物车之前,判断之前是否买过这一类商品

// 如果没有买过 list.add(cartItem);//将相应商品对应的类放入到集合当中

// 如果买过:获取到原先的数量,获取到本次的要购买的数量,相加之后再设置到原先的购物项上

// 设置变量,默认为false,没有购买过商品

boolean flag = false;

//存储原先购物项

CartItem old = null;

//遍历的是已经存在的商品的list集合

for (CartItem cartItem2 : list) {// 遍历list集合当中的CartItem对象

//判断传入的CartItem的product当中pid和之前list当中CartItem的product当中的pid是否相同

if (cartItem2.getProduct().getPid().equals(cartItem.getProduct().getPid())) {

flag=true;

//如果相等说明之前有这个旧商品赋值给对应的商品赋值给CartItem old

old=cartItem2;

}

}

//如果flag是false的话,说明没有与之前list集合当中对象的pid重复的就直接将传入进来的商品项传入到

if(flag == false) {//之前没有这个商品

list.add(cartItem);//将新的商品添加到旧商品的list集合当中

}else {//之前有这个商品

//获取到原先的数量和现在的数量

old.setNum(old.getNum()+cartItem.getNum());//获取到原先该商品的数量加上

}

}

// 移除购物项

// 用户点击移除购物项的链接的时候,可以将当前的的购物类别的商品的id发送到服务端

public void removeCartItem(String pid) {

// 遍历List,看每个CartItem上的product对象上的id是否和服务端获取到的pid相等,如果相等,删除当前的购物项

for (CartItem cartItem : list) {

if (cartItem.getProduct().getPid().equals(pid)) {

// 删除当前的cartItem

// 直接调用list.remove(cartItem); 无法删除当前的cartItem,需要通过迭代器来删除当前的购物项

}

}

}

// 清空购物车

public void clearCart() {

list.clear();// 将list集合当中的数据全部清空

}

}

二、将商品添加到购物车


1、购物车内存分析

在这里插入图片描述

2、添加购物项到购物车的原理分析

在这里插入图片描述

3、步骤实现

1、准备工作

/jsp/product_list.jsp 修改链接

在这里插入图片描述

/jsp/product_info.jsp

创建一个from表单,设置from method,action的各自属性

在这里插入图片描述

设置隐藏域,通过隐藏域向服务器端传递商品的pid

在这里插入图片描述

通过js的方式提交表单(如果一个表单当中有多个按钮可以实现不同的按钮向不同的地方提交信息)

javascript:void(0)取消链接默认行为

在这里插入图片描述

加入购物车的功能

在这里插入图片描述

三、功能实现


1、添加商品到购物车

1、创建CartServlet

public class CartServlet extends BaseServlet {

// 添加购物项到购物车

public String addCartItemToCart(HttpServletRequest request, HttpServletResponse response) throws Exception {

// 从session当中获取购物车

Cart cart = (Cart) request.getSession().getAttribute(“cart”);

if (cart == null) {

// 如果获取不到,创建购物车对象,放置到session当中

cart = new Cart();

request.getSession().setAttribute(“cart”, cart);

}

// 如果从session当中获取到cart,使用即可

// 获取到页面点击加入购物车按钮商品的id,数量

String pid = request.getParameter(“pid”);// 获取表单提交的pid

int num = Integer.parseInt(request.getParameter(“quantity”));// 获取表单提交的商品数量

// 通过商品id查询商品对象

ProductService productService = new ProductServiceImpl();

Product product = productService.findProductByPid(pid);

// 获取到待购买的购物项

CartItem cartItem = new CartItem();

cartItem.setNum(num);

cartItem.setProduct(product);

//调用购物车上的方法 ,将查询到商品对象放入到购物车当中

cart.addCartItemToCar(cartItem);

//重定向到购物车界面

response.sendRedirect(“/store_v5/jsp/cart.jsp”);

return null;

}

}

2、/jsp/cart.jsp 获取购物车上的商品信息

cart.cartItems获取对应方法返回的map集合的内容

//判断map集合当中是否有对应的值,现在是判断没有的话

<c:if test=“${empty cart.cartItems }”>

//判断map有对应的值的情况

<c:if test=“${not empty cart.cartItems }”>

<c:forEach items=“${cart.cartItems }” var=“item”>

在这里插入图片描述

在这里插入图片描述

代码详情如下

<%@ page language=“java” contentType=“text/html; charset=UTF-8”

pageEncoding=“UTF-8”%>

<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>

<!doctype html>

购物车

href=“${pageContext.request.contextPath}/css/bootstrap.min.css”

type=“text/css” />

href=“${pageContext.request.contextPath}/css/style.css” type=“text/css” />

<%@ include file=“/jsp/header.jsp”%>

<c:if test=“${empty cart.cartItems }”>

开启剁手模式

</c:if>

<c:if test=“${not empty cart.cartItems }”>

订单详情

图片 商品 价格 数量 小计 操作

<c:forEach items=“${cart.cartItems }” var=“item”>

value=“22”> <img

src=“ p a g e C o n t e x t . r e q u e s t . c o n t e x t P a t h / {pageContext.request.contextPath}/ pageContext.request.contextPath/{item.product.pimage}”

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

<img

src=“ p a g e C o n t e x t . r e q u e s t . c o n t e x t P a t h / {pageContext.request.contextPath}/ pageContext.request.contextPath/{item.product.pimage}”

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-VvMcodib-1714872522392)]

[外链图片转存中…(img-ZMh16SVv-1714872522392)]

[外链图片转存中…(img-D9va52jL-1714872522393)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值