一、在JSP中提供了四种属性的保存范围,所谓的属性保存范围,指的是一个设置的对象,可以在多少个页面中保存并可以继续使用。
四种属性范围包括:
1.pageContext:只在一个页面中保存属性,跳转之后无效。
2.request:只在一次请求中保存,服务器跳转后依然有效。
3.session:在一次会话范围中,无论何种跳转都可以使用,但是新开浏览器无法使用。
4.application:在整个服务器上保存,所有用户都可以使用。
以上四个内置对象都有一下属性操作方法:
1.设置属性的名称及内容
public void setAttribute(String name, Object o)
2.根据属性名称取得属性
public Object getAttribute(String name)
3.删除指定的属性
public void removeAttribute(String name)
注:设置属性的时候,属性名称是String,而属性的内容是Object即可以设置任意内容
二、page属性范围(pageContext属性范围)
表示将一个属性设置在本页上,跳转后无法取得。
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<html>
<head><title>欢迎来到望星空</title></head>
<body>
<%
pageContext.setAttribute("name", "Joywy");
pageContext.setAttribute("birthday", new Date());
%>
<%
String name = (String)pageContext.getAttribute("name");
Date birth = (Date)pageContext.getAttribute("birthday");
%>
<h2>姓名:<%=name%></h2>
<h2>生日:<%=birth%></h2>
</body>
</html>
三、request属性范围
1.如果要在服务器跳转之后属性可以继续保存下来,则可以使用request属性范围操作,request属性范围表示的是在服务器跳转之后,所有设置的内容依然会保留下来。
request_1.jsp
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<html>
<head><title>欢迎来到望星空</title></head>
<body>
<%
request.setAttribute("name", "Joywy");
request.setAttribute("birthday", new Date());
%>
<jsp:forward page="request_2.jsp"/>
</body>
</html>
request_2.jsp
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<html>
<head><title>欢迎来到望星空</title></head>
<body>
<%
String name = (String)request.getAttribute("name");
Date birth = (Date)request.getAttribute("birthday");
%>
<h2>姓名:<%=name%></h2>
<h2>生日:<%=birth%></h2>
</body>
</html>
注:使用超链接进行页面的跳转,首先地址栏会发生改变,应该是属于客户端跳转,客户端跳转是无法传递request属性的。2.关于request属性范围的理解
request表示的是客户端的请求,正常情况下,一次请求服务器只会给予一次回应,那么这个时候如果是服务器跳转,请求的地址栏没有改变,所以也就相当于回应了一次,而如果地址栏改变了,就相当于是发出了第二次请求,则第一次请求的内容肯定就已经消失了,所以无法取得。
四、session属性范围
如果希望一个属性设置之后,可以在任何一个与设置页面相关的页面中取得的话,则可以使用session属性范围,使用session设置属性之后,不管是客户端跳转还是服务器端跳转,只要属性设置了,就都可以取得。
注意:session只保存在当前的浏览器之中,并且可以从相关的页面中取得。对于服务器而言,每一个连接到他的客户端都是一个session。
五、application属性范围
application属性范围可以让所有的用户(每一个session)都可以看见,这样属性就保存在服务器上了。但是如果此时服务器重新启动了,则无法取得。因为关闭后属性消失,要想再访问,则可以重新设置。application属性范围的内容都是保存在服务器上的,当设置很多个application的话,则服务器的性能肯定会有所降低,而且四种属性范围都是保存在服务器上的,有一个原则:能使用page范围的就不要使用request,能使用request的就不要使用session,能使用session的就不要使用application,因为保存范围越窄,则肯定对于服务器的压力就越低。
六、深入研究page属性范围
之前研究过的page属性范围中使用的是pageContext进行属性设置的,但是从javax.servlet.PageContext类中可以发现,有以下一种设置属性的方法
1.public void setAttribute(String name, Object value, int scope)
2.在PageContext类中存在四个表示属性范围的常量,可以直接通过这些常量指定scope的内容:
(1)public static final int PAGE_SCOPE
(2)public static final int REQUEST_SCOPE
(3)public static final int SESSION_SCOPE
(4)public static final int APPLICATION_SCOPE
样例:
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<html>
<head><title>欢迎来到望星空</title></head>
<body>
<%
pageContext.setAttribute("name", "Joywy", PageContext.REQUEST_SCOPE);
pageContext.setAttribute("birthday", new Date(), PageContext.REQUEST_SCOPE);
%>
<%
String name = (String)pageContext.getAttribute("name");
Date birth = (Date)pageContext.getAttribute("birthday");
%>
<h2>姓名:<%=name%></h2>
<h2>生日:<%=birth%></h2>
</body>
</html>
此时是通过pageContext将一个属性设置成了request范围。
注意:pageContext可以操作四钟范围。