04-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项目中访问, 服务器关闭就玩完了.

猜你喜欢

转载自blog.csdn.net/fanbaodan/article/details/84930507