java cook 购物车,java -session跟cookie操作购物车

当前位置:我的异常网» 编程 » 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

文章评论

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值