内置对象

什么是内置对象

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

JSP技术设计者便于开发人员在编写JSP页面时获得这些web对象的引用,定义了9个响应变量,我们通过这些变量就可以快速获得这9大变量的引用。

9个内置对象:

  • 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对象用于向浏览器输出数据,与之对应的是Serblet的PrintWriter对象。然后这个out对象的类型并不是PrintWriter,是JspWriter

简单理解就是JspWriter就是带缓存的PrintWriter

out对象的原理为:

image-20200824141605176

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

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

一般在JSP页面输出使用表达式<%=%>,所以out对象用的不多

request对象

就是HttpServletRequest对象

response对象

就是HttpServletResponse对象

config对象

就是ServletConfig对象

session对象

就是Session对象

注意:在page指令下配置如下代码,session就不可用

<%@page session=“false” %>

application对象

就是ServletContext对象

page对象

内置对象page是HttpJspPage对象,page对象代表当前的JSP页面,是当前JSP编译后Servlet类的对象。就是:page对象相当于java类的tihs

exception对象

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

一个小例子:模拟空指针错误,打印出现的异常

1.jsp代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
<html>
<head>
<title>我是页头</title>
</head>
<body>
我是页头
<%
//模拟空指针异常
String sss = null;
sss.length();
%>

</body>
</html>

error.jsp代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<center>
<%
//使用out对象的print方法打印出现的异常
out.print("程序出现异常,异常为" + exception);
%>
</center>

</body>
</html>

pageContext对象

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

pageContext获取8个内置对象

通过pageContext可以获取到其他八个内置对象

直接使用pageContext提供的方法即可获取

pageContext作为域对象

类似request,session,ServletContext 作为域对象而言,都有一下三个方法:

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

所以,pageContext也同样有这三种方法。

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

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

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

    • setAttribute(String name, Object value, int scope)
    • getAttribute(String name, 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域对象的属性的。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//1.jsp代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>我是页头</title>
</head>
<body>
我是页头
<%
//设置属性
request.setAttribute("name", "Hello World");
%>
<jsp:forward page="2.jsp"></jsp:forward>

</body>
</html>

//2.jsp代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>我是页尾</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
//使用重载方法获取request设置的属性
String name = (String) pageContext.getAttribute("name", PageContext.REQUEST_SCOPE);
%>
获取到的参数为:<%=name%>
</body>
</html>
  • PageContext还有一个方法:findAttribute(String name)

    该方法会查找各个域的属性,从小到大开始寻找,也就是page->request->session->application

引入和跳转

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

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

## 四种属性范围

目前为止,有4种属性范围。

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

四个内置对象都支持一下方法:

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

应用场景

  1. request:如果客户向服务器发请求,产生数据,用户看完后没用了,那么这种数据就可以存在request域。
  2. session:如果客户向服务器发请求,产生数据,用户用完等一会还有用,这种数据就存在session域中
  3. servletContext:如果客户向服务器发请求,产生数据,用户用完,其他用户还要用,就存在servletContext域中。

内置对象
https://zhaoquaner.github.io/2022/05/11/JavaWeb/JSP/内置对象/
更新于
2022年5月22日
许可协议