在这篇博文中,咱们将讨论和学习JSP中的隐式对象及四个做用域。html
这些对象是JSP容器为每一个页面中的开发人员提供的Java对象,开发人员能够直接调用它们而不用显式地声明它们再调用。 JSP隐式对象也称为预约义变量。java
下表列出了JSP支持的九个隐式对象 -程序员
request对象是javax.servlet.http.HttpServletRequest对象的一个实例。每当客户端请求页面时,JSP引擎将建立一个新对象来表示该请求。浏览器
request对象提供了获取包括表单数据,Cookie,HTTP方法等HTTP头信息的方法。缓存
response
对象是javax.servlet.http.HttpServletResponse
对象的一个实例。就像服务器建立request
对象同样,它还建立一个对象来表示对客户端的响应。服务器
response
对象还定义了处理建立新HTTP头的接口。经过此对象,JSP程序员能够添加新的Cookie或日期戳,HTTP状态代码等。session
out
隐式对象是javax.servlet.jsp.JspWriter
对象的一个实例,用于在响应中发送内容。app
初始化JspWriter
对象根据页面是否缓存而不一样地实例化。缓冲能够经过使用page
指令的buffered ='false'
属性来关闭。yii
JspWriter
对象包含与java.io.PrintWriter
类大部分相同的方法。可是,JspWriter
还有一些额外的方法用来处理缓冲。与PrintWriter
对象不一样,JspWriter
会抛出IOExceptions
异常。jsp
session
对象是javax.servlet.http.HttpSession
的一个实例,其行为与Java Servlet下的会话对象行为彻底相同。session
对象用于跟踪客户端请求之间的客户端会话。
application
对象是生成的Servlet
的ServletContext
对象的直接包装,其实是javax.servlet.ServletContext
对象的一个实例。
application
对象是JSP页面在其整个生命周期中的表示。 当JSP页面被初始化时,将建立此对象,而且在JSP页面被jspDestroy()
方法删除时application
对象也将被删除。
经过向application
对象添加属性值,能够确保组成Web应用程序的全部JSP文件均可以访问它。
config
对象是javax.servlet.ServletConfig
的实例化,是生成的servlet的ServletConfig
对象周围的直接包装。
pageContext
对象是javax.servlet.jsp.PageContext
对象的一个实例。pageContext
对象用于表示整个JSP页面。
page
对象是对该页面实例的实际引用。能够认为它是表示整个JSP页面的对象。
page
对象是this
对象的直接同义词。
exception
对象是一个包含上一页抛出的异常的包装器。它一般用于生成对错误条件的适当响应。
所谓“做用域”就是“信息共享的范围”,也就是说一个信息可以在多大的范围内有效。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 | 在当前页面有效 |
由上图可知,这九个内置对象都有相应的做用域,做用域在这里的做用就是限定对象的生命周期。若是跳出了当前对象的做用域,该对象的信息就不能再被访问。
让咱们经过一个例子在理解上述过程
一、首先写一个index.jsp页面调用其中的request、session、application和pageContext这个四个内置对象,并分别给其设置num属性值为1。代码以下:
1 <body> 2 <% 3 pageContext.setAttribute("num", 1); 4 session.setAttribute("num", 1); 5 request.setAttribute("num", 1); 6 application.setAttribute("num", 1); 7 //response.sendRedirect("http://localhost:8088/demo1012/first.jsp"); 8 %> 9 <table> 10 <tr> 11 <td>pageContext:</td> 12 <td><%=pageContext.getAttribute("num")%></td> 13 </tr> 14 <tr> 15 <td>session:</td> 16 <td><%=session.getAttribute("num")%></td> 17 </tr> 18 <tr> 19 <td>request:</td> 20 <td><%=request.getAttribute("num")%></td> 21 </tr> 22 <tr> 23 <td>application:</td> 24 <td><%=application.getAttribute("num")%></td> 25 </tr> 26 </table> 27 </body>
在浏览器请求index.jsp页面显示结果以下:
由结果可知,在index.jsp页面中咱们能够访问四个对象的num属性值。
二、咱们用<jsp:forward page="first.jsp"></jsp:forward>替换上面第7行代码,从新请求index.jsp页面。运行结果以下:
能够看到没法得到以前的那个pageContext对象的num属性值,这主要是由于转发请求到了first页面,跳出了以前的pageContext对象的做用域,如今调用的pageContext对象是first.jsp页面重建的一个。因此其num属性值为null。
三、咱们取消上述代码中第7行的注释,其中first.jsp页面代码就是上述代码的table部分,咱们再从新请求index.jsp页面。运行结果以下:
能够看到没法得到以前的那个pageContext和request的num属性的值了,pageContext的缘由如上,而由于咱们对页面重定向到了first.jsp,开始重浏览器到index.jsp的request链接结束了,因此如今得到的request是在index.jsp到first.jsp页面创建的新request请求域下生成的request对象,因此其num属性未初始化为null。
四、咱们再从新使用其余浏览器访问first.jsp页面,显示的结果以下:
咱们知道当前会话,是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。由于此次咱们使用另外的浏览器对服务器发起请求,因此服务器为此次用户请求创建了新的会话,因此其num的属性值为null。另外由于只有index.jsp页面对四个内置对象的num属性进行了初始化,因此first.jsp页面只有application对象还在其application做用域内。其值为index.jsp页面设置的1,其余两个属性都为null.
五、最后对于application做用域中的对象application,它的有效范围是整个应用。整个应用是指从应用启动,到应用结束。这里并非说“从服务器启动,到服务器关闭”,是由于一个服务器可能部署多个应用,固然你关闭了服务器,就会把上面全部的应用都关闭了。application做用域里的变量,它们的存活时间是最长的,若是不进行手工删除,它们就一直可使用。与上述三个不一样的是,application里的变量能够被全部用户共用。若是用户甲的操做修改了application中的变量,用户乙访问时获得的是修改后的值。这在其余scope中都是不会发生的,page、 request和session都是彻底隔离的,不管如何修改都不会影响其余人的数据。
一、最后你必定就能够理解下面说法了
一、对于JSP九大内置对象和四个做用域的理解:http://www.blogjava.net/ourday/archive/2008/09/20/230107.html
二、JSP九大内置对象:http://www.yiibai.com/jsp/jsp_implicit_objects.html