内置对象
什么是内置对象
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对象的原理为:
只有向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 |
|
error.jsp代码:
1 |
|
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 |
|
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)
应用场景
- request:如果客户向服务器发请求,产生数据,用户看完后没用了,那么这种数据就可以存在request域。
- session:如果客户向服务器发请求,产生数据,用户用完等一会还有用,这种数据就存在session域中
- servletContext:如果客户向服务器发请求,产生数据,用户用完,其他用户还要用,就存在servletContext域中。