JSP隐式对象的概述
在JSP页面中,有一些对象需要频繁使用,如果每次都重新创建这些对象则会非常麻烦。为了简化Web应用程序的开发,JSP2.0规范中提供了9个隐式(内置)对象,它们是JSP默认创建的,可以直接在 JSP 页面中使用。这9个隐式对象的名称、类型和描述如表所示。
名称 | 类型 | 描述 | 范围 |
---|---|---|---|
out | javax.servlet.jsp.JspWriter | 用于输出页面 | page |
request | javax.servlet.http.HttpServletRequest | 得到用户信息 | request |
response | javax.servlet.http.HttpServletResponse | 服务器向客户端回应消息 | page |
config | javax.servlet.ServletConfig | 服务器配置,可以取得初始化参数 | page |
session | javax.servlet.http.HttpSession | 用来保存用户的信息 | session |
application | javax.servlet.ServletContext | 所有用户的共享信息,与应用上下文有关,它代表当前web应用。 | application |
page | Java.lang.Object | 指当前页面转换后的Servlet类的实例,代表当前被访问JSP页面的实例化 | page |
pageContext | javax.servlet.jsp.PageContext | JSP的页面容器提供对JSP页面所有对象以及命名空间的访问,是页面上下文对象 | page |
exception | java.lang.Throwable | 表示JSP页面所发生的异常,在错误页中才起作用 | page |
out对象
out对象是javax.servlet.jsp.JspWriter类的实例对象,它的作用与ServletResponse.getWriter()方法返回的PrintWriter对象非常相似,都是用来向客户端发送文本形式的实体内容。不同的是,out对象的类型为JspWriter,它相当于一种带缓存功能的PrintWriter。
在 JSP 页面中,通过 out 隐式对象写入数据相当于将数据插入到JspWriter 对象的缓冲区中,只有调用了 ServletResponse.getWriter()方法,缓冲区中的数据才能真正写入到Servlet引擎所提供的缓冲区中。
out对象使用
创建一个jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>out</title>
</head>
<body>
<%
out.println("第一行<br>");
response.getWriter().println("第二行<br>");
%>
<%--
out.println通过print语句写入数据后直到整个jsp页面结束才会将其中的
内容真正的写到Servlet缓冲区中,Servlet引擎按照缓冲区的数据存放顺序输出
要将out对象直接写入Servlet引擎可以用page指令中的buffer属性实现 设置为“0kb”
--%>
</body>
</html>
运行结果
从图可以看出,尽管out.println();语句位于response.getWriter().println();语句之前,但它的输出内容却在后面。由此可以说明
out 对象通过 print 语句写入数据后,直到整个JSP页面结束,out对象中输入缓冲区的数据(即first line)才真正写入到Serlvet引擎提供的缓冲区中。而response.getWriter().println();语句则是直接把内容(即第二行)写入Servlet引擎提供的缓冲区中,Servlet引擎按照缓冲区中的数据存放顺序输出内容。
设置page对象的**buffer=“0kb”**属性,将out对象的数据直接写入Servlet引擎提供的缓冲区中
修改上面代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" buffer="0kb"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>out</title>
</head>
<body>
<%
out.println("第一行<br>");
response.getWriter().println("第二行<br>");
%>
</body>
</html>
运行结果:
由此可见,out对象中的数据直接写入了Servlet引擎提供的缓冲区中。此外,当写入到out对象中的内容充满了out对象的缓冲区时,out对象中输入缓冲区的数据也会真正写入到Servlet引擎提供的缓冲区中。
pageContext对象
JSP页面中,**使用pageContext对象可以获取JSP的其他8个隐式对象。**pageContext对象是javax.servlet.jsp.PageContext类的实例对象,它代表当前JSP页面的运行环境,并提供了一系列用于获取其他隐式对象的方法。
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隐式对象 |
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的属性 |
其中,参数name指定的是属性名称,参数scope指定的是属性的作用范围。pageContext对象的作用范围有4个值,具体如下。
• pageContext.PAGE_SCOPE:表示页面范围
• pageContext.REQUEST_SCOPE:表示请求范围
• pageContext.SESSION_SCOPE:表示会话范围
• pageContext.APPLICATION_SCOPE:表示Web应用程序范围
需要注意的是,当使用 findAttribute()方法查找名称为 name 的属性时,会按照 page、request、session和application的顺序依次进行查找,如果找到,则返回属性的名称,否则返回nul
pageContext对象使用案例
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<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表达式输出数据。
exception对象
JSP 页面中,经常需要处理一些异常信息,这时,可以通过 exception 对象来实现。exception对象是java.lang.Exception类的实例对象,它用于封装JSP中抛出的异常信息。
需要注意的是,**exception 对象只有在错误处理页面才可以使用,即 page 指令中指定了属性
<%@ page isErrorPage="true"%>
的页面。接下来,通过一个案例来学习exception对象的使用
exception对象使用
创建用于产生错误的jsp页面
添加属性:errorPage="error.jsp"
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" errorPage="error.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>exception对象</title>
</head>
<body>
<%
int a=3;
int b=0;
%>
输出结果为:
<%=(a/b) %><!-- 此处会产生异常 -->
</body>
</html>
创建errpr.jsp,设置isErrorPage属性为true
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>exception对象</title>
</head>
<body>
<!-- 显示异常信息 -->
<%=exception.getMessage() %>
<br>
</body>
</html>
运行结果:
需要注意的是,IE浏览器如果不能够显示出结果并且报出500错误时,可以点击浏览器菜单栏中的【工具】(IE11可以点击右上角的齿轮图标)→【Internet 选项】→【高级】,将“显示友好错误HTTP错误信息”复选框中的“√”去掉,然后点击窗口的【确认】按钮并刷新页面即可。