zoukankan      html  css  js  c++  java
  • JSP中的九大隐式对象及四个作用域

    在这篇博文中,我们将讨论和学习JSP中的隐式对象及四个作用域。

    一、九大隐式对象

    这些对象是JSP容器为每个页面中的开发人员提供的Java对象,开发人员可以直接调用它们而不用显式地声明它们再调用。 JSP隐式对象也称为预定义变量。

    下表列出了JSP支持的九个隐式对象 -

    1. request对象

    request对象是javax.servlet.http.HttpServletRequest对象的一个实例。每当客户端请求页面时,JSP引擎将创建一个新对象来表示该请求。

    request对象提供了获取包括表单数据,Cookie,HTTP方法等HTTP头信息的方法。

    2. response对象

    response对象是javax.servlet.http.HttpServletResponse对象的一个实例。就像服务器创建request对象一样,它还创建一个对象来表示对客户端的响应。

    response对象还定义了处理创建新HTTP头的接口。通过此对象,JSP程序员可以添加新的Cookie或日期戳,HTTP状态代码等。

    3. out对象

    out隐式对象是javax.servlet.jsp.JspWriter对象的一个实例,用于在响应中发送内容。

    初始化JspWriter对象根据页面是否缓存而不同地实例化。缓冲可以通过使用page指令的buffered ='false'属性来关闭。

    JspWriter对象包含与java.io.PrintWriter类大部分相同的方法。但是,JspWriter还有一些额外的方法用来处理缓冲。与PrintWriter对象不同,JspWriter会抛出IOExceptions异常。

    4. session对象

    session对象是javax.servlet.http.HttpSession的一个实例,其行为与Java Servlet下的会话对象行为完全相同。
    session对象用于跟踪客户端请求之间的客户端会话。

    5. application对象

    application对象是生成的ServletServletContext对象的直接包装,实际上是javax.servlet.ServletContext对象的一个实例。

    application对象是JSP页面在其整个生命周期中的表示。 当JSP页面被初始化时,将创建此对象,并且在JSP页面被jspDestroy()方法删除时application对象也将被删除。

    通过向application对象添加属性值,可以确保组成Web应用程序的所有JSP文件都可以访问它。

    6. config对象

    config对象是javax.servlet.ServletConfig的实例化,是生成的servlet的ServletConfig对象周围的直接包装。

    7. pageContext对象

    pageContext对象是javax.servlet.jsp.PageContext对象的一个实例。pageContext对象用于表示整个JSP页面。

    8. page对象

    page对象是对该页面实例的实际引用。可以认为它是表示整个JSP页面的对象。

    page对象是this对象的直接同义词。

    9. exception对象

    exception对象是一个包含上一页抛出的异常的包装器。它通常用于生成对错误条件的适当响应。

     

    二、JSP中四个作用域

    所谓“作用域”就是“信息共享的范围”,也就是说一个信息能够在多大的范围内有效。JSP中九个内置对象及其相应所属作用域如下表:

    编号 对象 所属作用域 作用域描述
    1 request request 在当前请求中有效
    2 response page 在当前页面有效
    3 out page 在当前页面有效
    4 session session 在当前会话中有效
    5 application application 在所有应用程序中有效
    6 config page 在当前页面有效
    7 pageContext page 在当前页面有效
    8 page page 在当前页面有效
    9 Exception page 在当前页面有效

    作用域介绍

    由上图可知,这九个内置对象都有相应的作用域,作用域在这里的作用就是限定对象的生命周期。如果跳出了当前对象的作用域,该对象的信息就不能再被访问。

    让我们通过一个例子在理解上述过程

    1、首先写一个index.jsp页面调用其中的request、session、application和pageContext这个四个内置对象,并分别给其设置num属性值为1。代码如下:

     1 <body>
     2     <%
     3         pageContext.setAttribute("num", 1);
     4         session.setAttribute("num", 1);
     5         request.setAttribute("num", 1);
     6         application.setAttribute("num", 1);
     7         //response.sendRedirect("http://localhost:8088/demo1012/first.jsp");
     8     %>
     9     <table>
    10         <tr>
    11             <td>pageContext:</td>
    12             <td><%=pageContext.getAttribute("num")%></td>
    13         </tr>
    14         <tr>
    15             <td>session:</td>
    16             <td><%=session.getAttribute("num")%></td>
    17         </tr>
    18         <tr>
    19             <td>request:</td>
    20             <td><%=request.getAttribute("num")%></td>
    21         </tr>
    22         <tr>
    23             <td>application:</td>
    24             <td><%=application.getAttribute("num")%></td>
    25         </tr>
    26     </table>
    27 </body>

    在浏览器请求index.jsp页面显示结果如下:

    由结果可知,在index.jsp页面中我们可以访问四个对象的num属性值。

    2、我们用<jsp:forward page="first.jsp"></jsp:forward>替换上面第7行代码,重新请求index.jsp页面。运行结果如下:

    可以看到无法获得之前的那个pageContext对象的num属性值,这主要是因为转发请求到了first页面,跳出了之前的pageContext对象的作用域,现在调用的pageContext对象是first.jsp页面重建的一个。所以其num属性值为null。

    3、我们取消上述代码中第7行的注释,其中first.jsp页面代码就是上述代码的table部分,我们再重新请求index.jsp页面。运行结果如下:

    可以看到无法获得之前的那个pageContext和request的num属性的值了,pageContext的原因如上,而因为我们对页面重定向到了first.jsp,开始重浏览器到index.jsp的request连接结束了,所以现在获得的request是在index.jsp到first.jsp页面建立的新request请求域下生成的request对象,所以其num属性未初始化为null。

    4、我们再重新使用其他浏览器访问first.jsp页面,显示的结果如下:

    我们知道当前会话,是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。因为这次我们使用另外的浏览器对服务器发起请求,所以服务器为这次用户请求建立了新的会话,所以其num的属性值为null。另外因为只有index.jsp页面对四个内置对象的num属性进行了初始化,所以first.jsp页面只有application对象还在其application作用域内。其值为index.jsp页面设置的1,其他两个属性都为null.

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

    总结

    1、最后你一定就可以理解下面说法了

    参考资料:

    1、对于JSP九大内置对象和四个作用域的理解:http://www.blogjava.net/ourday/archive/2008/09/20/230107.html

    2、JSP九大内置对象:http://www.yiibai.com/jsp/jsp_implicit_objects.html

  • 相关阅读:
    面试官让我手写一个生产者消费者模式
    怎么用wait、notify巧妙的设计一个Future模式?
    并发编程之Master-Worker模式
    你和那些优秀的人差距在哪里?
    idea 2019.3 最新版破解教程
    JVM垃圾回收详解
    Java类加载器和双亲委派机制
    Java代理模式/静态代理/动态代理
    JSP自定义标签/自定义标签打包
    MyBatis关联查询 (association) 时遇到的某些问题/mybatis映射
  • 原文地址:https://www.cnblogs.com/raozihao/p/7711582.html
Copyright © 2011-2022 走看看