jsp的4大作用域

首先要声明一点,所谓“作用域”就是“信息共享的范围”,也就是说一个信息能够在多大的范围内有效。4个JSP内置对象的作用域分别为:application、session、request、page 。JSP内置对象作用域表如下:

名称

作用域

application

在所有应用程序中有效

session

在当前会话中有效

request

在当前请求中有效

page

在当前页面有效

Web交互的最基本单位为HTTP请求。每个用户从进入网站到离开网站这段过程称为一个HTTP会话,一个服务器的运行过程中会有多个用户访问,就是多个HTTP会话。作用域解释如下。

application 作用域

如果把变量放到application里,就说明它的作用域是application,它的有效范围是整个应用。 整个应用是指从应用启动,到应用结束。我们没有说“从服务器启动,到服务器关闭”,是因为一个服务器可能部署多个应用,当然你关闭了服务器,就会把上面所有的应用都关闭了。 application作用域里的变量,它们的存活时间是最长的,如果不进行手工删除,它们就一直可以使用。

application作用域上的信息传递是通过ServletContext实现的,它提供的主要方法如下所示:

Object getAttribute(String name)  //从application中获取信息;

void setAttribute(String name, Object value)  //向application作用域中设置信息。

session作用域

session作用域比较容易理解,同一浏览器对服务器进行多次访问,在这多次访问之间传递信息,就是session作用域的体现。如果把变量放到session里,就说明它的作用域是session,它的有效范围是当前会话。所谓当前会话,就是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。这个过程可能包含多个请求响应。也就是说,只要用户不关浏览器,服务器就有办法知道这些请求是一个人发起的,整个过程被称为一个会话(session),而放到会话中的变量,就可以在当前会话的所有请求里使用。 
 session是通过HttpSession接口实现的,它提供的主要方法如下所示:

Object HttpSession.getAttribute(String name)  //从session中获取信息。

void HttpSession.setAttribute(String name, Object value)//向session中保存信息。

HttpSession HttpServletRequest.getSessio()  //获取当前请求所在的session的对象。

session的开始时刻比较容易判断,它从浏览器发出第一个HTTP请求即可认为会话开始。但结束时刻就不好判断了,因为浏览器关闭时并不会通知服务器,所以只能通过如下这种方法判断:如果一定的时间内客户端没有反应,则认为会话结束。Tomcat的默认值为120分钟,但这个值也可以通过HttpSession的setMaxInactiveInterval()方法来设置:

void setMaxInactiveInterval(int interval)

如果想主动让会话结束,例如用户单击“注销”按钮的时候,可以使用 HttpSession 的 invalidate()方法,用于强制结束当前session:void invalidate()

request作用域

一个HTTP请求的处理可能需要多个Servlet合作,而这几个Servlet之间可以通过某种方式传递信息,但这个信息在请求结束后就无效了。request里的变量可以跨越forward前后的两页。但是只要刷新页面,它们就重新计算了。如果把变量放到request里,就说明它的作用域是request,它的有效范围是当前请求周期。 所谓请求周期,就是指从http请求发起,到服务器处理结束,返回响应的整个过程。在这个过程中可能使用forward的方式跳转了多个jsp页面,在这些页面里你都可以使用这个变量。

Servlet之间的信息共享是通过HttpServletRequest接口的两个方法来实现的:

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()方法即可实现信息传递。

需要注意两点:

1、转发不是重定向,转发是在Web应用内部进行的。

2、转发对浏览器是透明的,也就是说,无论在服务器上如何转发,浏览器地址栏中显示的仍然是最初那个Servlet的地址。

page作用域

page对象的作用范围仅限于用户请求的当前页面,对于page对象的引用将在响应返回给客户端之后被释放,或者在请求被转发到其他地方后被释放。page里的变量只要页面跳转了,它们就不见了。如果把变量放到pageContext里,就说明它的作用域是page,它的有效范围只在当前jsp页面里。从把变量放到pageContext开始,到jsp页面结束,你都可以使用这个变量。

以上介绍的作用范围越来越小,request和page的生命周期都是短暂的,它们之间的区别:一个request可以包含多个page页(include,forward及filter)。

为了让大家更容易理解application、session、request、page 4个对象的作用范围,我们给出两个程序来进行详细说明。

