Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Cookie实现购物车功能

Cookie实现购物车功能

作者头像
晚上没宵夜
发布于 2020-03-10 01:13:45
发布于 2020-03-10 01:13:45
1.9K00
代码可运行
举报
运行总次数:0
代码可运行

  • 这里的购物车暂时存放书,后期把参数改成Object,把方法抽取成接口,只要实现了接口的Object类都可以放进购物项,这样就实现了购物任何物品
  • 使用购物项因为一个购物项可以包含某种商品的数量,总价等,反之则需要把商品重复存放到购物车,没有用户体验
  • 购物车用HashMap,键存放书id,值存放购物项

1. 设计bean

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Book implements Serializable{
    
    //因为对象传输需要实现序列化接口
    //后面代码中id作为Map的键,而键只能为String
    String id;
    String name;
    double price;
    
    public Book(String id, String name, double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Book [id=" + id + ", name=" + name + ", price=" + price + "]";
    }
}

购物项

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class CartItem implements Serializable{
    
    private Book book;
    private int quantity;
    private double price;
    
    public Book getBook() {
        return book;
    }
    public void setBook(Book book) {
        this.book = book;
    }
    public int getQuantity() {
        return quantity;
    }
    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }
    public double getPrice() {
        return book.getPrice() * quantity;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    
    @Override
    public String toString() {
        return "CartItem [book=" + book + ", quantity=" + quantity + ", price=" + price + "]";
    }
}

购物车

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Cart<K, V> implements Serializable{

    //键为书名id,储存实物
    private double totalPrice;
    private HashMap<String,CartItem> bookMap = new HashMap<String, CartItem>();
    
    public void addBook(Book book){
        //从购物车找对应书籍的购物项
        CartItem cartItem = bookMap.get(book.getId());
        //若没有该书的购物项,新建一个
        if(cartItem == null){
            cartItem = new CartItem();
            cartItem.setBook(book);
            cartItem.setQuantity(1);
            bookMap.put(book.getId(), cartItem);
        }else{
            cartItem.setQuantity(cartItem.getQuantity() + 1);
        }
    }
    public void deleteBook(Book book){
        CartItem cartItem = bookMap.get(book.getId());
        if(cartItem == null){
            //do nothing
        }else if(cartItem.getQuantity() == 1){
            bookMap.remove(book.getId());
        }else{
            cartItem.setQuantity(cartItem.getQuantity() - 1);
        }
    }
    public double getPrice(){
        //遍历购物车里的购物项
        for(Map.Entry set : bookMap.entrySet()){
            //String bookId = (String) set.getKey();
            CartItem cartItem = (CartItem) set.getValue();
            totalPrice += cartItem.getPrice();
        }
        return totalPrice;
    }

    public HashMap<String, CartItem> getBookMap() {
        return bookMap;
    }
    public void setBookMap(HashMap<String, CartItem> bookMap) {
        this.bookMap = bookMap;
    }
    public double getTotalPrice() {
        return totalPrice;
    }
    public void setTotalPrice(double totalPrice) {
        this.totalPrice = totalPrice;
    }
}

2. 购物车序列化存放到Cookie

2.1 模仿购物车添加商品
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//往购物车添加书本
Cart cart = new Cart();
cart.addBook(new Book("1","且听风吟",10.5f));
cart.addBook(new Book("1","且听风吟",10.5f));
cart.addBook(new Book("1","且听风吟",10.5f));
cart.addBook(new Book("2","我们仨",5.5f));
cart.deleteBook(new Book("1","且听风吟",10.5f));
cart.deleteBook(new Book("2","我们仨",5.5f));
cart.deleteBook(new Book("3","解忧杂货店",20.5f));
2.2 购车从序列化存入Cookie
  • 其中Cookie不能有[ ] ( ) = , " / ? @ : ;特殊字符,需要URL编码
  • ByteArrayOutputStream.toString()把字节数组内容转化成字符串
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//  -----------------------------购物车对象序列化------------------------[开始]
ByteArrayOutputStream bos= new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(cart);
String objectString = URLEncoder.encode(bos.toString("ISO-8859-1"),"UTF-8");
//  -----------------------------购物车对象序列化------------------------[完]    

//  -----------------------------给客户端添加cookie------------------------[开始]
response.setContentType("text/html;charset=UTF-8");
Cookie cookie = new Cookie("name", objectString);
cookie.setMaxAge(1000);
response.addCookie(cookie);
//  -----------------------------给客户端添加cookie------------------------[完]

