2.6.8 session对象
session
对象也是一个非常常用的对象,这个对象代表一次用户会话。一次用户会话的含义是:从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开为止,这个过程就是一次会话。
session
通常用于跟踪用户的会话信息,如判断用户是否登录系统,或者在购物车应用中,用于跟踪用户购买的商品等。
session
范围内的属性可以在多个页面的跳转之间共享。一旦关闭浏览器,即session
结束,session
范围内的属性将全部丢失。
session
对象是Httpsession
的实例,HttpSession
有如下两个常用的方法。
session方法 |
描述 |
setAttribute(String attName, Object attValue) |
设置session 范围内attName 属性的值为attValue . |
getAttribute(String attName) |
返回session 范围内attName 属性的值 |
shop.jsp
下面的示例演示了一个购物车应用,以下是陈列商品的JSP
页面代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <%@ page contentType="text/html; charset=UTF-8" language="java" errorPage="" %> <!DOCtype html> <html> <head> <title> 选择物品购买 </title> </head> <body> <form method="post" action="processBuy.jsp"> 书籍:<input type="checkbox" name="item" value="book"/><br/> 电脑:<input type="checkbox" name="item" value="computer"/><br/> 汽车:<input type="checkbox" name="item" value="car"/><br/> <input type="submit" value="购买"/> </form> </body> </html>
|
这个页面几乎没有动态的JSP
部分,全部是静态的HTML
内容。该页面包含一个表单,表单里包含三个复选按钮,用于选择想购买的物品,表单由processBuy.jsp
页面处理,其页面的代码如下。
processBuy.jsp
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
| <%@ page contentType="text/html; charset=UTF-8" language="java" %> <%@ page import="java.util.*"%> <%
Map<String,Integer> itemMap = (Map<String,Integer>)session .getAttribute("itemMap");
if (itemMap == null) { itemMap = new HashMap<String,Integer>(); itemMap.put("书籍" , 0); itemMap.put("电脑" , 0); itemMap.put("汽车" , 0); }
String[] buys = request.getParameterValues("item");
for (String item : buys) { if(item.equals("book")) { int num1 = itemMap.get("书籍").intValue(); itemMap.put("书籍" , num1 + 1); } else if (item.equals("computer")) { int num2 = itemMap.get("电脑").intValue(); itemMap.put("电脑" , num2 + 1); } else if (item.equals("car")) { int num3 = itemMap.get("汽车").intValue(); itemMap.put("汽车" , num3 + 1); } }
session.setAttribute("itemMap" , itemMap); %> <!DOCTYPE html> <html> <head> <title> 购买的物品列表 </title> </head> <body> 您所购买的物品:<br/> 书籍:<%=itemMap.get("书籍")%>本<br/> 电脑:<%=itemMap.get("电脑")%>台<br/> 汽车:<%=itemMap.get("汽车")%>辆 <p><a href="shop.jsp">再次购买</a></p> </body> </html>
|
以上页面中粗体字代码使用session
来保证itemMap
对象在一次会话中有效,这使得该购物车系统可以反复购买,只要浏览器不关闭,购买的物品信息就不会丢失,图2.31显示的是多次购买后的效果。
考虑session
本身的目的,通常只应该把与用户会话状态相关的信息放入session
范围内。不要仅仅为了两个页面之间交换信息,就将该信息放入session
范围内。如果仅仅为了两个页面交换信息,可以将该信息放入request
范围内,然后forward
请求即可.
session里面的属性必须可序列化
关于session
还有一点需要指出,session
机制通常用于保存客户端的状态信息,这些状态信息需要保存到web
服务器的硬盘上,所以要求session
里的属性值必须是可序列化的,否则将会引发不可序列化的异常。
session
的属性值可以是任何可序列化的Java
对象。