一、作用域范围
- Request 保存的键值仅在下一个request对象中可以得到,作用于两个有请求关系的页面
- Session 它是一个会话范围,相当于一个局部变量,从Session第一次创建直到关闭,数据都一直 保存,每一个客户都有一个Session,所以它可以被客户一直访问,只要Session没有关闭和超时即浏览器关闭。同一个浏览器对象。
- servletContext 它代表了servlet环境的上下文,相当于一个全局变量,即只要某个web应用在启动中,这个对象就一直都有效的存在,所以它的范围是最大的,存储的数据可以被所有用户使用,只要服务器不关闭,数据就会一直都存在。同一个服务器对象
二、具体应用
- scopeServlet.java 设置各值(scopeServlet.java 和getScopeServlet.java没有请求关系,即两者没有互相跳转)
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setAttribute("num", "10"); request.getSession().setAttribute("num", "100"); this.getServletContext().setAttribute("num", "1000");}
- getScopeServlet.java 获取设置的值
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println(request.getAttribute("num")); System.out.println(request.getSession().getAttribute("num")); System.out.println(this.getServletContext().getAttribute("num")); }
结果 :
1. 先访问scopeServlet.java,再访问getScopeServlet.java,
![](https://images2015.cnblogs.com/blog/1072930/201703/1072930-20170302211315626-100315179.png)
可见,requst的值是空的,因为两个页面没有请求关系,所以requst的值无法传递。
2. 在1的操作之后,关闭浏览器 ,再打开 然后访问getScopeServlet.java
![](https://images2015.cnblogs.com/blog/1072930/201703/1072930-20170302211354720-989156850.png)
可见,requst的值依旧空,但session对象的值也消失了,因为一个浏览器只有一个session对象。
3. 重启服务器,然后访问getScopeServlet.java
全部值都是空的。
三、注意
- 要实现scopeServlet.java和getScopeServlet.java的跳转即请求,只需要在scopeServlet.java文件中添加request.getRequestDispatcher("getscope").forward(request,response);
-
首先说明一点,在通常意义上,session所能发挥作用是基于cookie机制。针对所需要解释的问题,做这样一个假设:我们第一次访问一个网页。当客户端发送请求后,服务端会建立一个针对此请求发出客户的session对象,而且每个session都会有一个sessionID。服务端会自动将这个sessionID作为一个cookie附加到response上返回给客户端,这个cookie存放在浏览器内存中。我们每次对此网页发送的request都会附带着这个cookie,服务端收到这个请求后会都去cookie中取得这个sessionID,然后查询服务端是否存在一个对应此ID的session对象。如果有,可以直接使用此session;如果没有,则会新建一个。当浏览器关闭后,其所占的内存就会是放掉,cookie自然也就被清除了,此时我们不再保存有这个sessionID。所以再打开浏览器访问同一个页面时,由于没有sessionID,也就查不到对应的session对象,此时重新创建一个新的session对象。那当我们关闭浏览器之后,服务器端原来的session对象是否还存在呢?答案是肯定的。服务端根本不知道我们是否关闭了浏览器,也不关心这个。客户端与服务端之间进行通信的唯一途径就是通过请求。服务器有自己的一套机制来管理session,比如多长时间会清除没有使用过的session对象,等等。所以说,关闭浏览器session就被清除只是我们所看到的表面现象(实际上是新建了一个session对象),通常情况下,服务器并不会马上清除session对象,但这个根据服务端的设定而不同。PS:cookie一般分为两种:一种是会话cookie,即服务端为session自动创建的cookie,这个cookie存放在浏览器进程中。另一种是可以存放在硬盘上的,可以通过服务端的某些设置,将一些信息放到cookie中并返回给客户端存放在硬盘上。