• javaweb-JSP中的九个内置对象


    一、JSP原理

      所以当访问一个jsp页面时,其实也是在访问一个Servlet,服务器在执行jsp的时候,首先把jsp翻译成一个_jspServlet,然后按照servlet的调用方式进行调用。

     于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎如果发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。
      JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用。

    二、认识九个内置对象

    NO. 内置对象 类型
    1 pageContext javax.servlet.jsp.PageContext
    2 request javax.servlet.http.HttpServletRequest
    3 response javax.servlet.http.HttpServletResponse
    4 session javax.servlet.http.HttpSession
    5 application javax.servlet.ServletContext
    6 config javax.servlet.ServletConfig
    7 out javax.servlet.jsp.JspWriter
    8 page java.lang.Object
    9 exception java.lang.Throwable

      request,response,session,application,config这些对象在前面都已经做了详细的介绍,这里重点介绍一下剩下的pageContext对象,out对象,page对象。

    三、内置对象使用说明

    3.1、page对象

      page对象表示当前一个JSP页面,可以理解为一个对象本身,即:把JSP当作一个对象来看待。page对象在开发中几乎不用,了解一下即可。

    3.2、out对象

      out对象用于向客户端发送文本数据。
      out对象是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。
      JSP页面中的out对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。
      只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:

    • 设置page指令的buffer属性关闭了out对象的缓存功能
    • out对象的缓冲区已满
    • 整个JSP页面结束

    out对象的工作原理图

      

    3.3、pageContext对象

      pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象(容器),可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如引入和跳转其它资源、检索其它域对象中的属性等。

    3.4、通过pageContext获得其他对象

    • getException方法返回exception隐式对象
    • getPage方法返回page隐式对象
    • getRequest方法返回request隐式对象
    • getResponse方法返回response隐式对象
    • getServletConfig方法返回config隐式对象
    • getServletContext方法返回application隐式对象
    • getSession方法返回session隐式对象
    • getOut方法返回out隐式对象

    3.5、pageContext封装其它8大内置对象的意义

      如果在编程过程中,把pageContext对象传递给一个普通java对象,那么这个java对象将可以获取8大隐式对象,此时这个java对象就可以和浏览器交互了,此时这个java对象就成为了一个动态web资源了,这就是pageContext封装其它8大内置对象的意义,把pageContext传递给谁,谁就能成为一个动态web资源,那么什么情况下需要把pageContext传递给另外一个java类呢,什么情况下需要使用这种技术呢,在比较正规的开发中,jsp页面是不允许出现java代码的,如果jsp页面出现了java代码,那么就应该想办法把java代码移除掉,我们可以开发一个自定义标签来移除jsp页面上的java代码,首先围绕自定义标签写一个java类,jsp引擎在执行自定义标签的时候就会调用围绕自定义标签写的那个java类,在调用java类的时候就会把pageContext对象传递给这个java类,由于pageContext对象封装了对其它8大隐式对象的引用,因此在这个java类中就可以使用jsp页面中的8大隐式对象(request,response,config,application,exception,Session,page,out)了,pageContext对象在jsp自定义标签开发中特别重要。

    3.6、pageContext作为域对象

      pageContext对象可以作为容器来使用,因此可以将一些数据存储在pageContext对象中。

      pageContext对象的常用方法

    1 public void setAttribute(java.lang.String name,java.lang.Object value)
    2 public java.lang.Object getAttribute(java.lang.String name)
    3 public void removeAttribute(java.lang.String name)
    4 public java.lang.Object findAttribute(java.lang.String name)

      重点介绍一下findAttribute方法,这个方法是用来查找各个域中的属性的,查看这个方法的API可以看到关于这个方法的描述:
      Searches for the named attribute in page, request, session (if valid), and application scope(s) in order and returns the value associated or null.

      当要查找某个属性时,findAttribute方法按照查找顺序"page→request→session→application"在这四个对象中去查找,只要找到了就返回属性值,如果四个对象都没有找到要查找的属性,则返回一个null。

    范例:使用pageContext的findAttribute方法查找属性值

     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 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     7 <title>pageContext的findAttribute方法查找属性值</title>
     8 </head>
     9 <%
    10     pageContext.setAttribute("name1", "张三");
    11     request.setAttribute("name2", "李四");
    12     session.setAttribute("name3", "王五");
    13     application.setAttribute("name4", "小六");    
    14 %>
    15 <%
    16     //使用pageContext的findAttribute方法查找属性,由于取得的值为Object类型,因此必须使用String强制向下转型,转换成String类型
    17     //查找name1属性,按照顺序"page→request→session→application"在这四个对象中去查找
    18     String value1 = (String)pageContext.findAttribute("name1");
    19     String value2 = (String)pageContext.findAttribute("name2");
    20     String value3 = (String)pageContext.findAttribute("name3");
    21     String value4 = (String)pageContext.findAttribute("name4");
    22     String value5 = (String)pageContext.findAttribute("name5"); //查找不存在的属性
    23 %>
    24 <h1>pagecontext.findAttribute方法查找到的属性值:</h1>
    25 <h3>pageContext对象的name1属性值:<%=value1%></h3>
    26 <h3>request对象的name2属性值:<%=value2%></h3>
    27 <h3>session对象的name3属性值:<%=value3%></h3>
    28 <h3>application对象的name4属性值:<%=value4%></h3>
    29 <h3>查找不存在的name5属性值:<%=value5%></h3>
    30 
    31 <h1>使用EL表达式进行输出</h1>
    32 <h3>pageContext对象的name1属性值:${name1}</h3>
    33 <h3>request对象的name2属性值:${name2}</h3>
    34 <h3>session对象的name3属性值:${name3}</h3>
    35 <h3>application对象的name4属性值:${name4}</h3>
    36 <h3>查找不存在的name5属性值:${name5}</h3>
    37 <body>
    38 </body>
    39 </html>

    运行结果:

     EL表达式语句在执行时,会调用pageContext.findAttribute方法,用标识符为关键字,分别从page、request、 session、application四个域中查找相应的对象,找到则返回相应对象,找不到则返回”” (注意,不是null,而是空字符串)。

    pageContext对象中封装了访问其它域的方法

    1 public java.lang.Object getAttribute(java.lang.String name,int scope)
    2 public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
    3 public void removeAttribute(java.lang.String name,int scope)

    代表各个域的常量

    1 1 PageContext.APPLICATION_SCOPE
    2 2 PageContext.SESSION_SCOPE
    3 3 PageContext.REQUEST_SCOPE
    4 4 PageContext.PAGE_SCOPE 

    范例:pageContext访问其它域

     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 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     7 <title>pageContext访问其它域</title>
     8 </head>
     9 <body>
    10 <%
    11     //此时相当于session对象中存放了一个name属性,等价于session.setAttribute("name","张三");
    12     pageContext.setAttribute("name", "张三", PageContext.SESSION_SCOPE);    
    13 %>
    14 <%
    15     //取得session对象的属性,使用pageContext对象获取
    16     String s1 = (String)pageContext.getAttribute("name", PageContext.SESSION_SCOPE);
    17     //由于取得的值为Object类型,因此必须使用String强制向下转型,转换成String类型
    18     String s2 = (String)session.getAttribute("name");
    19 %>
    20 <h1>取出存放在session对象中的属性值:</h1>
    21 <p>第一种做法:使用pageContex.getAttribute("attributeName",pageContex.SESSION_SCOPE)</p>
    22 <h3>姓名:<%=s1 %></h3>
    23  <p>第二种做法:使用session.getAttribute("attributeName");去取出session对象中值</p>
    24 <h3>姓名:<%=s2 %></h3>
    25 </body>
    26 </html>

    3.7、PageContext引入和跳转到其他资源

      PageContext类中定义了一个forward方法(用来跳转页面)和两个include方法(用来引入页面)来分别简化和替代RequestDispatcher.forward方法和include方法。
      方法接收的资源如果以“/”开头, “/”代表当前webContent应用。

    范例:使用pageContext的forward方法跳转到其他页面

     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 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     7 <title>使用pageContext的forwrd方法跳转页面</title>
     8 </head>
     9 <body>
    10 <%
    11     //使用pageContext的forward方法跳转到page02.jsp页面, /相对webContent
    12     pageContext.forward("/page02.jsp");
    13     //使用pageContext.forward(relativeUrlPath)替代RequestDispatcher.forward(relativeUrlPath)
    14     //使用替代RequestDispatcher的forward方法实现的跳转方式
    15     //pageContext.getRequest().getRequestDispatcher("/page02.jsp").forward(request, response);
    16 %>    
    17 </body>
    18 </html>

     运行结果如下:

    1 pageContext.forward("/page02.jsp");

      这种写法是用来简化和替代pageContext.getRequest().getRequestDispatcher("/pageContextDemo05.jsp").forward(request, response);这种写法的。在实际开发中,使用pageContext.forward(relativeUrlPath)方法跳转页面用得不多,主要是因为要在Jsp页面中嵌套java代码,所以这种做法简单了解一下即可,在开发中,要想从一个Jsp页面采用服务器端跳转的方式跳转到另一个Jsp页面,那么一般会使用<jsp:forward>标签,<jsp:forward>标签用于把请求转发给另外一个资源。

    范例:使用pageContext的include方法引入资源

     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 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     7 <title>使用pageContext的include方法引入资源</title>
     8 </head>
     9 <body>
    10 <%
    11     pageContext.include("/jsp/head.jsp");
    12 %>
    13 <h1>主体部分</h1>            
    14 <%
    15     pageContext.include("/jsp/foot.jsp");
    16 %>
    17 </body>
    18 </html>

    运行结果:

       在实际开发中,使用pageContext的include方法引入页面这种做法也很少用,一般都使用jsp:include标签引入资源,因此这种做法了解一下即可。

        

  • 相关阅读:
    Dubbo限制大数据传输的解决方案
    出现The folder is already a source folder
    用Eclipse进行远程Debug代码
    Scanner和BufferReader之区别
    IO操作中的建议
    Android Serialization序列化
    flash画图API:解析obj格式
    UVA 6475 Effective Infection Time
    swift user guide.pdf下载
    【cocos2d-x制作别踩白块儿】第一期:游戏介绍
  • 原文地址:https://www.cnblogs.com/sacai/p/11621102.html
Copyright © 2020-2023  润新知