Session对象

前面我们提到了jsp的9个内建对象，下面我们要详细解释的是session对象。

对于一个网站，一个访问者可能访问好几个页面和进行多个操作。如果是你在制作这个网站，你肯定希望给每个访问者关联上一些数据，这就是jsp的session对象要做的事。

Session对象直接与访问者关联，数据可以放入session，也可以从中检索出来，就像一个hash表。没有访问者将有其独立的一个session数据集。

它是与request相关的一个javax.servlet.http.HttpSession对象，作用范围为会话期内。会话(sessions)是自动建立的，因此，即使没有引入会话，这个变量也是开启的，除非在指令元素page属性中将会话关闭，在这种情况下，如果要参照会话就会在JSP转译成Servlet时出错。

session对象用来保存每个用户信息，以便跟踪每个用户的操作状态。其中，session信息保存在容器中，session的ID保存在客户机的cookie中。在许多服务器上，如果浏览器支持cookies，就直接使用cookies。

但若不支持cookies，那么就会自动转化为URL-rewriting（重写URL，这个URL包含客户端的信息），session自动为每个流程提供了方便的存储信息的方法。下面列出了session对象常用的方法。

举一个例子，在开始页面要求用户输入账户信息，验证合法后，若其它页面需要使用账户信息，就不需要用户再次输入，而可以从session对象中获取。对于session对象，常用的方法是setAttribute()、getAttribute()和removeAttribute()，分别可以对session中的对象进行存取和删除。利用session的特性，可以用它实现网上购物，如图所示：

图 购物页面示例

下面是使用session对象实现简易购物车的例子。首先，在session-1.jsp中，session对象使用属性“shop”和“price”保存了“主板”和“100”，源程序如下：

1. <%@ page contentType="text/html;charset=GBK" %>

2. <HTML>

3. <HEAD>

4. </HEAD>

5. <% // 初始化

6. If(session.getAttribute("flag")== null){

7. session.setAttribute("flag", "ok");

8. session.setAttribute("shop", "");

9. session.setAttribute("price", "");

10. }

11. session.setAttribute("shop", session.getAttribute("shop")+"主板，");

12. session.setAttribute("price", session.getAttribute("price")+"100，");

13. out.println(session.getAttribute("shop")+ "<br>");

14. out.println(session.getAttribute("price")+"<br>");

15. %>

16. <BODY>

17. <A href="session-2.jsp">session-2.jsp</A>

18. </BODY>

其页面显示效果如图所示。

图 简易购物车

单击session-2.jsp链接，页面跳转到session-2.jsp。在此页面中，修改了session对象的属性值，其源程序如下：

1. <%@ page contentType="text/html;charset=GBK" %>

2. <HTML>

3. <HEAD>

4. </HEAD>

5. <%

6. session.setAttribute("shop",session.getAttribute("shop")+"硬盘，");

7. session.setAttribute("price",session.getAttribute("price")+"200，");

8. out.println(session.getAttribute("shop")+ "<br>");

9. out.println(session.getAttribute("price")+ "<br>");

10. %>

11. <BODY>

12. <A href="session-3.jsp">session-3.jsp</A>

13. </BODY>

14. </HTML>

页面显示效果如图所示：

图 简易购物车