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

1. 设计bean

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 + "]";
}
}

购物项

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 + "]";
}
}

购物车

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 模仿购物车添加商品

//往购物车添加书本
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()把字节数组内容转化成字符串
//	-----------------------------购物车对象序列化------------------------[开始]
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
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. 测试结果

CartItem [book=Book [id=1, name=且听风吟, price=10.5], quantity=2, price=0.0]
<!-- 剩下且听风吟 * 2 -->

Cookie实现购物车功能的更多相关文章

  1. 【JSP】Cookie的使用及保存中文,并用Cookie实现购物车功能

    Cookie是服务器存放在客户端的一些数据,比如密码,以及你曾经访问过的一些数据. 设置Cookie //设置cookie Cookie cookie = new Cookie("TOM&q ...

  2. javaweb学习——session和Cookie实现购物车功能

    1.创建Book类,实现对图书信息的封装. package cn.it.sessionDemo.example1; import java.io.Serializable; /** * 该类实现对图书 ...

  3. 工作任务:模拟淘宝登录和购物车功能:使用cookie记录登录名,下次登录时能够记得上次的登录名,使用cookie模拟购物车功能,使用session记住登录信息并验证是否登录,防止利用url打开网站,并实现退出登录功能

    登入界面<% Cookie[] cks =request.getCookies(); String str=null; for(Cookie ck:cks) { if(ck.getName(). ...

  4. 模拟淘宝登录和购物车功能:使用cookie记录登录名,下次登录时能够记得上次的登录名,使用cookie模拟购物车功能,使用session记住登录信息并验证是否登录,防止利用url打开网站,并实现退出登录功能

    Login <%@ page language="java" contentType="text/html; charset=UTF-8" pageEnc ...

  5. ASP.NET之电子商务系统开发-2(购物车功能)

    一.前言 继上次的首页数据列表后,这是第二篇.记录一下购物车这个比较庞大的功能,可能实现的方法跟其他人有点不一样,不过原理都差不多,是将cookie存数据库里面的. 二.开始 首先看一下购物车流程及对 ...

  6. java web开发_购物车功能实现

    java web开发_购物车功能实现 之前没有接触过购物车的东东,也不知道购物车应该怎么做,所以在查询了很多资料,总结一下购物车的功能实现. 查询的资料,找到三种方法: 1.用cookie实现购物车: ...

  7. Session原理、生命周期及购物车功能的实现

    在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据(保存该浏览器(会话)的相关信息)时 ...

  8. Android 购物车功能的实现

    首先,众所周知,ListView是Android最常用的控件,可以说是最简单的控件,也可以说是最复杂的控件. 作为一个Android初级开发者,可能会简单的ListView展示图文信息. 作为一个有一 ...

  9. 给destoon商城的列表中和首页添加购物车功能

    如何给destoon商城的列表中和首页添加购物车功能? 目前加入购物车的功能只存在商城的详细页面里,有时候我们需要批量购买的时候,希望在列表页就能够使用这个加入购物车的功能. 修改步骤见下: 例如在商 ...

随机推荐

  1. QT之类型转换

    Qt在进行数据类型转换时,容易忘记如何使用,或者是早已厌倦了百度QString转QByteArray,QByteArray转char,QString转string....... 现在分享一篇QT数据类 ...

  2. AD常用快捷键

    元器件翻转 : 空格 按住shift拖动元器件实现自动编号 取消布线 : 工具(Tools)取消布线(Un_Route)全部(AII) 栅格变为点阵 : 按ctrl+G——打开cartesian Gr ...

  3. https相关知识总结

    从园子里看到很多讲解不错的文章,将链接放到这里,备忘 浅析数字证书:https://www.cnblogs.com/hyddd/archive/2009/01/07/1371292.html

  4. Eclipse集成Git做团队开发:代码管理

    在日常开发工作中,我们通常使用版本控制软件管理团队的源代码,常用的SVN.Git.与SVN相比,Git有分支的概念,可以从主分支创建开发分支,在开发分支测试没有问题之后,再合并到主分支上去,从而避免了 ...

  5. 2019 创蓝253java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.创蓝253等公司offer,岗位是Java后端开发,因为发展原因最终选择去了创蓝253,入职一年时间了,也成为 ...

  6. 安装fastnlp

    直接 pip install fastnlp 如果出现 torch的安装报错,可能与操作系统及 CUDA 的版本相关.直接上pytorch 的官网 https://pytorch.org/get-st ...

  7. python爬虫---爬虫的数据解析的流程和解析数据的几种方式

    python爬虫---爬虫的数据解析的流程和解析数据的几种方式 一丶爬虫数据解析 概念:将一整张页面中的局部数据进行提取/解析 作用:用来实现聚焦爬虫的吧 实现方式: 正则 (针对字符串) bs4 x ...

  8. linux route路由

    网关(Gateway)又称网间连接器.协议转换器.网关在网络层以上实现网络互连 就好像一个房间可以有多扇门一样,一台主机可以有多个网关.默认网关的意思是一台主机如果找不到可用的网关,就把数据包发给默认 ...

  9. ES10(2019)有哪些更新和新特性?

    ES10新特性(2019) 行分隔符(U + 2028)和段分隔符(U + 2029)符号现在允许在字符串文字中,与JSON匹配 更加友好的 JSON.stringify 新增了Array的flat( ...

  10. ZooKeeper基本介绍

    一.入门 1.1 概述 Zookeeper是一个开源的分布式的,为分布式应用提供协调的Apache项目.可用于服务发现,分布式锁,分布式领导选举,配置管理等. Zookeeper从设计模式角度来理解: ...