JSP中的九大隐式对象及四个作用域

在这篇博文中,我们将讨论和学习JSP中的隐式对象及四个作用域。

一、九大隐式对象

这些对象是JSP容器为每个页面中的开发人员提供的Java对象,开发人员可以直接调用它们而不用显式地声明它们再调用。 JSP隐式对象也称为预定义变量。

下表列出了JSP支持的九个隐式对象 -

JSP中的九大隐式对象及四个作用域

1. request对象

request对象是javax.servlet.http.HttpServletRequest对象的一个实例。每当客户端请求页面时,JSP引擎将创建一个新对象来表示该请求。

request对象提供了获取包括表单数据,Cookie,HTTP方法等HTTP头信息的方法。

2. response对象

response对象是javax.servlet.http.HttpServletResponse对象的一个实例。就像服务器创建request对象一样,它还创建一个对象来表示对客户端的响应。

response对象还定义了处理创建新HTTP头的接口。通过此对象,JSP程序员可以添加新的Cookie或日期戳,HTTP状态代码等。

3. out对象

out隐式对象是javax.servlet.jsp.JspWriter对象的一个实例,用于在响应中发送内容。

初始化JspWriter对象根据页面是否缓存而不同地实例化。缓冲可以通过使用page指令的buffered ='false'属性来关闭。

JspWriter对象包含与java.io.PrintWriter类大部分相同的方法。但是,JspWriter还有一些额外的方法用来处理缓冲。与PrintWriter对象不同,JspWriter会抛出IOExceptions异常。

4. session对象

session对象是javax.servlet.http.HttpSession的一个实例,其行为与Java Servlet下的会话对象行为完全相同。
session对象用于跟踪客户端请求之间的客户端会话。

5. application对象

application对象是生成的ServletServletContext对象的直接包装,实际上是javax.servlet.ServletContext对象的一个实例。

application对象是JSP页面在其整个生命周期中的表示。 当JSP页面被初始化时,将创建此对象,并且在JSP页面被jspDestroy()方法删除时application对象也将被删除。

通过向application对象添加属性值,可以确保组成Web应用程序的所有JSP文件都可以访问它。

6. config对象

config对象是javax.servlet.ServletConfig的实例化,是生成的servlet的ServletConfig对象周围的直接包装。

7. pageContext对象

pageContext对象是javax.servlet.jsp.PageContext对象的一个实例。pageContext对象用于表示整个JSP页面。

8. page对象

page对象是对该页面实例的实际引用。可以认为它是表示整个JSP页面的对象。

page对象是this对象的直接同义词。

9. exception对象

exception对象是一个包含上一页抛出的异常的包装器。它通常用于生成对错误条件的适当响应。

二、JSP中四个作用域

所谓“作用域”就是“信息共享的范围”,也就是说一个信息能够在多大的范围内有效。JSP中九个内置对象及其相应所属作用域如下表:

编号 对象 所属作用域 作用域描述
1 request request 在当前请求中有效
2 response page 在当前页面有效
3 out page 在当前页面有效
4 session session 在当前会话中有效
5 application application 在所有应用程序中有效
6 config page 在当前页面有效
7 pageContext page 在当前页面有效
8 page page 在当前页面有效
9 Exception page 在当前页面有效

作用域介绍

由上图可知,这九个内置对象都有相应的作用域,作用域在这里的作用就是限定对象的生命周期。如果跳出了当前对象的作用域,该对象的信息就不能再被访问。

让我们通过一个例子在理解上述过程

1、首先写一个index.jsp页面调用其中的request、session、application和pageContext这个四个内置对象,并分别给其设置num属性值为1。代码如下:

 <body>
<%
pageContext.setAttribute("num", );
session.setAttribute("num", );
request.setAttribute("num", );
application.setAttribute("num", );
//response.sendRedirect("http://localhost:8088/demo1012/first.jsp");
%>
<table>
<tr>
<td>pageContext:</td>
<td><%=pageContext.getAttribute("num")%></td>
</tr>
<tr>
<td>session:</td>
<td><%=session.getAttribute("num")%></td>
</tr>
<tr>
<td>request:</td>
<td><%=request.getAttribute("num")%></td>
</tr>
<tr>
<td>application:</td>
<td><%=application.getAttribute("num")%></td>
</tr>
</table>
</body>

在浏览器请求index.jsp页面显示结果如下:

JSP中的九大隐式对象及四个作用域

由结果可知,在index.jsp页面中我们可以访问四个对象的num属性值。

2、我们用<jsp:forward page="first.jsp"></jsp:forward>替换上面第7行代码,重新请求index.jsp页面。运行结果如下:

JSP中的九大隐式对象及四个作用域

可以看到无法获得之前的那个pageContext对象的num属性值,这主要是因为转发请求到了first页面,跳出了之前的pageContext对象的作用域,现在调用的pageContext对象是first.jsp页面重建的一个。所以其num属性值为null。

3、我们取消上述代码中第7行的注释,其中first.jsp页面代码就是上述代码的table部分,我们再重新请求index.jsp页面。运行结果如下:

JSP中的九大隐式对象及四个作用域

可以看到无法获得之前的那个pageContext和request的num属性的值了,pageContext的原因如上,而因为我们对页面重定向到了first.jsp,开始重浏览器到index.jsp的request连接结束了,所以现在获得的request是在index.jsp到first.jsp页面建立的新request请求域下生成的request对象,所以其num属性未初始化为null。

4、我们再重新使用其他浏览器访问first.jsp页面,显示的结果如下:

JSP中的九大隐式对象及四个作用域

我们知道当前会话,是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。因为这次我们使用另外的浏览器对服务器发起请求,所以服务器为这次用户请求建立了新的会话,所以其num的属性值为null。另外因为只有index.jsp页面对四个内置对象的num属性进行了初始化,所以first.jsp页面只有application对象还在其application作用域内。其值为index.jsp页面设置的1,其他两个属性都为null.

5、最后对于application作用域中的对象application,它的有效范围是整个应用。整个应用是指从应用启动,到应用结束。这里并不是说“从服务器启动,到服务器关闭”,是因为一个服务器可能部署多个应用,当然你关闭了服务器,就会把上面所有的应用都关闭了。application作用域里的变量,它们的存活时间是最长的,如果不进行手工删除,它们就一直可以使用。与上述三个不同的是,application里的变量可以被所有用户共用。如果用户甲的操作修改了application中的变量,用户乙访问时得到的是修改后的值。这在其他scope中都是不会发生的,page、 request和session都是完全隔离的,无论如何修改都不会影响其他人的数据。

总结

1、最后你一定就可以理解下面说法了

JSP中的九大隐式对象及四个作用域

参考资料:

1、对于JSP九大内置对象和四个作用域的理解:http://www.blogjava.net/ourday/archive/2008/09/20/230107.html

2、JSP九大内置对象:http://www.yiibai.com/jsp/jsp_implicit_objects.html

上一篇:[原创]java WEB学习笔记73:Struts2 学习之路-- strut2中防止表单重复提交


下一篇:BZOJ3609 [Heoi2014]人人尽说江南好 【博弈】