Jsp九大隐式对象&&四大域对象

  
  今天说说Jsp九大隐式对象(隐含对象|内置对象)与四大域对象,jsp面试常问的,不难但是一定要掌握。那就开始了。

一、概述

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

关于在java中的对象详情见下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AaQSXrqd-1575202375913)(尚硅谷_张春胜_JSP.resource\jsp翻译servlet后部分源码2.png)]
  

二、对象详情

1.pageContext
  • 类型:PageContext
  • 定义:代表页面域对象,用来代表整个JSP页面。
  • 作用:
    1. 页面域对象,具体详见:下方四大域对象。
    2. 九大隐式对象的“大哥”,可以直接调用其他八大隐式对象。
  • 在Servlet中获取方式:无。
      
2.request
  • 类型:HttpServletRequest

  • 定义:代表浏览器向服务器发送的请求报文,该对象由服务器创建,最终以参数的形式发送到doGet()和doPost()方法中。

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

  • 作用(详见Servlet中request对象)

    1. 获取请求参数
    2. 获取url地址参数
    3. 请求转发
    4. 向请求域中保存数据(获取数据&移除数据)
    5. 获取请求头信息
  • 在Servlet中获取方式:doGet()或doPost()中直接使用。
      

3.session
  • 类型:HttpSession

  • 定义:代表浏览器与服务器之间的会话。

  • 作用

    • 会话域对象,具体详见:下方四大域对象。

    session对象用来跟踪在各个客户端请求间的会话。

  • 在Servlet中获取方式 :request.getSession();
      

4.application
  • 类型:ServletContext

  • 定义:Servlet上下文,代表当前web应用。

    Web容器在启动时,它会为每个Web应用程序都创建一个唯一对应的ServletContext对象,意思是Servlet上下文,代表当前Web应用。

  • 作用:

  1. 获取项目的上下文路径(带/的项目名):getContextPath()

  2. 获取虚拟路径所映射的本地真实路径:getRealPath(String path)

  3. 获取WEB应用程序的全局初始化参数。

设置Web应用初始化参数的方式是在web.xml的根标签下加入如下代码:

 <web-app>
 	<!-- Web应用初始化参数 -->
 	<context-param>
 		<param-name>ParamName</param-name>
 		<param-value>ParamValue</param-value>
 	</context-param>
 </web-app>

获取Web应用初始化参数:

@Override
public void init(ServletConfig config) throws ServletException {
	//1.获取ServletContext对象
	ServletContext application = config.getServletContext();
	//2.获取Web应用初始化参数
	String paramValue = application.getInitParameter("ParamName");
	System.out.println("全局初始化参数paramValue="+paramValue);
}
  1. 作为域对象共享数据:具体详见:下方四大域对象。
  • 在Servlet中获取方式:使用this.getServletContext()方法获取。
      
5.page
  • 类型:Object
  • 作用:this,当前类对象。
      
6.response
  • 类型:HttpServletResponse
  • 定义:代表服务器向浏览器发送的响应报文,该对象由服务器创建,最终以参数的形式发送到doGet()和doPost()方法中。
  • 作用:
    1. 向页面(响应体)中响应数据,数据包括文本、Html等。
    2. 重定向
  • 在Servlet中获取方式:doGet()或doPost()中直接使用
      
7.config
  • 类型:ServletConfig
  • 定义:代表当前Servlet的配置信息,每一个Servlet都有一个唯一对应的ServletConfig对象。
  • 作用:
    1. 获取Servlet名称:getServletName()
    2. 获取全局上下文ServletContext对象:getServletContext()
    3. 获取Servlet初始化参数:getInitParameter(String) / getInitParameterNames()。
  • 在Servlet中获取方式:this.getServletConfig()
      
8.out
  • 类型:JspWriter
  • 定义:代表当前页面的输出流。
  • 作用:与Servlet中的PrintWriter功能类似,将数据响应到页面,响应的数据可以是页面、页面片段、字符串等。
  • 在Servlet中获取方式:无
      
9.exception
  • 类型:Throwable
  • 定义:代表当前页面的异常对象。
  • 作用:捕获处理页面中的异常信息。
  • 在Servlet中获取方式:new Throwable()

九大内置对象,都是我们可以在【代码脚本】中或【表达式脚本】中直接使用的对象。

  

