`
zhaoshijie
  • 浏览: 2261924 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中实现基于Session和Cookie的购物车

阅读更多
关键字:Java中实现基于Session和Cookie的购物车
今天学习到了另外一种购物车的实现.和.net中的实现思路有些差异.在此做个总结

1、首先抽象出"购物车",由商品、购物车中的项、购物车三部分组成.

package com.pf.entity;

import java.io.Serializable;
/**
* 商品类(我用的Food)

* @author PF

*/
public class Food implements Serializable{

private int food_id;
    private String food_name;
   
    public int getFood_id() {
       return food_id;
    }
    public void setFood_id(int food_id) {
       this.food_id = food_id;
    }
    public String getFood_name() {
       return food_name;
    }
    public void setFood_name(String food_name) {
       this.food_name = food_name;
    }


}




package com.pf.entity;

import java.io.Serializable;

/**
* 购物车项
* @author PF

*
*/

public class CartItem implements Serializable{


    private Food food;
    private int count;
   
    public Food getFood() {
       return food;
    }
    public void setFood(Food food) {
       this.food = food;
    }
    public int getCount() {
       return count;
    }
    public void setCount(int count) {
       this.count = count;
    }
}



package com.pf.entity;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* 购物车类
* @author PF_CQ
*
*/
public class Cart implements Serializable{
   
    List<CartItem> list=new ArrayList<CartItem>();
   
    public List<CartItem> getList() {
       return list;
    }


    public void setList(List<CartItem> list) {
       this.list = list;
    }


    public void addCartItem(CartItem item){
       for(CartItem it : list){
           if(it.getFood().getFood_id()==item.getFood().getFood_id())
              return;
       }
       list.add(item);
    }
   
    public void removeItem(CartItem item){
       list.remove(item);
    }
   
    public void clearCart(){
       list.clear();
    }
}



2、购物车抽象出来了,就要创建一个Session监听器,用于每次创建一个session之后都保存进一个键值对集合中,下次可以通过session的Id获取



package com.pf.org;


import java.util.HashMap;
import java.util.Map;


import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;


/**
* Session监听器
* @author PF
*
*/
public class SessionListener implements HttpSessionListener {


    //Session集合

    public static Map<String,HttpSession> session_map=new HashMap<String,HttpSession>();
   

    /**
     * 创建一个session
     */
    public void sessionCreated(HttpSessionEvent sessionEvent) {
       String session_id=sessionEvent.getSession().getId();
       System.out.println("======创建了一个Session,id是:"+session_id+"======");
       session_map.put(session_id, sessionEvent.getSession());
    }


    /**
     * 销毁
     */
    public void sessionDestroyed(HttpSessionEvent sessionEvent) {
       session_map.remove(sessionEvent.getSession());
    }
   
    /**
     * 获得session
     * @param session_id
     * @return
     */
    public static HttpSession getSessionById(String session_id){
       return session_map.get(session_id);
    }
   
    /**
     * 移除session
     * @param session_id
     */
    public static void removeSessionById(String session_id){
       session_map.remove(session_id);
    }

}



3、接下来,创建一个可以操作Cookie的类

package com.pf.org;


import java.util.HashMap;
import java.util.Map;


import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
* Web工具类(用于操作Cookie)
* @author PF
*
*/
public class WebUtil {


    /**
     * 添加Cookie
     *
     * @param response
     * @param name
     *            Cookie的名字
     * @param value
     *            Cookie的值
     * @param maxAge
     *            Cookie的存活时间
     */
    public static void addCookie(HttpServletResponse response, String name,
           String value, int maxAge) {
       Cookie cookie = new Cookie(name, value);
       if (maxAge > 0)
           cookie.setMaxAge(maxAge);
       // 添加到客户端
       response.addCookie(cookie);
    }


    /**
     * 取出硬盘中所有的Cookie
     *
     * @param request
     * @return
     */
   public static Map<String, Cookie> getAllCookies(HttpServletRequest request) {
       Map<String, Cookie> cookie_map = new HashMap<String, Cookie>();
       Cookie[] cookies = request.getCookies();
       //如果存在cookie,就存入Map
       if(cookies!=null){
           for (int i = 0; i < cookies.length; i++) {
              cookie_map.put(cookies[i].getName(), cookies[i]);
           }
       }
       return cookie_map;
    }
    /**
     * 在Cookie中通过Cookie名称获得Session中的SessionId
     * @param request
     * @param name
     * @return
     */
    public static String getSessionIdByNameInCookie(HttpServletRequest request,String name){
       Map<String, Cookie> cookie_map=getAllCookies(request);
       if(cookie_map.containsKey(name)){
           Cookie cookie = cookie_map.get(name);
           return cookie.getValue();         
       }
       return null;
    }
}
4、OK,万事具备,只欠东风.   现在就来通过Servlet的数据提交,完成购物车



package com.pf.servlet;


import java.io.IOException;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


import com.pf.entity.Cart;
import com.pf.entity.CartItem;
import com.pf.entity.Food;
import com.pf.org.ConvertTool;
import com.pf.org.SessionListener;
import com.pf.org.WebUtil;


/**
* Servlet实现购物车的数据存取
* @author PF

*
*/
public class SessionServlet extends HttpServlet {



    public void doGet(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {

       //获取到提交来的数据(ConvertTool是自己写的工具类)



       int food_id = ConvertTool.toInt32(request.getParameter("food_id"));

       String food_name = request.getParameter("food_name");
       String food_price = request.getParameter("food_price");




       // 在当前session中获得购物车
       Cart cart = (Cart) request.getSession().getAttribute("cart");
       // 如果当前session中没有购物车
       if (cart == null) {
           // 就去取session的Id,为这个session创建一个购物车
           String sid = WebUtil.getSessionIdByNameInCookie(request,
                  "sessionId");
           // 如果sessionId取到了,就在监听器中获取前一次的session,查看之前是否存在购物车
           if (sid != null) {
              HttpSession session = SessionListener.getSessionById(sid);
              // 如果前一次访问过,就存在sessionid,但不一定存在购物车,

              // 所有就先取,取不到再说..

              if (session != null) {

                  // 在前一次的session中获得购物车

                  cart = (Cart) session.getAttribute("cart");

                  //  取到了~

                  if (cart != null) {
                     // 把购物车存入本次的session中
                     request.getSession().setAttribute("cart", cart);
                     // 再把本次的session再存入Cookie中
                     WebUtil.addCookie(response, "sessionId", request
                            .getSession().getId(), request.getSession()
                            .getMaxInactiveInterval());
                     // 之后移除上一次的session,保证cookie中的sessionid数量对等
                     SessionListener.removeSessionById(sid);
                  }
              }
           }
       }


       // 全新的购物车
       if (cart == null) {
           cart = new Cart();
           // 把新的购物车存入本次session中
           request.getSession().setAttribute("cart", cart);
           // 步骤同上,存入Cookie中
           WebUtil.addCookie(response, "sessionId", request.getSession()
                  .getId(), request.getSession().getMaxInactiveInterval());
       }


       // 购物车有了,再剩下的,就是需要把商品装进购物车项中,再把购物车项装入购物车.

       if (food_id != 0 && food_name != null && food_price != null) {
           //商品对象
           Food food = new Food();
           food.setFood_id(food_id);
           food.setFood_name(food_name);

          
           //把商品装进 "购物车项"里
           CartItem item=new CartItem();
           item.setFood(food);
           item.setCount(1);
          
           //把"购物车项"装进购物车中
           cart.addCartItem(item);
       }
       //把最新购物车放进requset中,

       request.setAttribute("cart", cart);
       //跳转..

       request.getRequestDispatcher("/show.html").forward(request, response);


    }


    public void doPost(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
       this.doGet(request, response);
    }



}

呃.. 我的注释 是不是写的太..... 不过通俗易懂也好,我是怎么想的,就怎么写,经过测试,效果不错, 和.net做的购物车效果上看不出什么差别.唯独不一样的就是存取方法吧.       在.net中是完全通过Cookie完成,而在java中,可以把购物车的信息存放在服务器上,不知道会不会加重服务器的负担,而客户端仅仅只是存放了一个id而已.有时间再对.net的单件模式购物车做个总结.

 


 

注意:实现监听器接口(HttpSessionListener)的同时,还需要在web.xml配置文件中添加如下节点:

<listener>
    <listener-class>com.pf.org.SessionListener</listener-class>
</listener>
分享到:
评论

相关推荐

    session技术实现网上商城购物车

    **Session技术实现网上商城购物车** 在Web开发中,实现用户购物车功能是电商系统不可或缺的一部分。购物车允许用户在不立即购买商品的情况下,选择多个商品并存储它们以供后续结账。在这个小例子中,我们将探讨如何...

    j2ee实验二:学习使用Session和Cookie

    ### j2ee实验二:学习使用Session和Cookie #### 实验背景与目标 在现代Web应用开发中,理解和掌握会话管理和用户认证是至关重要的。本实验旨在通过一系列实际操作来帮助学生熟悉J2EE环境下Session和Cookie的工作...

    java中使用session购物车的简单例子

    4. **更新数据:** 如果用户更改购物车中商品的数量,可以直接更新Session中的对应商品对象,或者移除旧的对象并重新设置。 5. **移除数据:** 用户从购物车删除商品时,调用`HttpSession.removeAttribute(String ...

    java购物车session

    - `addProductToCart()`:根据请求参数,创建CartItem对象并添加到session的购物车中。 - `displayCart()`:从session中取出购物车列表,显示给用户。 - `checkout()`:处理结账逻辑,可能涉及计算总价、生成订单等...

    用java运用cookie和session

    在Java Web开发中,Cookie和Session是两种常用的技术,用于管理客户端和服务器之间的会话状态。它们在实现用户登录状态保持、个性化设置保存等方面发挥着重要作用。本篇将深入探讨如何在Java中有效地运用Cookie和...

    java实现购物车功能

    总结起来,实现Java购物车功能涉及数据结构的设计(如`CartItem`和`ShoppingCart`),购物车操作的实现,以及在Web环境中的状态管理。通过结合前端和后端技术,可以创建一个完整的、功能丰富的购物车系统。

    session 购物车

    总之,session购物车是Web开发中实现用户购物功能的重要手段,通过理解其工作原理和相关技术,我们可以更好地设计和实现网站的购物功能,提供更好的用户体验。对于初学者来说,分析和研究"SessionGWC"中的源代码是一...

    javaweb之cookie和session的应用

    在Java Web开发中,Cookie和Session是两种非常重要的会话管理技术,它们主要用于跟踪和管理用户的状态信息。本文将深入探讨Cookie和Session的工作原理、应用场景以及如何在Java Web项目中进行有效利用。 **Cookie**...

    java web开发-购物车功能实现.docx

    在本文中,我们将详细介绍使用 Cookie 和 Session 实现购物车功能的方法,并分析它们的优缺点。 使用 Cookie 实现购物车 使用 Cookie 实现购物车的优点是简单易行,不需要太多的服务器资源。但是,它也存在一些...

    session简单做个登陆和购物车

    ### Session在JSP中的应用与实现 在Web开发中,`session`是一个非常重要的概念,尤其是在需要维护用户状态的应用场景中。例如,在电子商务网站中,我们需要跟踪用户的登录状态、保存用户的购物车信息等,这些都需要...

    用Session、Hashtable实现购物车功能

    本教程将详细讲解如何使用Java中的Session和Hashtable来实现这一功能。 首先,Session是Web应用程序中用于跟踪用户状态的一种机制。在HTTP协议无状态的特性下,Session为我们提供了在多个请求之间保持用户信息的...

    简单session购物车

    "简单session购物车"是一个基于Java Web技术实现的示例,它利用了Struts框架和Session来实现一个基本的购物车功能。下面我们将深入探讨这个主题。 首先,我们来理解什么是Session。Session是在服务器端保存用户状态...

    经典收藏Cookie和Session

    在Web开发中,为了维持用户的会话状态,通常有两种常用的技术:Cookie与Session。这两种技术各有特点,适用于不同的场景。 - **Cookie**: - **定义**:Cookie是一种存储在用户本地浏览器上的小型文本文件,主要...

    Session实现简单购物车.docx

    在本文中,我们将深入探讨如何使用Session来实现一个简单的购物车功能,这个功能是基于Java Web技术,涉及到JSP、Servlet和ArrayList等核心概念。 首先,让我们理解Session的工作原理。Session是服务器端的一种存储...

    servlet session 购物车

    Servlet Session购物车是Web开发中常用的一种实现方式,通过Session来维持用户会话状态,方便地管理和操作购物车。然而,也需要注意其带来的安全性和扩展性问题。理解并熟练掌握Session机制,对于开发高效、安全的...

    java购物车项目

    【Java购物车项目】是一个基于Web开发的简单应用,它主要利用了Session和Cookie技术来实现用户购物车功能以及历史浏览记录的存储。这个项目涵盖了Web开发中的关键概念和技术,对于初学者理解Web应用程序的工作原理...

    Java使用cookie和session共7页.pdf.z

    在Java Web开发中,Cookie和Session是两种非常重要的会话管理技术,它们用于跟踪和维护用户的状态信息。本文将深入探讨这两个概念,以及如何在实际应用中有效地利用它们。 首先,我们来理解Cookie。Cookie是一种在...

    java web开发-购物车功能实现.pdf

    在本文档中,我们将讨论三种不同的实现方法:使用 cookie 实现购物车、使用 session 实现购物车和使用 cookie 和数据库实现购物车。 使用 cookie 实现购物车 使用 cookie 实现购物车是最简单的方法,这种方法将...

    JSP简易购物车 源码 session储存对象

    【JSP简易购物车 源码 session储存对象】是一个基于Java Server Pages(JSP)技术的简单购物车实现,它展示了如何利用session对象在Web应用程序中存储用户购物车的数据。这个项目对于初学者理解JSP和session的概念,...

    Session实现用户存储

    接下来,我们将详细探讨Session的工作原理,如何利用Session实现用户登录,以及在购物车场景中的应用。 1. Session的工作原理: Session是基于HTTP协议无状态特性的一种补充机制。当用户访问服务器时,服务器会为...

Global site tag (gtag.js) - Google Analytics