之前没有接触过购物车的东东,也不知道购物车应该怎么做,所以在查询了很多资料,总结一下购物车的功能实现。

查询的资料,找到三种方法:

1.用cookie实现购物车;

2.用session实现购物车;

3.用cookie和数据库(购物车信息持久化)实现购物车;

分析一下这三种方法的优缺点:

1.单纯有cookie实现购物车,这样的购物车不是很理想,设想一下,如果客户端的浏览器把cookie给禁用了,

这种方法就会在这里流产…

2.session中保存购物车的信息,这个只是在一个会话中可用,如果用户没有登录,或者说登录了以后,添加购物车,在关闭浏览器

或者登出后,之前所添加的购物车通通都流产啦…

3.我这里要说就是这种方法啦…..

主要的流程:

A.用户登录前的数据流:用户在没有登录系统的时候,对喜欢的商品进行添加购物车,那么这个时候,我们可以把购物车信息保存

到cookie中,这里会涉及到cookie的添加,修改操作;也即如果之前在cookie中不存对应的cookie,则就对cookie进行添加操作。

如果在cookie中存在对应的cookie,那么,这时候,就要对cookie进行修改操作了(这里涉及到用户对同一个商品进行多次添加购物车的情况)。

B.用户登录后的数据流:用户在登录后,系统首先做的第一件事就是去获取对应的cookies,如果存在相关的购物车cookies,那么就对该购物车

信息进行相应用户User的持久化操作,要么添加,要么修改。(添加操作:该用户所对应的购物车如果没有相应的信息进行添加操作;修改操作:类似的,

如果存在对应用户的购物车信息,就进行修改操作)。用户登录后,也可以进行购物车的添加操作,不过,这里不是添加到cookie中,而是直接持久化到

数据库中。注:用户登录后的数据都是和数据库打交道。

代码部分:

注:

Conf.IDUONA_CASHTICKET_COOKIE_STARTNAME= "iduona_cashTicket_";1

/*** 用户登录

*

*@authorhongten*/

public voidlogin() {//用户登录的时候,去读取cookies,并且进行持久话操作,更多的登录操作这里省略啦....

peristShoppingCartWhenUserLogin(newUser);

}/*** 加入购物车
我的Java学习交流QQ群:589809992 我们一起学Java!

* ============================================

* 用户登录前:

* 用户在选择现金券的时候,点击现金券的加入购物车的时候,会把该现金券的信息(现金券的id,购买数量)

* 传递到这里,这时候,后台要做的就是从cookie中查询出是否有相同的记录,如果有相同的记录

* 则把相应的记录更新;否则,就添加新的记录

* 用户登录后:

* 用户在登录后,如果有添加购物车操作,则不用保存到cookie中,而是直接持久化购物车信息

*

*@throwsException*/

public void addToShoppingCart() throwsException {if (cashTicket == null || cashTicket.getId() == null || cashTicket.getId() < 1) {

write("nullId");

}else if (q == null || q == "") {//购买数量,默认情况下面为1

q = String.valueOf(1);

}else{//读取所有的cookie

Cookie cookies[] =ServletActionContext.getRequest().getCookies();if (cookies == null || cookies.length < 0) {//没有cookie

System.out.println("there is no any cookie ..");

}else{//判断用户是否登录

if (getUserInSession() == null) {boolean flag = true;for(Cookie c : cookies) {if (c.getName().equals(Conf.IDUONA_CASHTICKET_COOKIE_STARTNAME +cashTicket.getId())) {//说明已有的cookies中有相应的cookie,就进行更新操作

Integer oldValue =Integer.valueOf(c.getValue());

Integer newValue= Integer.valueOf(oldValue +Integer.valueOf(q));

fixCookie(c, newValue.toString().trim());

flag= false;

}

}//说明已有的cookies中没有相应的cookie,就进行添加操作

if(flag) {

addCookie(Conf.IDUONA_CASHTICKET_COOKIE_STARTNAME+cashTicket.getId(), q.trim());

}//==================================================//测试用,读取所有的cookies

readShoppingCartFromCookie();//==================================================

write("success");

}else{//如果用户登录,说明session存在user,这时就持久化购物车信息

CashTicket cashTicketTemp =cashTicketService.get(cashTicket.getId());if(shoppingCartService.isExistUserAndCashTicket(getUserInSession(), cashTicketTemp)) {

ShoppingCart oldShoppingCart=shoppingCartService.getByUserAndCashTicket(getUserInSession(), cashTicketTemp);

oldShoppingCart.setAmount(oldShoppingCart.getAmount()+Integer.valueOf(q));if(shoppingCartService.update(oldShoppingCart)) {

write("success");

}

}else{

ShoppingCart shoppingCartTemp= newShoppingCart();

shoppingCartTemp.setAmount(Integer.valueOf(q));

shoppingCartTemp.setUser(getUserInSession());

shoppingCartTemp.setCashTicket(cashTicketTemp);

shoppingCartTemp.setCreateTime(newDate());

shoppingCartTemp.setStatusType(StatusType.POSITIVE);

shoppingCartTemp.setUuid(UUID.randomUUID().toString());if(shoppingCartService.save(shoppingCartTemp)) {

write("success");

}

}

}

}

}

}/*** 从cookie中读取购物车信息

*

*@throwsException

*@return

*/

