DRP之旅第三站--Web 开发的四个范围

      在进行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>web开发的四个范围</title>

<%

Integer countPage = (Integer) pageContext.getAttribute("countPage");

//先判断这个变量是不是存在,如果变量不存在,则要把变量初始化为1,如果存在则累加1.

if (countPage == null) {

pageContext.setAttribute("countPage", 1);

} else {

pageContext.setAttribute("countPage", countPage + 1);

}

%>

<!--跳转页面 -->       

<jsp:forward page="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>

执行结果如下:

clip_image001

也就是说在第一个页面中的变量countPage 并没有传到第二个页面,而是通过第二个页面中的计数器所初始化1.countPage 的生命周期只在当前的页面之中.

request对象是代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,它的范围是指在一JSP网页发出请求到另一个JSP网页之间,当请求结束的时候就生命周期结束。

代码示例方面,核心代码与pageContext所示例的代码一样,只需要将pageContext的地方改为request,执行的结果如下:

clip_image002

通过代码测试可以得到request对象里的变量可以跨越forward前后两个页面,但是再进行刷新的话,他们将会重新计算,如果将值打印在服务器里的话,多次刷新的结果为

clip_image003

session是与某个 Web 客户端的一个用户相关的对象和属性。它的作用范围为一段用户持续和服务器所连接的时间,但与服务器断线后,这个属性就无效。比如断网或者关闭浏览器。

还是同样的核心代码,需要更改的是将countPage 改为session,执行的结果如下:

clip_image004

初次的执行结果和request对象的结果没有什么区别但是当多次刷新得到的结果是:

clip_image005

关闭,或者换一个浏览器再次执行的结果为:

clip_image004[1]

也就是会话结束的时候session的生命周期结束,当然也可以通过代码或者服务器设置来设置session生命周期.

application是与整个 Web 应用程序相关的对象和属性的范围,在服务器一开始执行服务,到服务器关闭为止。它包括了整个Web应用中的多个页面,请求,会话.

代码还是同pageContext一样,需要更改的是将pageContext改为application,执行结果如下:

clip_image006

当多次刷新之后的结果为:

clip_image007

刷新后的结果同session一样,没有什么大的区别,但是当关闭浏览器,或换浏览器的时候结果为:

clip_image008

变量值会继续增加,作用范围仍在继续.当关闭服务器(我用的是Tomcat)并重启时,变量重新开始计数,可以得到application的生命周期为整个web应用.

通过上述的代码和执行结果我们可以从中体会到jsp页面编程中pageContext,Request,Session,application四个对象的作用范围和生命周期.

最后我将用一张图对本文进行总结,如下:

clip_image009

posted @ 2012-03-05 17:16  jnqqls  阅读(294)  评论(0编辑  收藏  举报