如何把产品添加进购物车对象,需要解决两个关键问题:一是购物车对象本身的保存,二是购物车对象所持有的对象。这里为了简洁,我们只假定购物车对象持有一个购物项对象即可,至于涉及到订单相关的持有信息,这里略去。
购物项的主要属性:一是产品对象,二是产品数量。
购物车持有购物项,购物项保存具体某项产品的信息。至此,基本解决了问题二:购物车对象持有对象的问题。
购物车对象的保存问题思路:用户点击购物链接,传递产品id信息后,后台处理动作
步骤一:从当前session中获取购物车对象,如果不能获取,转至步骤二。
步骤二:从cookie中获取保存的sessionId值所关联到的session对象,再通过此session对象获取购物车对象。这一步需要注意的一个问题是:由于执行此步时可以确定当前session中不存在购物车对象,所以获取通过cookie的一系列动作获取购物车对象后,应首先把获取到的购物车对象进加当前session中,并且要移出cookie中最初保存的sessionid值,并把当前sessionID值加进cookie中去。
步骤三,如果通过以上两步仍不能获取购物车,说明用户是首次点击购物链接(当然后也可能是用户屏蔽了cookie,对于普通用户而言,这种可能性较少)。此时我们应创建购物车对象,并把购物车对象加进当前session中,并把当前sessionId值用cookie记录。这样以后的购物时,不同的浏览器窗口可以有效(其实这主要是解决IE6不同窗口购物车不能共享的问题)。
步骤四,通过以上三步,最终一定可以获取一个购物车对象,我们要操作的就是把产品加进购物项,并把购物项加进购物车。到此,基本的购物车问题解决完成。
两个比较细节的小问题:一是如何处理登录用户与购物车对象的绑定,二是如何保证在购物车展现页面刷新时,不增加产品数量。可能第二个问题比较难理解,它的实质是这样,当我们点击购物链接时总会向服务器传递一个产品id标识,而这个id标识经过服务器的处理后,并服务端跳转到购物车展示页面,而链接中仍会保存xxx.action?id=121这种链接,当用户点击刷新时,又会发出一次新的请求给服务器,这样就相当于又点击了购物链接。
下面通过抽取的一些代码,来说明购物车的处理流程:
public String execute() throws Exception {
ShoppingCar shoppingCar = (ShoppingCar) request.getSession().getAttribute("shoppingCar");
if (shoppingCar == null) { // 如果找不到,则从cookie记录的sessionId中找到session,再通过找到的session找购物车对象
String sessionid = WebUtil.getCookieByName(request, "theSessionId");
if (sessionid != null) {
HttpSession session = WebSessionListener.getSession(sessionid);
if (session != null) {
shoppingCar = (ShoppingCar) session.getAttribute("shoppingCar");
if (shoppingCar != null) {// 如果从其它的session中能获取购物车,则把此购物车重新加到当前会话中,并移除存在sesionMap中对应的session
request.getSession().setAttribute("shoppingCar", shoppingCar);
WebUtil.addCookie(response, "theSessionId", request.getSession().getId(),
request.getSession().getMaxInactiveInterval());
// 清除以前的session时,如果用户已登录,应先保存用户登录信息
User user = (User) session.getAttribute("user");
if (user != null) {
request.getSession().setAttribute("user", user);
}
WebSessionListener.remove(sessionid);
}
}
}
}
if (shoppingCar == null) { // 如果通过当前sesion及cooiesession仍找不到购物车对象,则创建购物车对象到当前session,并加cookie记录
shoppingCar = new ShoppingCar();
request.getSession().setAttribute("shoppingCar", shoppingCar);
WebUtil.addCookie(response, "theSessionId", request.getSession().getId(), request
.getSession().getMaxInactiveInterval());
}
if (productid != null && productid > 0) {
Product product = productService.find(Product.class, productid);
ShoppingItem currentItem = new ShoppingItem(product);
if (!shoppingCar.getItems().contains(currentItem)) {// 此处代码的作用主要是用来处理购物车页面刷新时会增加购物项的问题
shoppingCar.addShoppingItem(new ShoppingItem(product, 1));// 把产品添加到购物车中
}
}
return "success";
}
简要说明:if (!shoppingCar.getItems().contains(currentItem)) 此动作的一个前提条件是必须重写购物项及产品的hashCode及equals方法,并且重写它们依赖的参照是id,这样做主要是保证当产品的id相同时,它们equals返回true。这样用户刷新时,发现购物车中存在此购物项,就不会去添加购物项。
上面代码中涉及到的一些代码如下:
package com.asm.base.listener;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class WebSessionListener implements HttpSessionListener {
private static Map<String, HttpSession> sessions = new LinkedHashMap<String, HttpSession>();
@Override
public void sessionCreated(HttpSessionEvent sessionEvent) {
sessions.put(sessionEvent.getSession().getId(), sessionEvent.getSession());
}
@Override
public void sessionDestroyed(HttpSessionEvent sessionEvent) {
sessions.remove(sessionEvent.getSession().getId());
}
public static HttpSession getSession(String sessionId) {
return sessions.get(sessionId);
}
public static void remove(String sessionId) {
if (sessions.containsKey(sessionId)) {
sessions.remove(sessionId);
}
}
}
它是一个监听器,需要在web.xml中作配置,监听session 动作。
/**
* 添加cookie
*
* @param name:cookie的名称
* @param value:cookie的值
* @param maxAge:cookie存放的时间(以秒为单位,假如存放三天,即3*24*60*60;如果值为0,cookie将随浏览器关闭而清除
*/
public static void addCookie(HttpServletResponse response, String name, String value, int maxAge) {
Cookie cookie = new Cookie(name, value);
cookie.setPath("/");
if (maxAge > 0) {
cookie.setMaxAge(maxAge);
}
response.addCookie(cookie);
}
/**
* 获取cookie的值
*
* @param name:cookie的名称
*/
public static String getCookieByName(HttpServletRequest request, String name) {
Map<String, Cookie> cookieMap = WebUtil.readCookieMap(request);
if (cookieMap.containsKey(name)) {
Cookie cookie = (Cookie) cookieMap.get(name);
return cookie.getValue();
} else {
return null;
}
}
说明:它是webUtil工具类提供的两个便于cookie操作的静态方法。
至于更多购物车的细节问题,可以结合实际情况进行考虑
分享到:
相关推荐
在IT行业中,面向对象编程(Object-Oriented Programming, OOP)是一种常见的编程范式,它将现实世界的问题抽象为类和对象,通过封装、继承和多态等特性来解决问题。"超市购物车"是一个很好的OOP示例,因为它包含了...
Swift购物车框架是一种用于iOS应用开发的解决方案,它专门设计来处理用户在应用程序中的购物行为。这个框架展示了如何实现购物车的基本功能,如添加商品、删除商品、更改商品数量以及计算总价等。在Swift中,我们...
这个项目旨在帮助初学者理解和应用面向对象编程思想,同时也能提升他们在实际开发中的问题解决能力。 在Java编程中,购物车项目涉及到以下几个关键知识点: 1. **类与对象**:首先,你需要创建`商品`(Product)和...
"购物车中多选单选Demo"是一个针对这一功能的示例实现,旨在提供一个简单易懂的解决方案,帮助开发者快速构建购物车的多选与单选功能。在这个Demo中,我们可以探讨以下几个关键知识点: 1. **多选与单选**:在...
同时,参与讨论和分享也能促进学习,提高问题解决能力。对于“三层”架构的提及,通常指的是业务逻辑层(BLL)、数据访问层(DAL)和表示层(UI),这种分层设计有助于代码的组织和维护,值得深入学习。
Java基础阶段的购物车项目是学习Java编程时一个常见...通过这个项目,不仅可以检验你的Java语法掌握程度,还能提升你对面向对象编程思想的理解,以及实际问题的解决能力。不断练习和优化,你的编程技能将得到显著提升。
学生通过这次设计,不仅深化了对各种技术的理解,还提高了实际编程能力,理解了如何将理论知识应用于实践中,同时增强了问题解决和自我学习的能力。 综上所述,这个购物车系统虽然简单,但它是一个很好的平台,让...
《同乐居商城:购物车合算》是一个包含微信小程序源码、开发教程及文档的综合资源包,专为开发者和学习者提供了完整的项目实践素材。这个资源旨在帮助用户理解和构建一个功能完善的在线购物商城系统,特别关注购物车...
【Taro实现购物车逻辑】 在现代前端开发中,多端适配成为了一项重要的需求,Taro作为一套遵循React语法规范的...通过学习和理解Taro的API及React的原理,可以构建出高效且可维护的购物车功能,适应各种终端平台的需求。
2. `src/reducers`:这里定义了应用的状态更新逻辑,比如`cartReducer.js`,它处理与购物车相关的actions。 3. `src/actions`:在这个目录下,会找到各种actions的定义,例如`addProductToCart.js`、`...
贪心算法和动态规划是两种常见的优化问题求解方法,它们在解决实际问题时有着广泛的应用。...在学习和实践中,掌握这两种算法的思想和套路,对于提升编程能力,特别是解决实际工程问题的能力,有着极其重要的意义。
这款应用的目标是提供一种轻量级、易于理解和维护的解决方案,让开发者能够在短时间内为自己的应用添加购物车功能。 首先,我们来深入了解购物车应用程序的核心概念。购物车是电商应用中不可或缺的部分,它允许用户...
【uni框架】是基于Vue.js开发的多端开发框架,由DCloud(即HTML5 Plus)推出,旨在解决Web开发者在构建移动应用时面临的多端适配问题。它支持开发iOS、Android、H5、微信小程序等多个平台的应用,极大地提高了开发...
电子产品B2C商城解决方案书.pdf 本文将对电子产品B2C商城解决方案书.pdf进行详细的知识点总结,涵盖项目需求、项目设计方案、商城业务和设计等方面。 项目需求 项目需求是指项目的目标和需要达到的结果。根据项目...
在搜索、广告、推荐技术领域中,机器学习需要解决的问题包括点击率预估、收藏率预估、加入购物车概率预估、转化率预估等。同时,机器学习需要从用户行为数据中获取样本,提取特征和相应的标签。 业务场景和机器学习...
网站解决方案是针对企业在互联网上建立或改进其在线形象的关键步骤,它涵盖了从需求分析到实施、维护的全过程。本文将详细探讨网站平台解决方案,包括网站改版需求分析、网站建设目标和系统设计,以及技术架构的选择...
2. 设计报告:要求提供详细的设计报告,包括设计思想、功能划分、体系结构、类等有关的包结构,设计中遇到的问题等。 3. 系统分析与设计:要求提供系统的简单的分析与设计,包括设计思想、功能划分、体系结构等。 4....
总之,面向对象的实战思想强调将问题分解为独立的对象,通过属性和方法来描述它们的特性与行为。在JavaScript中,我们可以通过构造函数和原型链来实现这一思想,创建可复用和易于维护的代码。随着编程经验的积累,...
回溯算法是一种试探性的解决问题的方法,它尝试通过不断探索所有可能的解决方案来找到问题的答案,如果发现当前选择的路径无法到达目标状态,就会撤销选择,返回到上一步甚至更早的状态,继续尝试其他的可能性。...
埃森哲新零售全渠道中台解决方案的知识点涵盖了当前新零售环境下的主要趋势、挑战以及解决方案的设计思想和实施细节。以下将对这些知识点进行详细说明: 1. 新零售背景与挑战: 新零售是一种新兴的零售业态,它融合...