public void readShoppingCartFromCookie() throwsException {

System.out.println("======================================================");

Cookie cookies[]=ServletActionContext.getRequest().getCookies();if (cookies == null || cookies.length < 0) {//System.out.println("there is no any cookie ..");//没有cookie

} else{for(Cookie c : cookies) {

System.out.println("haha there are many cookies :" + c.getName() + " " +c.getValue());

}

}

}/*** 添加cookie操作

*

*@paramname

* cookie的name

*@paramvalue

* cookie的value*/

public voidaddCookie(String name, String value) {

Cookie cookie= newCookie(name.trim(), value.trim());

cookie.setMaxAge(2 * 60 * 60 * 1000);//设置为2个钟

ServletActionContext.getResponse().addCookie(cookie);

}/*** 更新cookie操作

*

*@paramc

* 要修改的cookie

*@paramvalue

* 修改的cookie的值*/

public voidfixCookie(Cookie c, String value) {

c.setValue(value.trim());

c.setMaxAge(2 * 60 * 60 * 1000);//设置为2个钟

ServletActionContext.getResponse().addCookie(c);

}/*** 当用户登录的时候,持久化cookie中的购物车信息,更新为本用户的购物车信息*/

public voidperistShoppingCartWhenUserLogin(User user) {if (null !=user) {

Cookie cookies[]=ServletActionContext.getRequest().getCookies();if (cookies != null) {for(Cookie c : cookies) {if(c.getName().startsWith(Conf.IDUONA_CASHTICKET_COOKIE_STARTNAME)) {//获取cookie的名称:"iduona_cashTicket_45" 和 cookie的值: "21"

String name =c.getName();

Integer amount= Integer.valueOf(Integer.valueOf(c.getValue())+Integer.valueOf(q));

Integer ct_id= Integer.valueOf(name.substring(name.lastIndexOf("_") + 1));

CashTicket temp=cashTicketService.get(ct_id);

ShoppingCart shoppingCartTemp= newShoppingCart();if (null !=temp) {if(shoppingCartService.isExistUserAndCashTicket(user, temp)) {//进行更新操作

ShoppingCart oldShoppingCart =shoppingCartService.getByUserAndCashTicket(user, temp);

oldShoppingCart.setAmount(amount);

shoppingCartService.update(oldShoppingCart);

}else{//否则进行保存记录

shoppingCartTemp.setAmount(amount);

shoppingCartTemp.setUser(user);

shoppingCartTemp.setCashTicket(temp);

shoppingCartTemp.setCreateTime(newDate());

shoppingCartTemp.setStatusType(StatusType.POSITIVE);

shoppingCartTemp.setUuid(UUID.randomUUID().toString());

shoppingCartService.save(shoppingCartTemp);

}

}

}

}//移除所有的现金券cookies

removeAllCookies();

}

}

}/*** 移除所有的现金券cookies操作*/

public voidremoveAllCookies() {

Cookie cookies[]=ServletActionContext.getRequest().getCookies();if (cookies == null || cookies.length < 0) {//没有cookie

System.out.println("there is no any cookie ..");

}else{

System.out.println("开始删除cookies..");for(Cookie c : cookies) {if(c.getName().startsWith(Conf.IDUONA_CASHTICKET_COOKIE_STARTNAME)) {

c.setMaxAge(0);//设置为0

ServletActionContext.getResponse().addCookie(c);

}

}

}

}

这是部分代码….

效果:

用户没有登录的情况下

用户登录了以后:

数据库里面的情况:

登录前数据

---------------------

作者:CSDN刘成

来源:CSDN

原文:https://blog.csdn.net/sd09044901guic/article/details/80132451?utm_source=copy

版权声明:本文为博主原创文章,转载请附上博文链接!

javaweb mysql购物车_javaweb购物车实现的几种方式相关推荐

  1. MySQL 8.0 异步复制的三种方式

    本实验中分别针对空库.脱机.联机三种方式,配置一主两从的mysql标准异步复制.只做整服务器级别的复制,不考虑对个别库表或使用过滤复制的情况. 实验环境 [root@slave2 ~]# cat /e ...

  2. mysql不停止重启服务器_不停止MySQL服务增加从库的两种方式

    现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. ...

  3. mysql增加从库_不停止MySQL服务增加从库的两种方式 (装载)

    现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. ...

  4. mysql 停从库_不停止 MySQL 服务增加从库的两种方式

    现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. ...

  5. 不停止MySQL服务增加从库的两种方式

    本文出自51CTO博客博主李振良的技术博客,如有任何问题请进入博主页面互动讨论. 博文地址:http://lizhenliang.blog.51cto.com/7876557/1669829 现在生产 ...

  6. mysql安装方法_MySQL安装的三种方式

    MySQL安装的三种方式 Mysql安装方式对比 安装方式 安装简易度 使用简易度 定制化程度 适合范围 rpm包安装 简单 简单 低 仅适合redhat/centos系列linux 二进制安装 安装 ...

  7. mysql 停从库_MySQL_通过两种方式增加从库——不停止mysql服务,一般在线增加从库有两种方式 - phpStudy...

    通过两种方式增加从库--不停止mysql服务 一般在线增加从库有两种方式,一种是通过mysqldump备份主库,恢复到从库,mysqldump是逻辑备份,数据量大时,备份速度会很慢,锁表的时间也会很长 ...

  8. mysql导入本地sql脚本的两种方式

    高效导入多个.sql文件方法详解 常用的命令有两个:mysql和source 此外还有sqlimport和LOAD DATA INFILE等导入方法,不过它们主要用于导入.csv或.xml文件数据,不 ...

  9. mysql中数据库覆盖导入的几种方式

    众所周知,数据库中INSERT INTO语法是append方式的插入,而最近在处理一些客户数据导入场景时,经常遇到需要覆盖式导入的情况,常见的覆盖式导入主要有下面两种: 1.部分覆盖:新老数据根据关键 ...

最新文章

  1. ueditor与七牛云存储结合
  2. 用 Flask 来写个轻博客 (27) — 使用 Flask-Cache 实现网页缓存加速
  3. MyBatis + MyBatis Plus + MySQL——查询语句中字段名为MySQL关键字问题解决方案
  4. haproxy配置参数详解
  5. 实例演示使用HiBench对Hadoop集群进行基准测试
  6. 教你用 Newprep 一键封装工具 封装XP克隆系统- 视频教程
  7. 一步步编写操作系统80 扩展内联汇编1
  8. node.js Express框架入门
  9. 来及Java空间的传送门2
  10. php curl无视ssl,用Curl实现Post和Get请求,可绕过SSL验证
  11. spring session的生命周期
  12. loj10131 暗的连锁
  13. centos6.5 下搭建lamp环境
  14. 2021 年“认证杯”数学中国数学建模网络挑战赛 B题
  15. 【Unity3D日常BUG】Unity3D 中听不到声音解决方案
  16. 《Java核心技术36讲》读后
  17. android pin码解锁,解锁三星的3种方法:SIM网络解锁PIN码
  18. CCS编译 报警#190-D enumerated type mixed with another type
  19. c++ private、protect、public、virtual详细说明***
  20. 计算机最简单的爱情音乐,音乐里那些最动人的情话,适合一个人在家静静聆听...

热门文章

  1. windows系统删除顽固文件
  2. ping回显目标主机不可达destination host unreachable的含义及发生情况
  3. win10引导项误删修复
  4. 综合练习(活期存款)
  5. java调用visa的dll库,查看新闻/公告--[备忘]Java中,使用JNA调用Visa32.dll,控制频谱仪~~...
  6. noip初赛问题解析
  7. 520表白攻略 程序员必要的相亲准备 最近你相亲表白了嘛
  8. 牛客网 小白月赛4 D-郊区春游 最短路+状压dp
  9. Unity官方图形教程 学习笔记(三) -- 线性工作流
  10. doa的matlab算法,基于MATLAB的DOA估计算法的二维仿真建模