简单一句是信息共享的范围,也就是信息在多大的范围内是有效的。
application:服务器启动到停止这段时间。
session:HTTP会话开始到结束这段时间。
request:HTTP请求开始到结束这段时间。
page:当前页面从打开到关闭这段时间。
request 请求对象 类型javax.servlet.ServletRequest 作用域Request
response 响应对象 类型javax.servlet.SrvletResponse 作用域Page
pageContext 页面上下文对象 类型 javax.servlet.jsp.PageContext 作用域 Page
session 会话对象 类型javax.servlet.http.HttpSession 作用域Session
application 应用程序对象 类型 javax.servlet.ServletContext 作用域 Application
out 输出对象 类型javax.servlet.jsp.JspWriter 作用域Page
config 配置对象 类型javax.servlet.ServletConfig 作用域Page
page 页面对象 类型 javax.lang.Object 作用域 Page
exception 例外对象 类型 javax.lang.Throwable 作用域 page
1. application 作用域:存活时间最长
application作用域就是应用启动到关闭的整段时间,我们没有说“从服务器启动,到服务器关闭”,是因为一个服务器可能部署多个应用,当然你关闭了服务器,就会把上面所有的应用都关闭了。
application作用域上的信息传递是通过ServletContext实现的,它提供的主要方法如下所示:
Object getAttribute(String name):从application中获取信息。void setAttribute(String name, Object value):向application作用域中设置信息
application里的变量可以被所有用户共用,因此当有用户修改变量后,其他用户访问的将是修改后的值。
2. session作用域
当前会话,就是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。这个过程可能包含多个请求响应。也就是说,只要用户不关浏览器,服务器就有办法知道这些请求是一个人发起的,整个过程被称为一个会话(session),而放到会话中的变量,就可以在当前会话的所有请求里使用。
session作用域比较容易理解,同一浏览器对服务器进行多次访问,在这多次访问之间传递信息,就是session作用域的体现。
session是通过HttpSession接口实现的:
Object HttpSession.getAttribute(String name):从session中获取信息。
void HttpSession.setAttribute(String name, Object value):向session中保存信息。HttpSession HttpServletRequest.getSession():获取当前请求所在的session的对象。
判断浏览器是否关闭:如果一定的时间内客户端没有反应,则认为会话结束。Tomcat的默认值为120分钟,但这个值也可以通过HttpSession的setMaxInactiveInterval(int interval)方法来设置,如果想主动让会话结束,例如用户单击"注销"按钮的时候,可以使用 HttpSession 的 invalidate()方法,用于强制结束当前session。
3. request作用域
指从http请求发起,到服务器处理结束,返回响应的整个过程
void setAttribute(String name, Object value):将对象value以name为名称保存到request作用域中。
Object getAttribute(String name):从request作用域中取得指定名字的信息。
JSP中的doGet()、doPost()方法的第一个参数就是HttpServletRequest对象,使用这个对象的 setAttribute()方法即可传递信息。
那么在设置好信息之后,要通过何种方式将信息传给其他的Servlet呢?这就要用到RequestDispatcher接口的forward()方法,通过它将请求转发给其他Servlet。
RequestDispatcher ServletContext.getRequestDispatcher(String path):取得Dispatcher以便转发。
path为转发的目的Servlet。
void RequestDispatcher.forward(ServletRequest request, ServletResponse response):
将request和response转发。
因此,只需要在当前Servlet中先通过setAttribute()方法设置相应的属性,然后使用forward()方法进行跳转,最后在跳转到的Servlet中通过使用getAttribute()方法即可实现信息传递。
注意:转发不是重定向,转发是在Web应用内部进行的。转发对浏览器是透明的,也就是说,无论在服务器上如何转发,浏览器地址栏中显示的仍然是最初那个Servlet的地址。
4. page作用域
page对象的作用范围仅限于用户请求的当前页面,对于page对象的引用将在响应返回给客户端之后被释放,或者在请求被转发到其他地方后被释放。对page对象的引用通常存储在pageContext对象中。
以上介绍的作用范围越来越小,request和page的生命周期都是短暂的,它们之间的区别:一个request可以包含多个page页(include,forward及filter)。