(19)JSP九大内置对象(又称隐式对象) + JSP四大作用域

(19)JSP九大内置对象(又称隐式对象) + JSP四大作用域

前言

该篇文章总结了JSP的九大内置对象,以及jsp中的四大作用域。

一、JSP九大内置对象

1.内置对象概念

JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量。

在jsp开发中会频繁使用到一些对象,如ServletContext HttpSession PageContext等.如果每次我们在jsp页面中需要使用这些对象都要自己亲自动手创建就会特别的繁琐.SUN公司因此在设计jsp时,在jsp页面加载完毕之后自动帮开发者创建好了这些对象,开发者只需要使用相应的对象调用相应的方法即可.这些系统创建好的对象就叫做内置对象.

在servlet程序中,如果开发者希望使用session对象,必须通过request.getSession()来得到session对象;而在jsp程序中,开发中可直接使用session(系统帮我们创建好的session对象的名字就叫session)调用相应的方法即可,如:session.getId().

总结:JSP九大内置对象(又称隐式对象),每个jsp页面都有的Java对象,我们可以直接使用。

2.如何查看

在之前文章 Java EE基础(16):JSP概念 + 简单使用 + 运行原理 中,我们知道了JSP本质上是一个Servlet。我们写的.jsp文件会被转换成一个Servlet,然后再进行编译。

在转成的Servlet(.java) 的 _jspService() 中,我们可以看到jsp在自动生成servlet时为我们声明并初始化了一些对象(九大内置对象)。

3.九大内置对象

九大内置对象如下:
| 对象 | 描述 |
|:--|:--|
| request | HttpServletRequest 接口的实例 |
| session | HttpSession类的实例 |
| application | ServletContext类的实例,与应用上下文有关 |
| response | HttpServletResponse 接口的实例 |
| out | JspWriter类的实例,用于把结果输出至网页上 |
| config | ServletConfig类的实例 |
| pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问 |
| page | 类似于Java类中的this关键字 |
| Exception | Exception类的对象,代表发生错误的JSP页面中对应的异常对象 |

3.1 request 对象

request对象是javax.servlet.http.HttpServletRequest 类的实例。每当客户端请求一个JSP页面时,JSP引擎就会制造一个新的request对象来代表这个请求。
request对象提供了一系列方法来获取HTTP头信息,cookies,HTTP方法等等。

request 对象 封装存储了当前请求数据,需要请求数据时到该对象中取。作用域:一次请求

3.2 session 对象

session对象是 javax.servlet.http.HttpSession 类的实例。和Java Servlets中的session对象有一样的行为。
session对象用来跟踪在各个客户端请求间的会话。

和Servlet中的session对象一样,用来表示会话。存储了当前用户不同请求的信息。作用域:一次会话

3.3 application 对象

application对象直接包装了servlet的ServletContext类的对象,是javax.servlet.ServletContext 类的实例。
这个对象在JSP页面的整个生命周期中都代表着这个JSP页面。这个对象在JSP页面初始化时被创建,随着jspDestroy()方法的调用而被移除。
通过向application中添加属性,则所有组成您web应用的JSP文件都能访问到这些属性。

application 对象,也就是ServletContext对象,一个项目只有一个。作用域:整个当前整个项目

3.4 pageContext 对象

pageContext对象是javax.servlet.jsp.PageContext 类的实例,用来代表整个JSP页面。
这个对象主要用来访问页面信息,同时过滤掉大部分实现细节。
这个对象存储了request对象和response对象的引用。application对象,config对象,session对象,out对象可以通过访问这个对象的属性来导出。
pageContext对象也包含了传给JSP页面的指令信息,包括缓存信息,ErrorPage URL,页面scope等。
PageContext类定义了一些字段,包括PAGE_SCOPE,REQUEST_SCOPE,SESSION_SCOPE, APPLICATION_SCOPE。它也提供了40余种方法,有一半继承自javax.servlet.jsp.JspContext 类。

页面上下文对象,方法比较多,封存了其他内置对象(request、session、application等等)。封装了当前jsp的与运行信息。

每个jsp文件单独拥有一个pageContext对象,作用域是:当前jsp页面。

3.5 response 对象

