首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

java -session跟cookie操作购物车

2012-12-28 
java ---session和cookie操作购物车关键字:Java中实现基于Session和Cookie的购物车 今天学习到了另外一种

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>

热点排行