JSP引擎在调用JSP对应的jspServlet时,会传递或创建9个与web开发相关的对象供jspServlet使用。

九个内置对象:

  • pageContext
  • page
  • config
  • request
  • response
  • session
  • application
  • exception
  • out

out对象

out对象的API

  • int getBufferSize()【得到缓存大小】
  • int getRemaining()【得到未使用缓存的大小】
  • boolean isAutoFlush()
  • void println()
  • void flush()
  • void close()
  • void clearBuffer()
  • void clear()

        out对象用于向浏览器输出数据,与之对应的是Servlet的PrintWriter对象。然而这个out对象的类型并不是PrintWriter,而是JspWriter。可以简单理解JspWriter就是带缓存的PrintWriter。

out对象的原理:

只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:

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

一般在JSP页面输出都是用表达式(<%=%>),所以out对象用的并不是很多。

request对象

内置对象request其实就是HttpServletRequest。

response对象

内置对象response其实就是HttpServletResponse。

config对象

内置对象config其实就是ServletConfig。

session对象

内置对象session其实就是HttpSession。

注:在page指令配置如下,session将不可用

<%@page session="false" %>

application对象

内置对象application其实就是ServletContext对象。

page对象

内置对象page是HttpJspPage对象,其实page对象代表的就是当前JSP页面,是当前JSP编译后的Servlet类的对象。也就是说,page对象相当于普通java类的this。

exception对象

内置对象exception是java.lang.Exception类的对象,exception封装了JSP页面抛出的异常信息。exception经常被用来处理错误页面。

page.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
String s=null;
out.println(s.length());
%>
</body>
</html>

error.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
out.println("程序抛出了异常"+exception);
%>
</body>
</html>

效果

pageContext对象

pageContext是内置对象中最重要的一个对象,它代表着JSP页面编译后的内容(也就是JSP页面的运行环境)。

pageContext获取8个内置对象

既然它代表了JSP页面编译后的内容,那它理所当然的封装了对其他8大内置对象的引用。也就是说,通过pageContext可以获取到其他的8个内置对象。

<%
    System.out.println(pageContext.getSession());
    System.out.println(pageContext.getRequest());
    System.out.println(pageContext.getResponse());
    System.out.println(pageContext.getException());
    System.out.println(pageContext.getPage());
    System.out.println(pageContext.getServletConfig());
    System.out.println(pageContext.getServletContext());
    System.out.println(pageContext.getOut());
%>

pageContext作为域对象

类似于request,session,ServletContext作为域对象,pageContext也有以下三个方法:

  • setAttribute(String name,Object o)
  • getAttribute(String name)
  • removeAttribute(String name)

      pageContext本质上代表的是当前JSP页面编译后的内容,作为域对象而言,它就代表着当前JSP页面(也就是page),也就是说:pageContext域对象只在page范围内有效,超出了page范围就无效了。

page.jsp(page范围内)

<%
pageContext.setAttribute("name","tom");
%>
<%
String value=(String)pageContext.getAttribute("name");
System.out.println(value);
%>

后台是可以列印出值。

 page.jsp(request域对象设置属性)

<%
    //这是request域对象保存的内容
    request.setAttribute("name", "tom");
%>
<%--跳转到head.jsp--%>
<jsp:forward page="head.jsp"></jsp:forward>

head.jsp(pageContext取出request存进去的属性)

<%
String name=(String)pageContext.getAttribute("name");
System.out.println(name);
%>

结果显示:null

pageContext本质上代表着编译后JSP的内容,pageContext还封装了其他域的方法。

上面的pageContext默认是page范围的,但pageContext对象重载了set、get、removeAttribute这三个方法。

  • getAttribute(String name,int scope)
  • setAttribute(String name,Object value,int scope)
  • removeAttribute(String name,int scope)

多了一个设置域范围的一个参数,如果不指定默认就是page。当然,pageContext把request、session、application、page着几个域对象封装成静态变量。

  • PageContext.APPLICATION_SCOPE
  • PageContext.SESSION_SCOPE
  • PageContext.REQUEST_SCOPE
  • PageContext.PAGE_SCOPE

没有使用重载的方法,使用pageContext是无法获取到request域对象设置的属性的。

head.jsp(使用重载方法获取)

<%
    //使用重载方法获取request域对象的属性
    String name = (String) pageContext.getAttribute("name", pageContext.REQUEST_SCOPE);
    System.out.println(name);
%>

这样就可以获取到了。

pageContext还有一个方法:findAttribute(String name)。该方法会查找各个域的属性,从小到大开始寻找,就是page-->request-->session-->application。

使用findAttribute()方法查找

<%
    //使用findAttribute查找request域对象的属性
    String name =(String) pageContext.findAttribute("name");
    System.out.println(name);
%>

结果也是可以显示的。

 

引入和跳转

PageContext类中定义了一个forward方法和两个include方法分别来简化和替代RequestDispatcher.forward方法和include方法。

  • pageContext.forward(String url)
  • pageContext.include(String url)

page.jsp页面

<%
    pageContext.forward("/head.jsp");
%>

 

四种属性范围

  1. page【只在一个页面中保存属性,跳转页面无效】
  2. request【只在一次请求中保存属性,服务器跳转有效,浏览器跳转无效】
  3. session【在一个会话范围中保存属性,无论何种跳转均有效,关闭浏览器后无效】
  4. application【在整个服务器中保存,所有用户都可以使用】

4个内置对象都支持以下的方法:

  1. setAttribute(String name,Object o)
  2. getAttribute(String name)
  3. removeAttribute(String name)

 

应用场景

  1. request:如果客户想服务器发请求,产生的数据,用户看完就没用了,像这样的数据就存在request域,如新闻数据就属于用户看完就没用的。
  2. session:如果客户向服务器发送请求,产生的数据,用户用完了等一会儿还有用,像这样的数据就存在session域中,如购物数据,用户需要看到自己购物信息,并且等一会儿,还要用这个购物数据结账。
  3. servletContext:如果客户向服务器发送请求,产生的数据,用户用完了,还要给其他用户用,像这样的数据就存在servletContext域中,如聊天数据。
 posted on 2019-06-16 16:04  会飞的金鱼  阅读(83)  评论(0)    收藏  举报