在进行DRP项目的过程中接触到与Web开发有关的四个范围的相关概念.这四个范围分别是pageContext,Request,Session,application,这四个范围主要是在Jsp页面中,当然其他语言的WEB开发也是类似的四个范围.
这里所说的范围概念用另一个词来说是"域",再具体一些就是一个对象的生命周期.在上述四个对象共同之处是可以承载一些"内容",但不同之处是他们承载这些内容的域(生命周期)是不同的.
本文主要来描述四个对象的作用域并用代码进行验证.
pageContext对象是代表与一个页面相关的对象和属性,它的范围只适用于当前页面范围,如果超过这个页面就不能够使用了。也就是说使用pageContext对象是无法向其他页面传递参数的.
接下来的示例有两个页面test_scope_pageContext.jsp和test_scope_pageContext2.jsp两个页面通过forward标签进行跳转.在两个页面中对pageContext作用域中的变量进行累加1,随后跳转到test_scope_pageContext2.jsp在进行累加并显示结果,通过对显示的结果我们可以进行相应的判断.
test_scope_pageContext.jsp页面代码
<%@ page language="java" contentType="text/html;charset=GB18030"
pageEncoding="GB18030"%>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=GB18030">
<title>pageContext</title>
<%
Integer countPage = (Integer)pageContext.getAttribute("countPage");
//先判断这个变量是不是存在,如果变量不存在,则要把变量初始化为1,如果存在则累加1.
if (countPage == null) {
pageContext.setAttribute("countPage", 1);
} else {
pageContext.setAttribute("countPage", countPage + 1);
}
%>
<!--跳转页面 -->
<jsp:forwardpage="test_scope_pageContext2.jsp"></jsp:forward>
</head>
<body>
</body>
</html>
test_scope_pageContext2.jsp页面代码
<%@ page language="java" contentType="text/html;charset=GB18030" pageEncoding="GB18030"%> <head> <meta http-equiv="Content-Type"content="text/html; charset=GB18030"> <title>pageContext</title> <% Integer countPage = (Integer)pageContext.getAttribute("countPage"); //先判断这个变量是不是存在,如果变量不存在,则要把变量初始化为1,如果存在则累加1. if (countPage == null) { pageContext.setAttribute("countPage", 1); } else{ pageContext.setAttribute("countPage", countPage + 1); } %> </head> <body> <div>跳转页面后的变量值为:<%=pageContext.getAttribute("countPage")%></div> </body> </html>
执行结果如下:
也就是说在第一个页面中的变量countPage并没有传到第二个页面,而是通过第二个页面中的计数器所初始化1.countPage 的生命周期只在当前的页面之中.
request对象是代表与 Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,它的范围是指在一JSP网页发出请求到另一个JSP网页之间,当请求结束的时候就生命周期结束。
代码示例方面,核心代码与pageContext所示例的代码一样,只需要将pageContext的地方改为request,执行的结果如下:
通过代码测试可以得到request对象里的变量可以跨越forward前后两个页面,但是再进行刷新的话,他们将会重新计算,如果将值打印在服务器里的话,多次刷新的结果为
session是与某个 Web客户端的一个用户相关的对象和属性。它的作用范围为一段用户持续和服务器所连接的时间,但与服务器断线后,这个属性就无效。比如断网或者关闭浏览器。
还是同样的核心代码,需要更改的是将countPage 改为session,执行的结果如下:
初次的执行结果和request对象的结果没有什么区别但是当多次刷新得到的结果是:
关闭,或者换一个浏览器再次执行的结果为:
也就是会话结束的时候session的生命周期结束,当然也可以通过代码或者服务器设置来设置session生命周期.
application是与整个 Web应用程序相关的对象和属性的范围,在服务器一开始执行服务,到服务器关闭为止。它包括了整个Web应用中的多个页面,请求,会话.
代码还是同pageContext一样,需要更改的是将pageContext改为application,执行结果如下:
当多次刷新之后的结果为:
刷新后的结果同session一样,没有什么大的区别,但是当关闭浏览器,或换浏览器的时候结果为:
变量值会继续增加,作用范围仍在继续.当关闭服务器(我用的是Tomcat)并重启时,变量重新开始计数,可以得到application的生命周期为整个web应用.
通过上述的代码和执行结果我们可以从中体会到jsp页面编程中pageContext,Request,Session,application四个对象的作用范围和生命周期.
最后我将用一张图对本文进行总结,如下: