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

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

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

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_";
 /**
* 用户登录
*
* @author hongten
*/
public void login() {
//用户登录的时候,去读取cookies,并且进行持久话操作,更多的登录操作这里省略啦....
peristShoppingCartWhenUserLogin(newUser);
} /**
* 加入购物车<br>
* ============================================<br>
* 用户登录前:<br>
* 用户在选择现金券的时候,点击现金券的加入购物车的时候,会把该现金券的信息(现金券的id,购买数量)<br>
* 传递到这里,这时候,后台要做的就是从cookie中查询出是否有相同的记录,如果有相同的记录<br>
* 则把相应的记录更新;否则,就添加新的记录<br>
* 用户登录后:<br>
* 用户在登录后,如果有添加购物车操作,则不用保存到cookie中,而是直接持久化购物车信息<br>
*
* @throws Exception
*/
public void addToShoppingCart() throws Exception {
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 = new ShoppingCart();
shoppingCartTemp.setAmount(Integer.valueOf(q));
shoppingCartTemp.setUser(getUserInSession());
shoppingCartTemp.setCashTicket(cashTicketTemp);
shoppingCartTemp.setCreateTime(new Date());
shoppingCartTemp.setStatusType(StatusType.POSITIVE);
shoppingCartTemp.setUuid(UUID.randomUUID().toString());
if (shoppingCartService.save(shoppingCartTemp)) {
write("success");
}
}
}
}
}
} /**
* 从cookie中读取购物车信息
*
* @throws Exception
* @return
*/
public void readShoppingCartFromCookie() throws Exception {
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操作
*
* @param name
* cookie的name
* @param value
* cookie的value
*/
public void addCookie(String name, String value) {
Cookie cookie = new Cookie(name.trim(), value.trim());
cookie.setMaxAge(2 * 60 * 60 * 1000);// 设置为2个钟
ServletActionContext.getResponse().addCookie(cookie);
} /**
* 更新cookie操作
*
* @param c
* 要修改的cookie
* @param value
* 修改的cookie的值
*/
public void fixCookie(Cookie c, String value) {
c.setValue(value.trim());
c.setMaxAge(2 * 60 * 60 * 1000);// 设置为2个钟
ServletActionContext.getResponse().addCookie(c);
} /**
* 当用户登录的时候,持久化cookie中的购物车信息,更新为本用户的购物车信息
*/
public void peristShoppingCartWhenUserLogin(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 = new ShoppingCart();
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(new Date());
shoppingCartTemp.setStatusType(StatusType.POSITIVE);
shoppingCartTemp.setUuid(UUID.randomUUID().toString());
shoppingCartService.save(shoppingCartTemp);
}
}
}
}
// 移除所有的现金券cookies
removeAllCookies();
}
}
} /**
* 移除所有的现金券cookies操作
*/
public void removeAllCookies() {
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);
}
}
}
}

这是部分代码....

效果:

用户没有登录的情况下

用户登录了以后:

数据库里面的情况:

登录前数据

I'm Hongten

	</div>
<div class="postDesc">posted @ <span id="post-date">2012-12-26 17:15</span> <a href="http://www.cnblogs.com/hongten/">Hongten</a> 阅读(<span id="post_view_count">50622</span>) 评论(<span id="post_comment_count">10</span>) <a href="https://i.cnblogs.com/EditPosts.aspx?postid=2834251" rel="nofollow">编辑</a> <a href="#" onclick="AddToWz(2834251);return false;">收藏</a></div>
</div>
<script type="text/javascript">var allowComments=true,cb_blogId=85685,cb_entryId=2834251,cb_blogApp=currentBlogApp,cb_blogUserGuid='25ead406-ec52-e011-a53f-842b2b196315',cb_entryCreatedDate='2012/12/26 17:15:00';loadViewCount(cb_entryId);</script>
posted @
2017-01-17 16:27 
jobs-lgy 
阅读(...) 
评论(...) 
编辑 
收藏

