JSP九大内置对象和四大作用域和Servlet的三大作用域对象

时间:2021-10-15 13:02:29

一、JSP九大内置对象:内置对象(又叫隐含对象,有9个内置对象):不需要预先声明就可以在脚本代码和表达式中随意使用

内置对象特点:

  • 由JSP规范提供,不用编写者实例化。

  • 通过Web容器实现管理

  • 所有JSP页面均可使用

  • 只有在脚本元素的表达式代码段中才可使用(<%=使用内置对象%><%使用内置对象%>)

常用内置对象:

  • ** 输出输入对象:**request对象、response对象、out对象

  • ** 通信控制对象:**pageContext对象、session对象、application对象

  • Servlet对象:page对象、config对象

  • 错误处理对象:exception对象

括号内为其对应的类

Request(ServletRequest):它包含了有关浏览器请求的信息.通过该对象可以获得请求中的头信息、Cookie和请求参数。

Response(ServletResponse):作为JSP页面处理结果返回给用户的响应存储在该对象中。并提供了设置响应内容、响应头以及重定向的方法(如cookies,头信息等)

Out(JspWriter):用于将内容写入JSP页面实例的输出流中,提供了几个方法使你能用于向浏览器回送输出结果。

pageContext(PageContext):描述了当前JSP页面的运行环境。可以返回JSP页面的其他隐式对象及其属性的访问,另外,它还实现将控制权从当前页面传输至其他页面的方法。

Session(HttpSession):会话对象存储有关此会话的信息,也可以将属性赋给一个会话,每个属性都有名称和值。会话对象主要用于存储和检索属性值。

Application(ServletContext):存储了运行JSP页面的servlet以及在同一应用程序中的任何Web组件的上下文信息。

Page(Object):表示当前JSP页面的servlet实例

Config(ServletConfig):该对象用于存取servlet实例的初始化参数。

Exception(Throwable):在某个页面抛出异常时,将转发至JSP错误页面,提供此对象是为了在JSP中处理错误。只有在错误页面中才可使用<%@page isErrorPage=“true”%>

Jsp内置对象 功能 主要方法
out 向客户端输出数据 print() println() flush() clear() isAutoFlush() getBufferSize() close() …………
request 向客户端请求数据 getAttributeNames() getCookies() getParameter() getParameterValues() setAttribute() getServletPath() …………
response 封装了jsp产生的响应,然后被发送到客户端以响应客户的请求 addCookie() sendRedirect() setContentType() flushBuffer() getBufferSize() getOutputStream() sendError() containsHeader()……………
application Gryffindor 90
config 表示Servlet的配置,当一个Servlet初始化时,容器把某些信息通过此对象传递给这个Servlet getServletContext() getServletName() getInitParameter() getInitParameterNames()……………
page Jsp实现类的实例,它是jsp本身,通过这个可以对它进行访问 flush()………
pagecontext 为JSP页面包装页面的上下文。管理对属于JSP中特殊可见部分中己经命名对象的该问 forward() getAttribute() getException() getRequest() getResponse() getServletConfig() getSession() getServletContext() setAttribute() removeAttribute() findAttribute() ……………
session 用来保存每个用户的信息,以便跟踪每个用户的操作状态 getAttribute() getId() getAttributeNames() getCreateTime() getMaxInactiveInterval() invalidate() isNew()
exception 反映运行的异常 getMessage()…………

二、JSP四大作用域

jsp的四大作用域为:PageContext,ServletRequest,HttpSession,ServletContext;

  • ServletRequest域:作用范围是整个请求链(请求转发也存在);生命周期是在service方法调用前由服务器创建,传入service方法。整个请求结束,request生命结束。

  • HttpSession域:作用范围是一次会话。生命周期是在第一次调用request.getSession()方法时,服务器会检查是否已经有对应的session,如果没有就在内存中创建一个session并返回。当一段时间内session没有被使用(默认为30分钟),则服务器会销毁该session。如果服务器非正常关闭(强行关闭),没有到期的session也会跟着销毁。如果调用session提供的invalidate() ,可以立即销毁session。

  • ServletContext域:作用范围是整个Web应用。生命周期是当Web应用被加载进容器时创建代表整个web应用的ServletContext对象,当服务器关闭或Web应用被移除时,ServletContext对象跟着销毁。

作用域从小到大为:PageContext(jsp页面)< ServletRequest(一次请求)< HttpSession(一次会话)< ServletContext(整个web应用)。

