1.JSP九大内置对象
jsp的九大内置对象如下所示:
- out:该内置对象的类型是JspWriter,等同与response.getWriter(),用来向客户端发送文本数据;
- config:该内置对象的类型是ServletConfig,对应jsp翻译成的java文件中的ServletConfig对象;
- page:该内置对象的类型是Object,在jsp对应的java文件中有这样一句代码:Object page=this,即表示该内置对象代表当前对象;
- pageContext:该内置对象的类型是PageContext,是页面上下文对象,它是最后一个没讲的域对象,后面我们会详细讲解;
- exception:该内置对象的类型是Throwable,只有在错误页面中可以使用这个对象;
- request:该内置对象的类型是HttpServletRequest,代表请求对象,并且是一个域对象;
- response:该内置对象的类型是HttpServletResponse,代表响应对象;
- application:该内置对象的类型是ServletContext,一个应用只有一个application,也是一个域对象,域范围是整个应用;
- session:该内置对象的类型是HttpSession,也是一个域对象,但是不是每个JSP页面中都可以使用,如果在某个JSP页面中设置<%@page session=”false”%>,说明这个页面不能使用session。
这九个内置对象中config、page以及exception很少使用,我们知道jsp本身也是一个Servlet,config对象中包含的是servlet的配置信息,而我们并没有在web.xml中对jsp进行配置,所以config对象就没有什么用处。其他的内置对象在之前的课程中都已经讲过了,大家可以参考以前的文档。
2.pageContext对象
pageContext对象是页面上下文对象,一个页面就对应一个pageContext对象。我们知道Servlet有三大域对象,而jsp有四个域对象,分别是:
- ServletContext:域范围是整个应用;
- session:域范围是整个会话,注意一个会话中只有一个用户,如果要统计站点的访问次数,使用的域是ServletContext,因为这个时候统计的是多个用户,而非一个用户;
- request:域范围是整个请求链;
- pageContext:域范围是一个jsp页面,在一个页面中存数据再取数据没有任何意义,所以这里所说的域指的是在当前jsp页面和当前jsp页面中使用的标签之间共享数据。
2.1pageContext对象的功能
pageContext对象有如下四个功能:
- 域对象功能
- 代理其他域功能
- 全域查找功能
- 获取其他8个内置对象功能
(1)我们首先来了解pageContext对象的域功能:
- void setAttribute(String name,Object value)
- Object getAttribute(String name);
- Void removeAttribute(String name);
(2)代理其他域,所谓代理其他域是指,可以利用pageContext对象向request、session、application域中存取数据。现在我们查看API文档,看一看pageContext对象是如何代理其他域对象,如图1-1所示:
图1-1 pageContext
由图1-1可知,PageContext类继承了JspContext类,在其父类中定义了一些与域功能相关的方法,可以发现,除了在域功能中介绍的那三个方法,还有另外三个方法,如下所示:
- Object getAttribute(String name, int scope):
该方法的第一个参数是域属性的名称,第二个参数指定是从那个域中取出域属性;在PageContext中已经定义了如下几个静态常量作为scope的可选值:
- int APPLICATION_SCOPE:当参数为这个常量时,表示从application域中获取数据;
- int PAGE_SCOPE:当参数是这个常量时,表示从page域中获取数据;
- int REQUEST_SCOPE:当参数是这个常量时,表示从request域中获取数据;
- int SESSION-SCOPE:当参数是这个常量时,表示从session域中获取数据。
- void setAttribute(String name,Object value,int scope):
该方法的第一个参数指的是域属性的名称,第二参数指的是域属性的值,第三个参数指定域属性保存的域,scope的取值同上;
- void removeAttribute(String name,int scope):
该方法的第一个参数指的是域属性的名称,第二个参数指的是将指定域属性从哪个域中移出,scope的取值同上;
有了以上三个方法,pageContext对象就可以代理其他三个域对象了,例如:
pageContext.setAttribute(“name”,”zhangsan”,PageContext.SESSION_SCOPE).
(3)获取其他8个内置对象,也就是说可以通过pageContext对象获取jsp中其他的内置对象。pageContext是如何获取的呢?我们来看一下帮助文档,如图1-2所示:
图1-2 帮助文档
图1-2中,PageContext类中定义了如下八个方法:
getPage()、getRequest()、getResponse()、getServletConfig()、getServletContext()、getException()、getSession()等方法,其中getOut()放是在其父类中定义的,有了这些方法,pageContext对象自然能够获取其他八个内置对象了。
(4)全域查找功能,在PageContext类的父类中定义了如下方法:
- Object findAttribute(String name):该方法是从jsp的四个域page、request、session、application依次查找指定名称的域属性,如果找到就停止,这说明如果这四个域中存在同名的属性,那么返回的数据是从page范围中获取的。即表示谁的域范围越小,谁的优先级越高。
注意:这里说的page范围和九大内置对象中的page对象不是一个意思,page范围可以理解为是pageContext对象的域范围,即一个jsp页面。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/253200.html