当前位置:我的异常网» 编程 » java -session跟cookie操作购物车
java -session跟cookie操作购物车
www.myexceptions.net 网友分享于:2015-08-26 浏览:103次
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 list=new ArrayList();
public List getList() {
return list;
}
public void setList(List 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 session_map=new HashMap();
/**
* 创建一个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 getAllCookies(HttpServletRequest request) {
Map cookie_map = new HashMap();
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 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配置文件中添加如下节点:
com.pf.org.SessionListener
文章评论