接下来说说Jsp的四大域对象

1.域对象概述

​ 生活中使用“域对象”比较经典的行业,是快递行业。现如今快递行业大体分为,全球快递,全国快递,同城快递和同区快递。需求不同,使用不同“域对象”。

​ 如:外卖一般使用同区快递,给北京朝阳区的朋友邮寄贺卡,一般使用同城快递。在某宝某东上购买外地商品,一般使用全国快递或全球快递。

2.程序中的域对象

2.1 域对象概述

  程序中的域对象,主要负责在不同web资源之间进行数据交换,(如:servlet和jsp之间的数据交换)。由于不同的web资源之间需要共享数据,所以就有了域对象。

  在Jsp中一共有四个域对象,分别是pageContext 、request、session、application。主要作用是能够在一定范围内共享数据。

2.2 域对象分析

每个域对象内部都维护了一个Map<String , Object>,域对象的共同方法。

  • 设置属性到域中:void setAttribute(String key , Object value);
  • 从域中获取指定的属性:Object getAttribute(String key);
  • 移除域中指定属性:void removeAttribute(String key);
2.3 域对象有效性
  • pageContext: 当前页面中共享数据有效,离开当前页面失效。
    • 每个页面都有自己唯一的一个pageContext对象。
    • 注意servlet中没有该对象。
  • request: 当前请求中共享数据有效。
    • 当前请求:转发、直接访问一个页面为当前请求。
    • 不在当前请求:重定向、 打开页面再点击页面中的超链接不在当前请求 。
  • session: 一次会话范围中共享数据有效。
    • 当前会话:当前浏览器不关闭&不更换浏览器即为当前会话。
    • 只关心浏览器是否关闭,不关心服务器关闭重启。
    • 不同浏览器不共享会话。
  • application: 在服务器运行的一次过程中共享数据有效。
    • 服务器关闭销毁

四大域对象总结

域对象作用范围起始时间结束时间
pageContext当前JSP页面页面加载离开页面
request同一个请求收到请求响应
session同一个会话开始会话结束会话
application当前Web应用Web应用加载Web应用卸载

2.4 四个作用域的测试代码:

新建两个jsp页面。分别取名叫:context1.jsp,context2.jsp

context1.jsp的页面代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
<!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>
	这是context1页面<br/>
	<%
		//设置page域的数据
		pageContext.setAttribute("key", "pageContext-value");
		//设置request域的数据
		request.setAttribute("key", "request-value");
		//设置session域的数据
		session.setAttribute("key", "session-value");
		//设置application域的数据
		application.setAttribute("key", "application-value");
	%>
	<%-- 测试当前页面作用域 --%>
	<%=pageContext.getAttribute("key") %><br/>
	<%=request.getAttribute("key") %><br/>
	<%=session.getAttribute("key") %><br/>
	<%=application.getAttribute("key") %><br/>
	<%	
		// 测试request作用域
// 		request.getRequestDispatcher("/context2.jsp").forward(request, response);
	%>
</body>
</html>    

context2.jsp的页面代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
<!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>
	这是context2页面 <br/>
	<%=pageContext.getAttribute("key") %><br/>
	<%=request.getAttribute("key") %><br/>
	<%=session.getAttribute("key") %><br/>
	<%=application.getAttribute("key") %><br/>
</body>
</html>  


测试操作:
测试pageContext作用域步骤:
直接访问context1.jsp文件。

测试request作用域步骤:
1.在context1.jsp文件中添加转发到context2.jsp(有数据)。
2.直接访问context2.jsp文件 (没有数据)。

测试session作用域步骤:
1.访问完context1.jsp文件。
2.关闭浏览器。但是要保持服务器一直开着。
3.打开浏览器,直接访问context2.jsp文件。

测试application作用域步骤:
1.访问完context1.jsp文件,然后关闭浏览器。
2.停止服务器。再启动服务器。
3.打开浏览器访问context2.jsp文件。

测试结果就下表所示:

域对象作用范围起始时间结束时间
pageContext当前JSP页面页面加载离开页面
request同一个请求收到请求响应
session同一个会话开始会话结束会话
application当前Web应用Web应用加载Web应用卸载

  关于Jsp九大隐式对象&&四大域对象这部分的内容到这里就结束了,有什么问题欢迎大家及时提问交流。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页