Home JSP九大内置对象及四大作用域
Post
Cancel

JSP九大内置对象及四大作用域

JSP九大内置对象

1
2
3
4
5
6
7
8
9
request     请求对象       类型javax.servlet.ServletRequest   作用域 Request
response    响应对象       类型javax.servlet.ServletResponse  作用域 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.servlet.Object           作用域 Page
exception   例外对象       类型javax.servlet.Throwable        作用域 Page

exception对象则代表了JSP文件运行时所产生的例外对象,此对象不能在一般JSP文件中直接使用,而只能在使用了<%@ page isErrorPage="true"%>的JSP文件中使用。

JSP四大域对象

JSP九大内置对象中有四大域对象,范围小到大

1
2
3
4
page(PageContext,JSP有效)              指pageContext(javax.servlet.jsp.PageContext)
request(一次请求)                指HttpServletRequest(javax.servlet.ServletRequest)
session(一次会话)                       指HttpSession(javax.servlet.http.HttpSession)
application(ServletContext,当前web应用) 指application(javax.servlet.ServletContext)

Servlet三大域对象

  • request
  • session
  • application

实验

大概流程是这样的,我们访问index.jsp的时候,分别对pageContext,request,session,application四个作用域中的变量进行累加。(当然先判断这个变量是不是存在,如果变量不存在,则要把变量初始化成1)。计算完成后就从index.jsp执行forward跳转到test.jsp。在test.jsp里再进行一次累加,然后显示出这四个整数来。

从显示的结果来看,我们可以直观的得出结论:

  • page里的变量没法从index.jsp传递到test.jsp。只要页面跳转了,它们就不见了。
  • request里的变量可以跨越forward前后的两页。但是只要刷新页面,它们就重新计算了。
  • session和application里的变量一直在累加,开始还看不出区别,只要关闭浏览器,再次重启浏览器访问这页,session里的变量就重新计算了。
  • application里的变量一直在累加,除非你重启Tomcat,否则它会一直变大。

作用域规定的是变量的有效期限:

  • 如果把变量放到pageContext里,就说明它的作用域是page,它的有效范围只在当前JSP页面里。从把变量放到PageContext开始,到JSP页面结束,你都可以使用这个变量。
  • 如果把变量放到request里,就说明它的作用域是request,它的有效范围是当前请求周期。所谓请求周期,就是指从HTTP请求发起,到服务器处理结束,返回响应的整个过程。在这个过程中可能使用forward的方式跳转了多个JSP页面,在这些页面里你都可以使用这个变量。
  • 如果把变量放到session里,就说明它的作用域是session,它的有效范围是当前会话。所谓当前会话,就是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。这个过程可能包含多个请求响应。也就是说,只要用户不关浏览器,服务器就有办法知道这些请求是一个人发起的,整个过程被称为一个会话(session),而放到会话中的变量,就可以在当前会话的所有请求里使用。
  • 如果把变量放到application里,就说明它的作用域是application,它的有效范围是整个应用。整个应用是指从应用启动,到应用结束。我们没有说“从服务器启动,到服务器关闭”,是因为一个服务器可能部署多个应用,当然你关闭了服务器,就会把上面所有的应用都关闭了。application作用域里的变量,它们的存活时间是最长的,如果不进行手工删除,它们就一直可以使用。

与上述三个不同的是,application里的变量可以被所有用户共用。如果用户甲的操作修改了application中的变量,用户乙访问时得到的是修改后的值。这在其他作用域中都是不会发生的,page,request,session都是完全隔离的,无论如何修改都不会影响其他人的数据。

作用域的生命周期和作用范围

  • application(ServletContext)
    • 生命周期:当Web应用被加载进容器时创建代表整个web应用的ServletContext对象,当服务器关闭或Web应用被移除时,ServletContext对象跟着销毁。
    • 作用范围:整个Web应用。
  • request
    • 生命周期:在service 方法调用前由服务器创建,传入service方法。整个请求结束,request生命结束。
    • 作用范围:整个请求链(请求转发也存在)。
  • session
    • 生命周期:在第一次调用 request.getSession() 方法时,服务器会检查是否已经有对应的session,如果没有就在内存中创建一个session并返回。当一段时间内session没有被使用(默认为30分钟),则服务器会销毁该session。如果服务器非正常关闭(强行关闭),没有到期的session也会跟着销毁。如果调用session提供的invalidate(),可以立即销毁session。
    • 作用范围:一次会话。
  • page(PageContext)
    • 生命周期:当对JSP请求时开始,当响应结束时销毁。
    • 作用范围:整个JSP页面,是四大作用域中最小的一个。
This post is licensed under CC BY 4.0 by the author.