JSP的内置对象以及四大作用域
Why?: 在jsp页面中,有些对象需要频繁的使用, 若每次都是重新创建这些对象会非常的麻烦,
为了简化Web程序的发开, JSP2.0规范中提供了9个内置对象, 是JSP默认创建的, 所谓内置对象,就是我们可以直接在jsp页面中使用这些对象,不用创建,可以直接在JSP页面中使用. 大体如下表:
名称 | 类型 | 描述 |
---|---|---|
out | javax.servlet.jsp.JspWriter | 用于页面输出 |
request | javax.servlet.http.HttpServletRequest | 得到用户请求信息 |
response | java.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页面所发生的异常, 在错误页中才起作用 |
1. out对象
out对象是javax.servlet.jsp.JspWriter类的实例对象, 作用于ServletResponse.getWriter() 方法返回的PrintWriter对象非常相似, 都是用来向客户端发送文本形式的实体内容. out对象的类型为JspWriter, 它相当于一种带缓存功能的printWriter.
从上图可以看出, 在JSP 页面中, 通过out隐式对象写入数据相当于将数据插入到JspWriter的对象的缓冲区中(也可叫做out缓冲区), 只有调用了ServletResponse.getWriter()方法, 缓冲区的数据才能真正的写入到Servlet引擎所提供的缓存区中.
举个栗子演示:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" buffer="8kb"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
aaaaaaaaaaaaaaaaaaa
<%
out.write("bbbbbbbbbbb");
response.getWriter().write("ccccccccccc");
%>
<%="dddddddddddddddddd" %>
</body>
</html>
分析以上代码:
- page指令中的 buffer 属性默认是 8 kd , 所指的就是 out 缓冲区(JspWriter) 的大小为 8 kb. 如果设置为0 代表关闭缓冲区, 内容直接写到response缓冲区.
- aaaaaa 是页面直接输出, jsp内置对象out.write() 输出bbbbbb, jsp表达式输出dddd. 这些都是输出到out缓冲区. 最终都要到通过ServletResponse调用getWriter()方法写到response缓冲区中(因为,tomcat是去response缓存取出信息的,而不会去out缓冲区中). response.getWriter().println() 是直接写在response缓冲区中的.
根据以上分析,故页面的输出结果就是如下图:
如果把out缓冲区关掉, 即 page中的指令 buffer=“0kb”
因为关掉了out缓冲区,故直接就写在了 response缓冲区中, Servlet引擎按数据的存放顺序输出内容.
2. pageContext对象
2.1. 获得其它隐式对象
在JSP页面中, 使用pageContext对象可以获取JSP得其他8个隐式对象. pageContext对象是javax.servlet.jsp.PageContext 类的实例对象, 它代表当前JSP页面的运行环境, 并提供了一系列用户获取其他隐式对象的方法.如下图:
方法名 | 功能描述 |
---|---|
JspWriter getOut() | 获取out隐式对象 |
Object getPage() | 获取page隐式对象 |
ServletRequest getRequest() | 获取request隐式对象 |
ServletResponse getResponse() | 获取response()隐式对象 |
HttpSession getSession() | 获取session 隐式对象 |
Exception getException() | 获取exception 隐式对象 |
ServletConfig getServletConfig() | 获取config 隐式对象 |
ServletContext getServletContext() | 获取application隐式对象 |
2.2 pageContext 存储数据
通过操作属性来实现存储数据. 下表为pageContext操作属性的相关方法
方法名称 | 功能描述 |
---|---|
void setAttribute(String name, Object value, int scope) | 设置pageContext对象的属性 |
Object getAttribute(String name , int scope) | 获取pageContext对象的属性 |
void removeAttribute(Stirng 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 即从小到大的顺序查找, 如果找到, 则返回属性的名称, 否则返回null.
举个栗子:
<body>
<%
// 获取request对象
HttpServletRequest req = (HttpServletRequest) pageContext.getRequest();
// 设置request范围内属性
req.setAttribute("param" , "aaa" );
//使用pageContext向其它域中存数据 示例:
request.setAttribute("name", "san");
pageContext.setAttribute("name", "sun");
pageContext.setAttribute("name", "lizi",PageContext.REQUEST_SCOPE);
pageContext.setAttribute("name", "laowang", PageContext.SESSION_SCOPE);
pageContext.setAttribute("name", "xiaohua", PageContext.APPLICATION_SCOPE);
%>
<%=request.getAttribute("name") %>
<%=pageContext.getAttribute("name", PageContext.REQUEST_SCOPE)%>
<!-- findAttribute会从小到大搜索域的范围中的name -->
<!-- page域<request域<session域<application域 -->
<%=pageContext.findAttribute("name") %>
<%
pageContext.getRequest();
pageContext.getOut();
//method(pageContext);
%>
</body>
3. JSP的四个域范围:
PageContext常量名 | 描述 | 作用域名称 | 域对象类型 |
---|---|---|---|
PageScope | 当前页面中有效 | pageContext | PageContext |
RequestScope | 一次请求范围 | request | HttpServletRequest |
SessionScope | 一次会话范围 | session | HttpSession |
AppticationScope | 应用范围 | application | ServletContext |
- page: 表示当前页面, 我们作为开发通常不用, jsp标签底层使用
- request: 表示一次请求.通常一次请求就一个页面,但是如果使用请求转发,会涉及到多个页面
- session: 表示一次会话. 可在多次请求之间共享数据
- application: 表示一个web应用. 可在整个web项目中访问, 服务器关闭就玩完了.