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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值