java web开发_购物车功能实现的更多相关文章

  1. java web 开发三剑客 -------电子书

    Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知In ...

  2. Java Web开发中MVC设计模式简介

    一.有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容.但是我们之前自己编写的应用一般存在无条 ...

  3. 【转】 java web开发之安全事项

    从事java web开发也有几年了,可是开发中的安全问题却越来越不以为然.直到不久遇到一黑软,瞬间sql注入,少时攻破网站数据库.还好,我还没有用root级的用户连接数据库.不过也没有什么用了,因为我 ...

  4. [Java Web整合开发王者归来·刘京华] 1、 Java Web开发

      目录: 1.Web技术简介 2.动态网站与静态网站 3.Java Web开发模式 4.JavaScript简介 1.Web技术简介 PS: 最近还有更凶残的技术,即整个操作系统都是基于Web的,如 ...

  5. 个人的java web开发书单

    首发至个人博客http://www.zidafone.com/blog/36 以下是对一些读过的书和一些买后随便翻了翻的书的个人感觉.都是java web开发的程序员可能接触的书,其他的如设计/手机开 ...

  6. java web开发必备知识

    从各种招聘网站的要求上筛选出了一些java开发的一些基本的要求,对照自身看看有哪些缺陷. java基础 既然是java web开发,java SE肯定要学好了. 多线程,IO,集合等,对队列,缓存,消 ...

  7. Java Web开发之详解JSP

    JSP作为Java Web开发中比较重要的技术,一般当作视图(View)的技术所使用,即用来展现页面.Servlet由于其本身不适合作为表现层技术,所以一般被当作控制器(Controller)所使用, ...

  8. Java Web开发介绍

    转自:http://www.cnblogs.com/pythontesting/p/4963021.html Java Web开发介绍 简介 Java很好地支持web开发,在桌面上Eclipse RC ...

  9. 使用Eclipse+Maven+Jetty构建Java Web开发环境(几个教程综合集成2014发行)

    工作需要使用Jetty由于web集装箱,得知Eclipse+Maven+Jetty该组合是非常好的,因此,要在网上找了很多教程,但不写或多或少特定的或过时的内容而导致最终的配置失败,易于配置为未来的同 ...

随机推荐

  1. Kubernetes的service资源介绍

    service 三种工作模式:userspace.iptables.ipvs 删除手动创建的service [root@master ~]# kubectl delete svc redis serv ...

  2. Java 数据脱敏 工具类

    一.项目导入Apache的commons的Jar包. Jar包Maven下载地址:https://mvnrepository.com/artifact/org.apache.commons/commo ...

  3. mysql数据库关系表设计原则

    三范式https://blog.csdn.net/qq_36432666/article/details/78934073 https://kb.cnblogs.com/page/138526/ ht ...

  4. sparksql报错

    执行时报错: org.apache.spark.sql.AnalysisException: Unable to generate an encoder for inner class `cn.itc ...

  5. Android Studio如何更新support repository

    转自: http://blog.csdn.net/sinat_29696083/article/details/70256377 刚进新公司,熟悉新业务中.老大叫我看看关于ConstraintLayo ...

  6. 关于数据库中的三值逻辑(Tree-Value-Logic)

    在sql中,逻辑表达式(也叫做谓词),可以有三种值:True.False.Unknown,这就是所谓的三值逻辑,,是sql的特有属性. 在大多数编程语言中,逻辑表达式只有两个值,就是True和Fals ...

  7. spring boot 动态注入bean

    方法一 SpringContextUtil public class SpringContextUtil { private static ApplicationContext application ...

  8. Python 爬取 热词并进行分类数据分析-[简单准备] (2020年寒假小目标05)

    日期:2020.01.27 博客期:135 星期一 [本博客的代码如若要使用,请在下方评论区留言,之后再用(就是跟我说一声)] 所有相关跳转: a.[简单准备](本期博客) b.[云图制作+数据导入] ...

  9. Vacuum Pump Manufacturer - Vacuum Pump Range Use: Considerations

    The vacuum pump is a versatile bottle that holds your lotion, shampoo and conditioner. Keep away fro ...

  10. Netcat - 网络工具中的瑞士军刀

    nc的一些小应用,慢更新.... 1.一个简单的聊天工具,Client1和Client2之间,Client1安装了nc,监听8888端口,Client2用telnet Client1的8888端口即可 ...