3. 服务器读取Cookie

  • 遍历所有Cookie,找到Cart
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Cookie[] cookies = request.getCookies();
if(cookies != null){
    for(Cookie cookieLoop : cookies){
        String name = cookieLoop.getName();
        String value = URLDecoder.decode(cookieLoop.getValue(), "UTF-8");
        if(name == "Cart"){
            ByteArrayInputStream bis = new ByteArrayInputStream(value.getBytes("ISO-8859-1"));
            ObjectInputStream ois = new ObjectInputStream(bis);
            try {
                Cart cart1 = (Cart) ois.readObject();
                HashMap cartMap = cart1.getBookMap();
                for(Object cartItem : cartMap.values()){
                    //遍历购物项并打印
                    System.out.println(cartItem.toString());
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
}

4. 测试结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CartItem [book=Book [id=1, name=且听风吟, price=10.5], quantity=2, price=0.0]
<!-- 剩下且听风吟 * 2 -->
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-12-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
购物车案例【简单版】
前言 为了巩固MVC的开发模式,下面就写一个购物车的小案例.. ①构建开发环境 导入需要用到的开发包 建立程序开发包 ②设计实体 书籍实体 public class Book {
Java3y
2018/03/16
2.7K0
购物车案例【简单版】
加入购物车怎么操作_买家加入购物车不买怎么办
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/166633.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/19
7880
加入购物车怎么操作_买家加入购物车不买怎么办
图书管理系统【用户、购买、订单模块、添加权限】
用户模块 要登陆后才能购买,因此我们先写购买模块. 设计实体 private String id; private String username; private String password; private String email; private String cellphone; private String address; //各种setter、getter 设计数据库表 CREATE TABLE user ( id
Java3y
2018/03/15
3.8K0
图书管理系统【用户、购买、订单模块、添加权限】
移动商城第七篇【购物车增删改查、提交订单】
把商品加入购物车 接下来我们要做的就是将商品加入到购物车中。我们这次使用的是Cookie来将用户的信息存储起来。那为什么要用cookie呢?? 如果将购物车存储在Session,那么Session里边的值容易丢失。 存储在Cookie中,用户不需要登陆就能够查看得到购物车的数据。 那我们现在决定将购物车存储在Cookie中了,那Cookie中保存的是怎么样的字符串数据呢??? 显而易见我们第一时间想到的就是JSON JSON能够很好地将字符串转成Java对象,将Java对象转成JSON给浏览器进行显示! 看
Java3y
2018/04/02
4K0
移动商城第七篇【购物车增删改查、提交订单】
jsp电子商务购物车之四 数据库存储篇
为了方便用户下次登录,仍然可以看到自己的购物车内容,所以,需要在数据库存储相应的购物车项目,本处增加购物车项表;uid和bid是复合主键。
张哥编程
2024/12/17
2330
jsp电子商务购物车之四 数据库存储篇
购物车的实现(jsp的session+Java的Map的结合)
1:电商如此发达的现在,作为一个web开发程序猿,如果不会写购物车,真是有点不好意思找工作。所以抓紧练习啊,从上篇博客中抽离出如何实现购物车的功能。 2:首先需要理解购物车实现的一些基本步骤。   2
别先生
2018/01/02
5.1K1
购物车的实现(jsp的session+Java的Map的结合)
【第十七篇】商城系统-购物车功能设计
  Nginx接收了 cart.msb.com这个域名的访问,那么会把服务反向代理给网关服务,这时网关服务就需要把该请求路由到购物车服务中。我们需要修改网关服务的配置
用户4919348
2022/10/04
8670
【第十七篇】商城系统-购物车功能设计
【畅购商城】购物车模块之添加购物车
步骤二:修改Goods.vue,给“加入购物车”绑定点击事件 addToCartFn
陶然同学
2023/02/24
2.5K0
【畅购商城】购物车模块之添加购物车
谷粒商城-高级篇(购物车)
​ 参考京东,在点击购物车时,会为临时用户生成一个name为user-key的cookie临时标识,过期时间为一个月,如果手动清除user-key,那么临时购物车的购物项也被清除,所以 user-key 是用来标识和存储临时购物车数据的
OY
2022/03/20
7360
谷粒商城-高级篇(购物车)
深入解析Java中如何用Redis存储购物车信息:原理与实战案例
咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~
bug菌
2024/10/24
3850
深入解析Java中如何用Redis存储购物车信息:原理与实战案例
电商---实现购物车功能
优点:不占用服务器资源,可以永远保存,不用考虑失效的问题 缺点: 对购买商品的数量是有限制的,存放数据的大小 不可以超过2k,用户如果禁用cookie那么就木有办法购买商品,卓越网实现了用户当用户禁用cookie,也可以购买。
周小董
2019/03/25
1.9K0
商城业务:购物车
- 用户可以在未登录状态下将商品添加到购物车【游客购物车/离线购物车/临时购物车】
一个风轻云淡
2023/10/15
3700
商城业务:购物车
【Vue H5项目实战】从0到1的肯德基点餐系统—— 商品与购物车逻辑设计(Vue3.2 + Vite + TS + Vant + Pinia + Nodejs
文章链接:https://cloud.tencent.com/developer/article/2473693
中杯可乐多加冰
2024/12/04
3140
购物车的原理以及实现
  今天模拟京东的购物车实现原理完成了购物车模块的开发, 给大家分享下。 京东的购物车实现原理:在用户登录和不登录的状态下对购物车存入cookie还是持久化到redis中的实现。下面就来具体说次购物车的实现过程 两种情况: 用户登录,购物车存入redis中 用户未登录,购物车存入cookie中 比较两种方式的优缺点:  cookie:优点:数据保存在用户浏览器中,不占用服务端内存;用户体检效果好;代码实现简单      缺点:cookie的存储空间只有4k;更换设备时,购物车信息不能同步;cookie禁用,
用户2146856
2018/05/18
2.5K0
Go 语言代码简单的在线购物平台:
这个代码示例实现了一个简单的在线购物平台,包括用户、产品、购物车和订单的结构体,以及添加用户、产品、创建购物车、添加产品到购物车、提交订单和显示订单的方法。示例中展示了用户在购物平台上选购产品、添加到购物车、提交订单,并打印出订单的详情。希望这个示例能够对您提供一些参考!如果您还有其他问题,请随时提问。
青灯古酒
2023/10/16
3430
学习PetShop3.0(4)购物车
终于到购物车了,在看这个之前应该已经明白了第三篇的那个模型,这样购物车基本也就明白了。 来看一下ShoppingCart.aspx这个页。 当你看好了一个宠物,比如可爱的Golden Retriever,嘿嘿,那就点add to cart按钮,这时就会跳到ShoppingCart.aspx,url里带了这个宠物的id号,根据该id号程序将该宠物放到cart里面。然后你可以再去挑别的宠物,比如一只猫(……),虽然这不是什么好主意。然后该宠物的id号又会被传到ShoppingCart.aspx,并添加到cart里面。在ShoppingCart.aspx里,你可以更改想要领养的宠物的数量,然后程序会根据你要求的数量来计算所需的钱以及该宠物是否还有剩余。在你做出决定后可以点proceed to checkout进入定单生成的环节。 上面是大体的流程。下面来看.net petshop是怎么实现这个cart的 基本的实现主要是BLL里的Cart和Model里的CartItemInfo,而Web.ProcessFlow的CartControler则负责具体的实现。想一想第三篇里的那个模型,具体到这里,每挑选一个宠物,就有一个CartItemInfo通过CartControler添加到了保存在Session里的Cart里面,最后生成定单的时候就从Session里把Cart的值取出来(CartControler有生成定单的方法,下一篇再说)。 来看一下ShoppingCart.aspx.cs里向Cart添加CartItemInfo的代码 // Create an instance of the cart controller ProcessFlow.CartController cartController = new ProcessFlow.CartController();
全栈程序员站长
2022/11/03
2560
商城项目-已登录购物车
购物车系统只负责登录状态的购物车处理,因此需要添加登录校验,我们通过JWT鉴权即可实现。
cwl_java
2020/01/14
9811
商城项目-已登录购物车
干掉 “重复代码” 的技巧有哪些
软件工程师和码农最大的区别就是平时写代码时习惯问题,码农很喜欢写重复代码而软件工程师会利用各种技巧去干掉重复的冗余代码。
每周聚焦
2023/01/03
5010
购物车设计与实现
购物车是电商项目常用的功能,传统的做法可以使用关系型数据库,比如mysql来处理。但在实际使用中,由于购物车的数据量太大,而且修改频繁,会导致数据库的压力增加,所以一般不会直接使用关系型数据库来存储购物车信息。
用户3467126
2022/04/28
1.9K0
购物车设计与实现
jsp电子商务 购物车实现之三 购物车
在该Servlet中利用了session进行存放值,就是开篇我们的方法之一,但是这种方法有什么问题呢?大家好好思考下!!!
张哥编程
2024/12/17
3040
推荐阅读
相关推荐
购物车案例【简单版】
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验