【程序1】page01.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <jsp:useBean id="pagevar" scope="page" class="java.lang.StringBuffer"/>
  5. <jsp:useBean id="requestvar" scope="request" class="java.lang.StringBuffer"/>
  6. <jsp:useBean id="sessionvar" scope="session"  class="java.lang.StringBuffer"/>
  7. <jsp:useBean id="applicationvar" scope="application"  class="java.lang.StringBuffer"/>
  8. <html>
  9. <head>
  10. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  11. <title>JSP内置对象作用域</title>
  12. </head>
  13. <body>
  14. <%
  15. pagevar.append("page01");
  16. requestvar.append("page01");
  17. sessionvar.append("page01");
  18. applicationvar.append("page01");
  19. %>
  20. <jsp:forward page="page02.jsp"/>
  21. </body>
  22. </html>

【程序2】page02.jsp

  1. <%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <jsp:useBean id="pagevar" scope="page" class="java.lang.StringBuffer"/>
  5. <jsp:useBean id="requestvar" scope="request" class="java.lang.StringBuffer"/>
  6. <jsp:useBean id="sessionvar" scope="session" class="java.lang.StringBuffer"/>
  7. <jsp:useBean id="applicationvar" scope="application" class="java.lang.StringBuffer"/>
  8. <html>
  9. <head>
  10. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  11. <title>JSP内置对象作用域</title>
  12. </head>
  13. <body>
  14. <%
  15. pagevar.append("page02");
  16. requestvar.append("page02");
  17. sessionvar.append("page02");
  18. applicationvar.append("page02");
  19. %>
  20. page = <%=pagevar.toString()%><br/>
  21. request = <%=requestvar.toString()%><br/>
  22. session = <%=sessionvar.toString()%><br/>
  23. application = <%=applicationvar.toString()%><br/>
  24. </body>
  25. </html>

测试步骤以及结果分析:

1、直接运行程序1的结果为:(图1)

我们看到,page的作用域的值为page02,说明确实只在当前的页面起作用,即跳转到的page2页面;request的作用域在当前请求中有效,所以其值为程序1和跳转到程序2之和;session的作用域为当前会话,所以其值也是程序1和跳转到程序2之和;而application对所有应用有效,也就是只要在应用,都要叠加,即程序1中的值与程序2中的值的叠加;

2、不要关闭程序1运行的浏览器,直接运行程序2,其结果为:(图2)

对比图1的结果,我们发现page作用域没有变化,它的值只是程序2里的值;request作用域仅在当前请求作用,故也以程序2的值为准,变成page02;session的作用域为当前会话,因为运行程序1的浏览器保持着,说明还处于同一会话中,所以要在之前的基础上叠加上一个page02;而application对所有应用有效,也就是只要在应用,都要叠加,即在之前的基础上叠加上一个程序2的page02;

3、将上两步运行程序1和程序2的浏览器关闭,但不关闭服务器,重新运行程序2,其结果如下:

对比之前的结果,我们发现page作用域依旧没有变化,它的值只是程序2即所在页面里的值;request作用域仅在当前请求作用,故也以程序2的值为准,变成page02;session的作用域为当前会话,因为前两步运行程序的浏览器关闭了,说明之前的会话都结束了,所以其值恢复成当前的程序2里的值page02;而application对所有应用有效,也就是只要在应用即服务器还没重启清空,都要叠加,即在之前的基础上再叠加上一个程序2的page02;

参考:

JSP的四个作用域 - CSDN博客
http://blog.csdn.net/koches/article/details/7785438