pageContext, request, session、application四个作用域中

  1. 如果把变量放到pageContext里,就说明它的作用域是page,它的有效范围只在当前jsp页面里。 从把变量放到pageContext开始,到jsp页面结束,你都可以使用这个变量。

  2. 如果把变量放到request里,就说明它的作用域是request,它的有效范围是当前请求周期。所谓请求周期,就是指从http请求发起,到服务器处理结束,返回响应的整个过程。在这个过程中可能使用forward的方式跳转了多个jsp页面,在这些页面里你都可以使用这个变量。

  3. 如果把变量放到session里,就说明它的作用域是session,它的有效范围是当前会话。所谓当前会话,就是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。这个过程可能包含多个请求响应。也就是说,只要用户不关浏览器,服务器就有办法知道这些请求是一个人发起的,整个过程被称为一个会话(session),而放到会话中的变量。

  4. 如果把变量放到application里,就说明它的作用域是application,它的有效范围是整个应用。整个应用是指从应用启动,到应用结束。我们没有说“从服务器启动,到服务器关闭”是因为一个服务器可能部署多个应用,当然你关闭了服务器,就会把上面所有的应用都关闭了。application作用域里的变量,它们的存活时间是最长的,如果不进行手工删除,它们就一直可以使用。与上述三个不同的是,application里的变量可以被所有用户共用。如果用户甲的操作修改了application中的变量,用户乙访问时得到的是修改后的值。这在其他scope中都是不会发生的,page, request, session都是完全隔离的,无论如何修改都不会影响其他

    ** 三、servlet的三大作用域对象:**

1.request(HttpServletRequest)
  • request是表示一个请求,只要发出一个请求就会创建一个request,它的作用域:仅在当前请求中有效。

  • 用处:常用于服务器间同一请求不同页面之间的参数传递,常应用于表单的控件值传递。

  • 方法:request.setAttribute(); request.getAttribute(); request.removeAttribute(); request.getParameter().

2.session(HttpSession):
  • 服务器会为每个会话创建一个session对象,所以session中的数据可供当前会话中所有servlet共享。

  • 会话:用户打开浏览器会话开始,直到关闭浏览器会话才会结束。一次会话期间只会创建一个session对象。

  • 用处:常用于web开发中的登陆验证界面(当用户登录成功后浏览器分配其一个session键值对)。

  • 方法:session.setAttribute(); session.getAttribute(); session.removeAttribute();

  • 获得session对象方法:

    在Servlet中:HttpSession session = request.getSession();
    由于session属于jsp九大内置对象之一,当然可以直接使用。例如:<%session.serAttribute("name","admin")%>。

  • session被销毁

    1.session超时;

    2.客户端关闭后,再也访问不到和该客户端对应的session了,它会在超时之后被销毁;

    3.调用session. invalidate();

备注: session是服务器端对象,保存在服务器端。并且服务器可以将创建session后产生的sessionid通过一个cookie返回给客户端,以便下次验证。(session底层依赖于cookie)
3.application(ServletContext):
  • tomcat启动时创建,tomcat关闭时销毁,整个web的生命周期只有一个

  • 作用范围:所有的用户都可以取得此信息,此信息在整个服务器上被保留。Application属性范围值,只要设置一次,则所有的网页窗口都可以取得数据。ServletContext在服务器启动时创建,在服务器关闭时销毁,一个JavaWeb应用只创建一个ServletContext对象,所有的客户端在访问服务器时都共享同一个ServletContext对象;ServletContext对象一般用于在多个客户端间共享数据时使用;

  • 获取application对象方法(Servlet中):
ServletContext app01 = this.getServletContext();
app01.setAttribute("name", "kaixuan");    //设置一个值进去
ServletContext app02 = this.getServletContext();
app02.getAttribute("name");    //获取键值对
  • ServletContext同属于JSP九大内置对象之一,故可以直接使用

  • 备注:服务器只会创建一个ServletContext 对象,所以app01就是app02,通过app01设置的值当然可以通过app02获取。

    Servlet三大作用域总结:

  • 作用域: (1)request,(2)session,(3)application

  • (1)使用作用域传递数据和存储数据

  • (2)使用作用域传递数据时,必须掌握作用域对应的生命周期和作用范围


  • 生命周期

  • (1) request:只限于一次请求

  • (2) session:一次会话(多次请求)

    开始

    用户向服务器发送请求的时候 
    
    结束
    
      客户端
    
       丢失JsessionId值的时候(关闭浏览器)
    
      服务器端 
    
          关闭服务器 
    
          超过会话的不活动周期时间 
  • (3) application:项目的加载到卸载

  • 作用范围

    (1) requset:所有被请求转发的Servlet

    (2) session:所有的Servlet

    (3)application:所有的Servlet(换一个浏览器演示,跟session作用域区分)

  • 如何正确的选择作用域

    (1) request:跟当前操作功能相关

    (2) session: 跟用户信息相关

    (3) application:跟项目全局信息相关

如何正确的选择作用域不正确,会出现什么情况:
内存浪费