Session入门实例
session对象(是JSP的9大内置对象之一):
(1)session代表一次用户会话:从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开为止,这个过程就是一次会话。
(2)session作用:通常用来跟踪用户的会话信息,如判断用户是否登录系统,或者在购物车应用中,用于跟踪用户购买的商品等
用session对象来保证itemMap对象在一次会话中有效,这是对购物车可以反复购买,只要浏览器不关闭,购买的商品信息就不会丢失。
例子1:
(1)shop.jsp
1 <%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 4 <head> 5 <title>选择物品购买</title> 6 </head> 7 8 <body> 9 <form method="post" action="processBuy.jsp"> 10 书籍:<input type="checkbox" name="item" value="book"/><br/> 11 电脑:<input type="checkbox" name="item" value="computer"/><br/> 12 汽车:<input type="checkbox" name="item" value="car"/><br/> 13 <input type="submit" value="购买"> 14 </form> 15 </body> 16 </html>
(2)processBuy.jsp
1 <%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> 2 <%@ page import="java.util.*" %> 3 <% 4 //取出session范围的itemMap属性,Map<String, Integer> itemMap为对象,getAttribute("itemMap")为属性 5 Map<String, Integer> itemMap = (Map<String, Integer>)session.getAttribute("itemMap"); 6 //如果对象为空,则初始化对象 7 if (itemMap == null) { 8 /* 9 public class HashMap<K,V> 10 extends AbstractMap<K,V> 11 implements Map<K,V>, Cloneable, Serializable 12 */ 13 itemMap = new HashMap<String, Integer>(); 14 itemMap.put("书籍", 0); 15 itemMap.put("汽车", 0); 16 itemMap.put("电脑", 0); 17 } 18 //获取上一个页面的请求参数 19 String[] buys = request.getParameterValues("item"); 20 //遍历数组的各元素 21 for (String item : buys) { 22 //如果item为book,表示选择书籍购买 23 if (item.equals("book")) { 24 int num1 = itemMap.get("书籍"); 25 itemMap.put("书籍", num1+1); 26 } 27 else if (item.equals("computer")) { 28 int num2 = itemMap.get("电脑"); 29 itemMap.put("电脑", num2+1); 30 } 31 else if (item.equals("car")) { 32 int num3 = itemMap.get("书籍"); 33 itemMap.put("汽车", num3+1); 34 } 35 } 36 //将itemMap对象放到设置成session范围的itemMap属性 37 session.setAttribute("itemMap", itemMap); 38 %> 39 40 <html xmlns="http://www.w3.org/1999/xhtml"> 41 <head> 42 <title>new document</title> 43 </head> 44 <body> 45 您所购买的物品:<br/> 46 书籍:<%=itemMap.get("书籍")%>本<br/> 47 电脑:<%=itemMap.get("电脑")%>台<br/> 48 汽车:<%=itemMap.get("汽车")%>辆<br/> 49 50 <p><a href="shop.jsp">再次购买</a></p> 51 </body> 52 </html>
演示:
说明:
1、用户打开浏览器购买了1台电脑(session对象为购物车里的数据:书籍0,电脑1,汽车0,此session对象保存在服务器的内存中),这个第一个请求;用户点击再次购买,选择电脑和汽车后提交,此时服务器会从session对象里取出购物车里的数据:书籍0,电脑1,汽车0,并和本次请求购买的数据(数据0,电脑1,汽车1)相加,并再次保存session对象。
2、
第一次请求进来会先执行:
36 //将itemMap对象放到设置成session范围的itemMap属性 37 session.setAttribute("itemMap", itemMap);
第二次请求进来,则执行:
4 //取出session范围的itemMap属性,Map<String, Integer> itemMap为对象,getAttribute("itemMap")为属性 5 Map<String, Integer> itemMap = (Map<String, Integer>)session.getAttribute("itemMap");
JSP对应的Servlet有session的初始化:JSP的session对象对应Servlet的javax.servlet.http.HttpSession
注意:
1、考虑到session本身的目的,通常只应该把用户会话状态相关的信息放入session范围内;不要仅仅为了两个页面交换信息,就将该信息放入session范围内(此时可以将信息放入request范围内,然后forward请求即可)
2、session机制通常用于保存客户端的状态信息,这些状态信息需要保存到Web服务器的硬盘上,所以要求session里的属性值必须是可序列化的。