jsp的4大作用域的更多相关文章

  1. JSP的九大对象和四大作用域

    1.JSP中九大内置对象为: request            请求对象          类型 javax.servlet.ServletRequest        作用域   Request ...

  2. Java Web(五) JSP详解(四大作用域九大内置对象等)

    前面讲解了Servlet,了解了Servlet的继承结构,生命周期等,并且在其中的ServletConfig和ServletContext对象有了一些比较详细的了解,但是我们会发现在Servlet中编 ...

  3. 四大域对象,和jsp的九大隐式对象,已经el表达式的11个隐式对象

    四大域对象 1.PageContext :页面范围的数据 2.ServletRequest:请求范围的数据 3.HttpSession:回话范围的数据 4.ServletContext:应用范围的数据 ...

  4. node的3大作用域

    除了持久性存储外,想要内存也可以存入数据,来做计算什么数据都存入访问一便数据库,效率就太低了 java有3大作用域request 指在一次请求的全过程中有效,即从http请求到服务器处理结束,返回响应 ...

  5. jsp的4个作用域区别( pageScope、requestScope、sessionScope、applicationScope)

    简单描述 page里的变量没法从index.jsp传递到test.jsp.只要页面跳转了,它们就不见了. request里的变量可以跨越forward前后的两页.但是只要刷新页面,它们就重新计算了.  ...

  6. 【转载】JSP详解(四大作用域九大内置对象等)

    前面讲解了Servlet,了解了Servlet的继承结构,生命周期等,并且在其中的ServletConfig和ServletContext对象有了一些比较详细的了解,但是我们会发现在Servlet中编 ...

  7. web开发(五) JSP详解(四大作用域九大内置对象等)

    在网上看见一篇不错的文章,写的详细. 以下内容引用那篇博文.转载于<http://www.cnblogs.com/whgk/p/6427759.html>,在此仅供学习参考之用. 一.JS ...

  8. JSP的四个作用域

    JSP的作用域一般是对于变量而言的,描述的是变量在某处是否有效(可用) JSP的四个作用域       名称          作用域       page 当前页面有效 request 当前请求中有 ...

  9. 牛客网Java刷题知识点之什么是JSP的3大常用指令、JSP的6大哪些动作、JSP中include指令和include动作有什么区别

    不多说,直接上干货! JSP的3大常用指令 包含指令(Include directive):用来包含文件和合并文件内容到当前的页面. 页面指令(Page directive):用来定义JSP页面中特定 ...

随机推荐

  1. POJ 3104 Drying [二分 有坑点 好题]

    传送门 表示又是神题一道 Drying Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9327   Accepted: 23 ...

  2. golang log日志

    写入日志文件 func main() { file, err := os.Create("test.log") if err != nil { log.Fatalln(" ...

  3. UVA 111

    又被题意坑了... 输入的一串数字的含义是第i个数字是第a[i]个发生的.而不是编号为i的历史事件的实际发生顺序.所以第一步要做的是转换,将原始数据转换成编号为i的历史事件的实际发生顺序.然后按照实际 ...

  4. iOS Block学习

    iOS4已经直接支持blocks,很有必要学习一下. 在ios中,将blocks当成对象来处理,它封装了一段代码,这段代码可以在任何时候执行.Blocks可以作为函数参数或者函数的返回值,而其 本身又 ...

  5. 利用背景流量数据(contexual flow data) 识别TLS加密恶意流量

    识别出加密流量中潜藏的安全威胁具有很大挑战,现已存在一些检测方法利用数据流的元数据来进行检测,包括包长度和到达间隔时间等.来自思科的研究人员扩展现有的检测方法提出一种新的思路(称之为“dataomni ...

  6. 数据库系统学习(八)-SQL语言与数据库完整性和安全性

    第八讲 SQL语言与数据库完整性 重难点 数据库完整性的概念 关系数据库 防止和避免数据库中不合理数据的出现 输入错误,操作失误,程序处理错误等 完整性约束条件的一般形式 对O操作集合,当出现A情况时 ...

  7. ubuntu uninstall postgres

    Steps that worked for me on Ubuntu 8.04.2 to remove postgres 8.3 List All Postgres related packages ...

  8. ZT:CSS实现水平|垂直居中漫谈

    有篇博客园网友‘云轩奕鹤’的文章不错,转载在这里以供需要时查阅. http://www.cnblogs.com/jadeboy/p/5107471.html

  9. 集成CCFlow工作流与GPM的办公系统驰骋CCOA介绍(三)

    通过组织结构能够对项目的岗位.部门.人员进行增删改操作. 加入新部门.并为新部门加入人员: 选中部门后,点击鼠标右键,能够选择加入平级部门或下属部门. 新建部门时,须要给部门设置部门编号.名称.与部门 ...

  10. 传奇的诞生,PHP三位创始人简介

    PHP到现在为止已经诞生12年了.在这期间它经过不断改善,已经成为Web开发最重要的语言之一.PHP能有今天这样的成就,它的3位创始人(Rasmus Lerdorf.Zeev Suraski和Andi ...