您的位置:首页 > 编程语言 > Java开发

JAVA中实现session实现购物车原理思路(付源码)

2016-12-20 16:21 531 查看
假如我们要做一个简单的购物车,首先分析下购物车的组成部分.假使我们现在只需要两个属性,一个是商品的实体,另一个是商品的数量.业务中可以利用简单的map集合来实现购物车通过分析我们知道,如果想获取用户的购物车,且是自己的购物车,里面寄存了我们曾购买的物品属性和数量,我们想到了session这个对象,先来了解下session,以下资料借鉴网络 
一个session就是一系列某用户和服务器间的通讯。服务器有能力分辨出不同的用户。一个session的建立是从一个用户向服务器发第一个请求开始,而以用户显式结束或session超时为结束。 

其工作原理是这样的: 

1.当一个用户向服务器发送第一个请求时,服务器为其建立一个session,并为此session创建一个标识号; 

2.这个用户随后的所有请求都应包括这个标识号。服务器会校对这个标识号以判断请求属于哪个session。 

这种机制不使用IP作为标识,是因为很多机器是通过代理服务器方式上网,没法区分每一台机器。 

对于session标识号(sessionID),有两种方式实现:cookies和URL重写。 


简单的了解之后,先分析下思路,当用户点击”加入到购物车”时,假使我从session取得购物车,首先要判断用户是不是第一次购物,如果是第一次购物,我们需要为用户创建购物车,如果不是则需要判断用户所选择的商品购物车里有没有(我们可以获取map的对象,我们迭代里面的商品,通过OID判断是不是为同一商品,或者通过其他方法获取到商品),如果没有我们需要在购物车里添加商品,如果有的话我们去得商品的数量,再+,在放回购物车里即可完成一次购物.最后把购物车放在session域中.代码实现如下: 

JSP页面源代码为:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page  import="cn.itcast.utils.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'product.jsp' starting page</title>
</head>
<body>
<h1>购物页面</h1>
<img src="/day11/img/1.jpg"/> <a href="/day11/sessionDemo2?id=1">加入到购物车</a>
<img src="/day11/img/2.jpg"/> <a href="/day11/sessionDemo2?id=2">加入到购物车</a>
<img src="/day11/img/3.jpg"/> <a href="/day11/sessionDemo2?id=3">加入到购物车</a>
<img src="/day11/img/4.jpg"/> <a href="/day11/sessionDemo2?id=4">加入到购物车</a>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

Java代码是:
package cn.itcast.session;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 使用session实现购物车
* @author 柳成风
*/
public class SessionDemo2 extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 1、获取到id
* 2、得到商品名称创建一个数组
* 3、判断是否是第一次购物 (得到session,是否为空)
* 创建一个购物车 使用map<String,Integer>
*  把商品名称和数量1放入到购物车
* 4、不是第一次购物
* 判断是否有相同名称的session值
* 有相同的,得到商品的数量+1
* 没有,直接吧商品名称和数量加入到购物车
* 5、把购物车(map)放入到session里面
*/

//获取id
String id1 = request.getParameter("id");
//把string转换成int
int id = Integer.parseInt(id1);
//得到商品的名称,数组代替数据库
String[] names = {"手电","电视","冰箱","手机"};
//根据获取value
String name = names[id-1];
//判断是否是第一次购物 cart
getAttribute(java.lang.String name)
@SuppressWarnings("unchecked")
Map<String,Integer> map = (Map<String, Integer>)request.getSession().getAttribute("cart");
//判断map是否为空
if(map == null) {//第一次购物
//创建购物车
map = new HashMap<String,Integer>();
//把商品名称和数量放入到map中(购物车中)
map.put(name, 1);
} else { //不是第一次购物
//判断是否有相同名称session
//第一种方式可以遍历
if(map.containsKey(name)) {//有相同名称的key
//得到商品的数量,+1
int num = map.get(name);
//把num+1,放到购物车
map.put(name, num+1);
} else { //没有相同的key
//直接把商品名和数量1添加到购物车
map.put(name, 1);
}
}
//把购物车放到session里面
request.getSession().setAttribute("cart", map);
//向页面输出两个超链接 一个是继续购物 ,一个是结算
//处理中文乱码
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("<a href='/day11/session/product.jsp'>继续购物</a>" +
" <a href='/day11/session/cart.jsp'>结算</a>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76

购物车创建完毕,已经放进session中,同时向jsp页面相应.jsp页面源码为:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>My JSP 'cart.jsp' starting page</ti
b5bb
tle>

</head>

<body>
<h2>商品结算</h2>
<h3><a href="/day11/sessionDemo3">清空购物车</a></h3>
<%
//获取session里面商品信息
Map<String,Integer> map = (Map<String,Integer>)request.getSession().getAttribute("cart");
//判断map是否为空
if(map == null) {
%>
<h3>没有任何购物信息</h3>
<%
} else {
//现在map里面存储的是商品名称和数量
//遍历map   两种 :1 获取所有key;2 获取key-value关系
Set<String> set = map.keySet();//所有商品的名称
//遍历set  两种 增强for  迭代
for(String name : set) {
//得到value值(商品数量)
int num = map.get(name);
%>
<h3>商品名称 :<%=name %>,商品数量:<%=num %></h3>
<%
}
}
%>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: