内置对象的概述
在JSP页面中,有一些对象需要频繁使用,如果每次都重新创建这些对象则会非常麻烦。为了简化
Web应用程序的开发,JSP2.0规范中提供了9个隐式(内置对象),他们是JSP默认创建的,可以直接在JSP
页面中使用。这9个隐含对象的名称、类型和描述如表1-2所示。
名称 类型 描述
out javax.servlet.jsp.JspWriter 用于页面输出
request javax.servlet.http.HttpServletRequest 得到用户请求信息
response javax.servlet.http.HttpServletResponse 服务器向客户端的回应信息
config javax.servlet.ServletConfig 服务器配置,可以取得初始化参数
session javax.servlet.http.HttpSession 用来保存用户的信息
application javax.servlet.ServletContext 所有用户的共享信息
page java.lang.Object 指当前页面转换后的Servlet类的实例
pageContext javax.servlet.jsp.PageContext JSP的页面容器
exception java.lang.Throwable 表示JSP页面所发生的异常,在错误页中
才起作用
out对象
在JSP页面中,经常需要向客户端发送文本内容,这时,可以使用out对象来实现。out对象是javax.servlet
.jsp.JspWriter类的实例对象,它的作用与ServletResponse.getWriter()方法返回的PrintWriter对象非常相似,
都是用来向客户端发送文本形式的实体内容。不同的是,out对象的类型为JspWriter,它相当于一种带缓存功能的
PrintWriter。接下来,通过一张图来描述JSP页面的out对象与Servlet引擎提供的缓冲之间的工作关系,具体如图
1-11所示。
Response JspWriter对象
的缓冲区 的缓冲区
| |
|---------| |------------|
| | | |
servlet引擎<----| |<-------| |<-----JSP页面
| | | | | |
| | | | | |
|---------| | |------------| |
| |
调用ServletResponse 调用out隐式对象的方法
.getWriter()方法返回 写入数据
的PrintWriter对象的
方法写入数据
图1-11 out对象与Servlet引擎的关系
从图1-11可以看出,在JSP页面中,通过out隐式对象写入数据相当于将数据插入到JspWriter
对象的缓冲区,只有调用了ServletResponse.getWriter() 方法,缓冲区中的数据才能真正写入
到Servlet引擎所提供的缓冲区中。为了验证上述说法是否正确,接下来,通过一个具体的案例来
演示out对象的使用。
在day12项目的WebContent目录下创建一个名称为out的JSP页面,如文件1-5所示。
文件1-5 out.jsp
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<% out.println("first line<br>");
response.getWriter().println("second line<br>");
%>
</body>
</html>
启动Tomcat服务器,在浏览器地址栏中访问"http://localhost:8080/day12/out.jsp",浏览器的显示结果
如下所示:
second line
first line
如上可以看出,尽管out.println语句位于response.getWriter().println()语句之前,但它的输出内容却在
后面。由此可以说明,**out对象通过print语句写入数据后,直到整个JSP页面结束,out对象中输入缓冲区的数据
(即:first line) 才真正写入到Servlet引擎提供的缓冲区中**,而response.getWriter().println()语句则是直
接把内容(即: second line)写入Servlet引擎提供的缓冲区中,Servlet引擎按照缓冲区的数据存放顺序输出内容。
pageContext对象
在JSP页面中,使用pageContext对象可以获得JSP的其他8个隐式对象。pageContext对象是javax.servlet.jsp
.PageContext类的实例对象,它代表当前JSP页面的运行环境,并提供了一系列用于获取其他隐式对象的方法。
pageContext对象获取隐式对象的方法如表1-3所示。
表1-3 pageContext获取隐式对象的方法
方法名 功能描述
JspWriter getOut() 用于获取out隐式对象
Object getPage() 用于获取page隐式对象
ServletRequest getRequest() 用于获取request隐式对象
ServletResponse getResponse() 用于获取response隐式对象
HttpSession getSession() 用于获取session隐式对象
Exception getException() 用于获取exception隐式对象
ServletConfig getServletConfig() 用于获取config隐式对象
ServletContext getServletContext() 用于获取application隐式对象
表1-3中列举了pageContext获取其他隐式对象的方法,这样,当传递一个pageContext对象后,就可以通过
这些方法轻松地获取到其他8个隐含对象的方法,这样,当传递一个pageContext对象后,就可以通过这些方法
轻松地获取到其他8个隐式对象了。
pageContext对象不仅提供了获取隐式对象的方法,还提供了存储数据的功能。pageContext对象存储数据
是通过操作属性来实现的,表1-4列举了pageContext操作属性的一系列方法,具体如下:
表1-4 pageContext操作属性的相关方法
方法名称 功能描述
void setAttribute(String name,Object value,int scope) 用于设置pageContext对象的属性
Object getAttribute(String name,int scope) 用于获取pageContext对象的属性
void removeAttribute(String name,int scope) 删除指定范围内名称为name的属性
void removeAttribute(String name) 删除所有范围名称为name的属性
Object findAttribute(String name) 从4个域对象中查找名称为name的属性
表1-4 列举了pageContext 对象操作属性的相关方法,其中,参数name指定的是属性名称,参数scope指定的
是属性的作用范围。pageContext对象的作用范围有4个值,具体如下:
● PageContext.PAGE_SCOPE:表示页面范围
● PageContext.REQUEST_SCOPE:表示请求范围
● PageContext.SESSION_SCOPE:表示会话范围
● PageContext.APPLICATION_SCOPE:表示Web应用程序范围
需要注意的是,当使用 findAttribute() 方法查找名称为name的属性时,会按照page、request、session
和application的顺序依次进行查找,如果找到,则返回属性的名称,否则返回null。接下来,通过一个案例来
演示pageContext对象的使用。
在day12 项目的WebContext目录下创建一个名称为pageContext.jsp的页面,编辑后如文件1-6所示。
文件1-6 pageContext.jsp
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<html>
<head>
<title>pageContext</title>
</head>
<body>
<%
//获取request对象
HttpServletRequest req=(HttpServletRequest) pageContext.getRequest();
//设置page范围内属性
pageContext.setAttribute("str","Java",pageContext.PAGE_SCOPE);
//设置request范围内属性
req.setAttribute("str","Java Web");
//获得的page范围属性
String str1=(String) pageContext.getAttribute("str",pageContext.PAGE_SCOPE);
//获得的request范围属性
String str2=(String) pageContext.getAttribute("str",pageContext.REQUEST_SCOPE);
%>
<%="page 范围:"+str1 %><br>
<%="request 范围:"+str2 %><br>
</body>
</html>
在上述代码中,首先使用pageContext获取了request对象,并设置page范围内属性:然后使用获取的
request对象设置了request范围内属性,接下来使用pageContext对象获得page和request范围内的相应属性,
最后使用JSP表达式输出数据。
启动Tomcat服务器,在浏览器的地址栏中输入地址"http://localhost:8080/day17/pageContext.jsp"
访问pageContext.jsp 页面,浏览器显示的结果如图1-13所示。
page 范围:Java
request 范围:Java Web
如上的显示结果可以看出,通过pageContext对象可以获取到request对象,并且还可以获取到不同范围内的属性。