今天说说Jsp九大隐式对象(隐含对象|内置对象)与四大域对象,jsp面试常问的,不难但是一定要掌握。那就开始了。
一、概述
Jsp共有九大隐式对象,也叫隐含对象或内置对象。JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量。
关于在java中的对象详情见下图:
二、对象详情
1.pageContext
- 类型:PageContext
- 定义:代表页面域对象,用来代表整个JSP页面。
- 作用:
- 页面域对象,具体详见:下方四大域对象。
- 九大隐式对象的“大哥”,可以直接调用其他八大隐式对象。
- 在Servlet中获取方式:无。
2.request
-
类型:HttpServletRequest
-
定义:代表浏览器向服务器发送的请求报文,该对象由服务器创建,最终以参数的形式发送到doGet()和doPost()方法中。
每当客户端请求一个JSP页面时,JSP引擎就会制造一个新的request对象来代表这个请求。request对象提供了一系列方法来获取HTTP头信息,cookies,HTTP方法等等。
-
作用(详见Servlet中request对象)
- 获取请求参数
- 获取url地址参数
- 请求转发
- 向请求域中保存数据(获取数据&移除数据)
- 获取请求头信息
-
在Servlet中获取方式:doGet()或doPost()中直接使用。
3.session
-
类型:HttpSession
-
定义:代表浏览器与服务器之间的会话。
-
作用
扫描二维码关注公众号,回复: 9116886 查看本文章- 会话域对象,具体详见:下方四大域对象。
session对象用来跟踪在各个客户端请求间的会话。
-
在Servlet中获取方式 :request.getSession();
4.application
-
类型:ServletContext
-
定义:Servlet上下文,代表当前web应用。
Web容器在启动时,它会为每个Web应用程序都创建一个唯一对应的ServletContext对象,意思是Servlet上下文,代表当前Web应用。
-
作用:
-
获取项目的上下文路径(带/的项目名):getContextPath()
-
获取虚拟路径所映射的本地真实路径:getRealPath(String path)
-
获取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);
}
- 作为域对象共享数据:具体详见:下方四大域对象。
- 在Servlet中获取方式:使用this.getServletContext()方法获取。
5.page
- 类型:Object
- 作用:this,当前类对象。
6.response
- 类型:HttpServletResponse
- 定义:代表服务器向浏览器发送的响应报文,该对象由服务器创建,最终以参数的形式发送到doGet()和doPost()方法中。
- 作用:
- 向页面(响应体)中响应数据,数据包括文本、Html等。
- 重定向
- 在Servlet中获取方式:doGet()或doPost()中直接使用
7.config
- 类型:ServletConfig
- 定义:代表当前Servlet的配置信息,每一个Servlet都有一个唯一对应的ServletConfig对象。
- 作用:
- 获取Servlet名称:getServletName()
- 获取全局上下文ServletContext对象:getServletContext()
- 获取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九大隐式对象&&四大域对象这部分的内容到这里就结束了,有什么问题欢迎大家及时提问交流。