(这小节内容用到了下节的知识,不清楚的可以先看看下节内容)
在JSP中提供了四种属性的保存范围,所谓属性范围就是指一个内置对象,可以在多少个页面中保存并继续使用:
- page :只在一个页面中保存属性,跳转后无效
- request:只在一次请求中有效,服务器跳转后依然有效
- session:在一次会话中有效,无论何种跳转,跳转后依然可以使用,但是新开的浏览器无法使用
- application:在整个服务器上保存,所有的用户都可以使用
以上这四种内置对象都有以下操作方法: - public void setAttribute(String name,Object o)//设置属性的名称和内容
- public Object getAttribute(String name)//根据属性名称取得属性内容
- public void removeAttribute(String name)//删除指定的属性
page范围
Page属性范围(使用pageContext表示,但是一般习惯将这种范围称为page范围),表示将一个属性设置在本页上,跳转之后无法使用。
实例1:设置和取得page范围的属性:page_scope_demo1.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>My JSP 'page_scope_demo1.jsp' starting page</title>
</head>
<body>
<%
//设置page属性范围,此属性值在当前的jsp页面起作用
pageContext.setAttribute("name", "齐老师");
pageContext.setAttribute("birthday", new Date());
%>
<%
//从page属性范围中取出属性,并向下转型操作
String username = (String) pageContext.getAttribute("name");
Date userbirthday = (Date) pageContext.getAttribute("birthday");
%>
<h2>
姓名:<%=username%></h2>
<h2>
生日:<%=userbirthday%></h2>
</body>
</html>
实例2:修改实例1的代码
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>My JSP 'page_scope_demo1.jsp' starting page</title>
</head>
<body>
<%
//设置page属性范围,此属性值在当前的jsp页面起作用
pageContext.setAttribute("name", "齐老师");
pageContext.setAttribute("birthday", new Date());
%>
<%
//从page属性范围中取出属性,并向下转型操作
String username = (String) pageContext.getAttribute("name");
Date userbirthday = (Date) pageContext.getAttribute("birthday");
%>
<!-- 请求转发 -->
<jsp:forward page="page_scope_demo2.jsp"></jsp:forward>
</body>
</html>
页面设置了跳转语句.
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>My JSP 'page_scope_demo2.jsp' starting page</title>
</head>
<body>
<%
//从page属性范围中取出属性,并向下转型操作
String username = (String) pageContext.getAttribute("name");
Date userbirthday = (Date) pageContext.getAttribute("birthday");
%>
<h2>
姓名:<%=username%></h2>
<h2>
生日:<%=userbirthday%></h2>
</body>
</html>
执行完毕之后,page_scope_demo2.jsp是无法取得属性值的,内容为null.
request范围
如果在服务器跳转后想让属性继续保持下来,则可以使用request属性范围操作,request属性范围表示在服务器跳转后,所有设置的内容依然被保留下来。
实例3:设置请求转发
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>My JSP 'page_scope_demo1.jsp' starting page</title>
</head>
<body>
<%
//设置request属性范围,此属性值在当前的jsp页面起作用
request.setAttribute("name","齐老师");
request.setAttribute("birthday",new Date());
%>
<jsp:forward page="page_scope_demo2.jsp"></jsp:forward>
</body>
</html>
接收请求转发的数据:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>My JSP 'page_scope_demo2.jsp' starting page</title>
</head>
<body>
<%
//从page属性范围中取出属性,并向下转型操作
String username = (String) request.getAttribute("name");
Date userbirthday = (Date) request.getAttribute("birthday");
%>
<h2>
姓名:<%=username%></h2>
<h2>
生日:<%=userbirthday%></h2>
</body>
</html>
实例4:将服务端跳转(请求转发)换成超级链接(客户端跳转,重定向)
设置超链接跳转:重定向
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>My JSP 'request_scope_demo1.jsp' starting page</title>
</head>
<body>
<%
//设置request属性范围,此属性值在当前的jsp页面起作用
request.setAttribute("name", "齐老师");
request.setAttribute("birthday", new Date());
%>
<!-- 通过超级链接跳转后,地址栏改变,属于客户端的跳转 -->
<a href="request_scope_demo2.jsp">通过超级链接取得request的属性</a>
</body>
</html>
接收重定向的数据:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>My JSP 'page_scope_demo2.jsp' starting page</title>
</head>
<body>
<%
//从page属性范围中取出属性,并向下转型操作
String username = (String) request.getAttribute("name");
Date userbirthday = (Date) request.getAttribute("birthday");
%>
<h2>
姓名:<%=username%></h2>
<h2>
生日:<%=userbirthday%></h2>
</body>
</html>
由于request范围只针对服务器端跳转,所以无法获取属性。
关于request属性范围的理解:其表示客户端的请求,在正常情况下,一次请求服务器只会给予一次回应,这时如果是服务器端跳转,请求的地址栏没有改变,相当于回应了一次,而如果地址栏改变了,就相当于发出第二次请求,则第一次请求的内容肯定就已经消失了 ,所以无法取得。
session范围
session属性范围可以在任何一个与设置页面相关的页面中取得,但是重新打开一个新的浏览器直接访问,范围中的属性失效。
实例5:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>My JSP 'session_scope_demo1.jsp' starting page</title>
</head>
<body>
<%
//设置session属性范围,此属性值在当前的jsp页面起作用
session.setAttribute("name","齐老师");
session.setAttribute("birthday",new Date());
%>
<!-- 通过超级链接跳转后,地址栏改变,属于客户端的跳转 -->
<a href="session_scope_demo2.jsp">通过超级链接取得session的属性</a>
</body>
</html>
接收跳转之后的数据:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>My JSP 'session_scope_demo2.jsp' starting page</title>
</head>
<body>
<%
//从page属性范围中取出属性,并向下转型操作
String username=(String)session.getAttribute("name");
Date userbirthday=(Date)session.getAttribute("birthday");
%>
<h2>姓名:<%=username %></h2>
<h2>生日:<%=userbirthday %></h2>
</body>
</html>
application范围
如果希望设置一个属性,让所有的用户(每一个session)都看见,则可以将属性范围设置为application,这样属性就会保存在服务器上,服务器重启属性才消失。过多此属性影响服务器性能。
实例6:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>My JSP 'application_scope_demo1.jsp' starting page</title>
</head>
<body>
<%
//设置application属性范围,此属性值在当前的jsp页面起作用
application.setAttribute("name","齐老师");
application.setAttribute("birthday",new Date());
%>
<!-- 通过超级链接跳转后,地址栏改变,属于客户端的跳转 -->
<a href="application_scope_demo2.jsp">通过超级链接取得application的属性</a>
</body>
</html>
接收application范围中的数据
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<title>My JSP 'application_scope_demo2.jsp' starting page</title>
</head>
<body>
<%
//从appliaction属性范围中取出属性,并向下转型操作
String username=(String)application.getAttribute("name");
Date userbirthday=(Date)application.getAttribute("birthday");
%>
<h2>姓名:<%=username %></h2>
<h2>生日:<%=userbirthday %></h2>
</body>
</html>
总结:
page->request->session->application四个范围依次增大。
page:当前页面有效
request:当前页面有效,一次请求中有效,重新发起请求(重定向)后失效。
session:当前页面有效,一次会话中有效,浏览器关闭失效。其实session有一个有效时间,有效时间内有效,超时失效,默认Tomcat的有效时间为30分钟。可以自行设置。
application:整个容器中有效。