转自:Ronbay的新浪博客
JSP中变量的范围分为四种:page,request,session和application。
这四个范围依序从前到后,范围越来越大。
一、page范围
在page范围内定义的变量,只能在同一个页面内部访问。在JSP页面中,演示如下代码:
<%
pageContext.setAttribute("name","Johnson");
out.println(pageContext.getAttribute("name"));
%>
上面的代码中,在page范围内,定义了一个名称为name的属性,其值为Johnson,
第二行代码将该属性的值打印出来。注意:这样定义的这个name属性,在这个页面之外
的部分是访问不到的。考虑到page范围只是在一个页面中共享数据,其范围是非常小的。
需要注意的是,在page范围,以及其他三种范围中,存储的值都只能是引用类型的值。
下面的例子演示怎么将一个整数存入page范围之内。
<%
pageContext.setAttribute("amount",new Integer(100));
out.println(pageContext.getAttribute("amount"));
%>
二、request范围
在Java的WEB应用程序中,可以将一个变量值存入request范围中,然后可以将request
对象传递给下一个页面,那么下一个页面中,可以获得从上一个页面传送过来的request
对象中保存的属性值。
这里,我们修改上一章中的登陆案例,来演示request范围属性的使用。
我们希望用户登录成果以后,能够在登陆成功页面,即welcome.jsp页面中,显示
该登陆用户的用户名,那么可以修改前面登陆案例中的验证登陆用户的servlet如下:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
String name=request.getParameter("name");
String pwd=request.getParameter("pwd");
User user=new User();
user.setName(name);
user.setPwd(pwd);
String dbName=request.getRealPath("goods.mdb");
//转向器
String url="";
try {
db d1 = new db(dbName);
if(d1.isUserValid(user))
{
request.setAttribute("name",name);
url="welcome.jsp";
}
else
{
url="failed.jsp";
}
RequestDispatcher rd=request.getRequestDispatcher(url);
//把用户名存入request scope中
//设置属性
rd.forward(request,response);
}
catch (Exception ex) {
ex.printStackTrace();
}
}
在上面的代码中,用户登陆成功以后,把用户名存入request范围,
request.setAttribute(“name”,name);
然后获取将要转向的页面的转向器,
url=”welcome.jsp”;
RequestDispatcher rd=request.getRequestDispatcher(request,response);
这样,本servlet中的request对象就会被传递到下一个页面,在下一个页面,
即welcome.jsp中,就可以通过
request.getAttribute(“name”);
的方式获取到name属性,即登陆用户的用户名。
三、session范围
当用户通过浏览器和服务器连通以后,服务器为该用户在服务器上分配一个供该用户专
用的内存空间,这个内存空间中保存着用户访问该网站服务器期间的一些信息,这些信
息称为会话信息,也就是Session信息。服务器为每个访问该服务器的连接分配一个唯
一的编号,该编号用以唯一确认该用户。这个编号就是我们通常说的SessionID。
有了这个会话信息空间以后,用户就可以把和本次访问相关的一些信息保存在这个会话
信息空间中。会话信息空间中保存的信息只和本次连接有关。
需要注意的是,通过同一台主机打开多个浏览器访问服务器的时候,每一个浏览器连
接对应一个会话。要设置一个session范围的变量,可以使用下面的方法。
<%
session.setAttribute("name",”Johnson”);
out.println(session.getAttribute("name"));
%>
四、application范围
一台WEB服务器启动以后,在服务器上有一个由所有连接共享的内存空间,
这就是application范围空间。在application范围中定义的变量,可以由所有连接共享。
一个连接对application范围中变量的修改,会体现到另外一个连接中。
要设置一个application范围的变量,可以使用如下方法:
<%
application.setAttribute("name",”Johnson”);
out.println(application.getAttribute("name"));
%>