response对象是javax.servlet.http.HttpServletResponse类的实例。当服务器创建request对象时会同时创建用于响应这个客户端的response对象。
response对象也定义了处理HTTP头模块的接口。通过这个对象,开发者们可以添加新的cookies,时间戳,HTTP状态码等等。

response 对象用于响应处理结果给 发起请求的浏览器。我们设置响应http状态码,cookie等信息给浏览器。

3.6 out 对象

out对象是 javax.servlet.jsp.JspWriter 类的实例,用来在response对象中写入内容。

out 对象,在jsp内部使用。带有缓冲区的响应对象,效率比 response 对象高。

3.7 config 对象

config对象是 javax.servlet.ServletConfig 类的实例,直接包装了servlet的ServletConfig类的对象。
这个对象允许开发者访问Servlet或者JSP引擎的初始化参数,比如文件路径等。

config 对象也就是ServletConfig,主要是用来获取web.xml中的配置信息,访问一些初始化参数。

3.8 page 对象

这个对象就是页面实例的引用。它可以被看做是整个JSP页面的代表。
page 对象就是this对象的同义词。

page 对象代表当前jsp对象,相当于java中的this(jsp生成的servlet中可以看到它确实是this)。

3.9 exception 对象

exception 对象包装了从先前页面中抛出的异常信息。它通常被用来产生对出错条件的适当响应。

异常对象,存储了当前运行的异常信息。

注意:默认jsp转成的servlet是没有exception对象的。
如果你想使用次对象,或者在jsp页面生成的servlet(.java)文件中看到他,你需要在当前 jsp 的 page 指令中添加这两个属性:isErrorPage="true" 和 errorPage="error.jsp"。
(记得改了之后需要重新访问一下页面)
在这里插入图片描述

4.示例

这里只是简单的示例了 request 对象和session对象。其他对象的使用也大同小异。

这里还是使用我们第一次学jsp时的简单案例,需要请点击: Java EE基础(16):JSP概念 + 简单使用 + 运行原理
如果你还不会 jsp 中写 java 代码的语法,请查看我这篇:Java EE基础(18):JSP语法 + JSP指令(3大指令) + JSP动作

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true" errorPage="error.jsp"%>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>这是我的第一个jsp文件</h1>
	<%
		// 获取本地ip地址
		String host = request.getLocalAddr();
		System.out.println(host);
		
		// session中添加值,获取值
		session.setAttribute("key", "my value");
		Object value = session.getAttribute("key");
		System.out.println(value);
	%>
</body>
</html>

二、JSP四大作用域

对象作用域
request一次请求,解决了一个请求内Servlet的数据共享。数据流转方式:通过请求转发,将请求数据流转给下一个servlet或jsp 。
session一次会话,解决了同一用户不同请求的数据共享。数据流转方式:将数据从一个请求(将数据存到session中)流转给其他请求。
application项目内,解决了不同用户的数据共享。数据流转方式:将一个用户(共享的)数据流转给其他用户。
pageContext当前页面,解决了当前页面内的数据共享问题。可以获取其他内置对象。数据流转方式:作用域太小,只能在当前jsp内,获取其他内置对象。

1.request + session + application

request(HttpServletRequet 类型)、session(HttpSession 类型) 和application(ServletContext 类型)。这三个作用域我们在学Servlet时都学过了。

作用域总结请看上面表格。需要 Servlet 学习请点击查看之前的文章总结 :【Servlet + JSP】 目录

2.pageContext

这个作用域是JSP中特有的,不过它的作用域很小,仅在当前jsp页面内。我们主要可以通过它来获取到其他内置对象(request 、session 、application等等...)。

作用域:只在当前jsp页面内,解决了当前页面内的数据共享问题。可以通过它获取到其他的内置对象。

最后

请注意:
在Servlet中只存在三大作用域,分别是:

  • request作用域(HttpServletRequest类型):一次请求内数据共享
  • session作用域(HttpSession类型):一次会话内数据共享
  • application作用域(ServletContext类型):当前项目内数据共享。

JSP中有四大作用域,分别是:

  • request、session、application(和Servlet的三大作用域一样)。
  • pageContext(PageContext类型)(这个作用域是jsp中特有的,可以通过它获取到其他内置对象)。

参考

菜鸟教程JSP:https://www.runoob.com/jsp/jsp-syntax.html

jsp之九大内置对象与四大域对象:https://blog.csdn.net/bighuan/article/details/68925746