所謂的屬性範圍,就是指一個對象可以跨多少個JSP頁面之後可以繼續使用。
在整個JAVA WEB中屬性操作使用如下的方法:
· 設定屬性:public void setAttribute(String name,Object attribute)
· 取得屬性:public Object getAttribute(String name)
· 删除屬性:public Object removeAttribute(String name)
在JSP中有以下四個對象都支援以上的三個方法:
· page(pageContext)
· request
· session
· application
在一個JSP頁面上設定的屬性隻能在一個頁面取得,跳轉到其他頁面則此屬性消失。
<b>PageScopeDemo01.jsp</b><b>:</b>
<%@page contentType="text/html;charset=GBK"%>
<%@page import="java.util.*"%>
<%
// 設定兩個屬性
pageContext.setAttribute("uname","HELLO") ;
pageContext.setAttribute("udate",new Date()) ;
// 取得屬性
String name = (String)pageContext.getAttribute("uname") ;
Date date = (Date)pageContext.getAttribute("udate") ;
%>
<h1>name --> <%=name%></h1>
<h1>date --> <%=date%></h1>
目前頁可以取得所設定的屬性,下面對頁面進行修改,讓其完成一此跳轉。
<b>PageScopeDemo02.jsp</b><b>:</b>
<jsp:forward page="PageScopeDemo03.jsp"/>
<b>PageScopeDemo03.jsp</b><b>:</b>
證明:一個頁面上設定的屬性,隻能在本頁面中取得。如果現在希望可以在跳轉頁中取得,則可以擴大範圍到request範圍上去。
request可以把屬性儲存在一次伺服器跳轉範圍之中。
<b>RequestScopeDemo01.jsp</b><b>:</b>
request.setAttribute("uname","HELLO") ;
request.setAttribute("udate",new Date()) ;
<b><jsp:forward page="RequestScopeDemo02.jsp"/></b>
<b>RequestScopeDemo02.jsp</b><b>:</b>
String name = (String)request.getAttribute("uname") ;
Date date = (Date)request.getAttribute("udate") ;
但是,需要注意的是,如果使用了下面的跳轉形式,則不能夠取得:
<b>RequestScopeDemo03.jsp</b><b>:</b>
<b><a href="RequestScopeDemo02.jsp">RequestScopeDemo02.jsp</a></b>
發現以上程式執行之後,位址欄改變了,但是設定的屬性也消失了。
如果現在希望無論怎樣跳轉,屬性都可以被儲存下來,則就要擴大到session範圍
session屬性範圍無論頁面怎樣跳轉,都可以儲存下來,但是隻針對于同一個浏覽器打開的相關頁面。
<b>SessionScopeDemo01.jsp</b><b>:</b>
session.setAttribute("uname","HELLO") ;
session.setAttribute("udate",new Date()) ;
<a href="SessionScopeDemo02.jsp">SessionScopeDemo02.jsp</a>
<b>SessionScopeDemo02.jsp</b><b>:</b>
String name = (String)session.getAttribute("uname") ;
Date date = (Date)session.getAttribute("udate") ;
可以把每一個使用者了解為一個session。如果現在希望所有的使用者都可以看見,則就可以繼續擴大範圍 —— application範圍。
application範圍,是把屬性設定在整個伺服器上,所有的使用者都可以進行通路。
<b>ApplicationScopeDemo01.jsp</b><b>:</b>
application.setAttribute("uname","HELLO") ;
application.setAttribute("udate",new Date()) ;
<b>ApplicationScopeDemo02.jsp</b><b>:</b>
String name = (String)application.getAttribute("uname") ;
Date date = (Date)application.getAttribute("udate") ;
如果伺服器一關閉,則所有的application屬性都消失,屬性儲存在伺服器之上,如果此屬性儲存的内容過多,則肯定會直接影響到伺服器的性能。是以一般盡可能少設定application屬性。
JSP中如果要想設定一個page範圍的屬性則一定使用pageContext對象,實際上對于整個JSP代碼,所有的四種屬性範圍都是可以通過pageContext對象進行設定的,因為在此對象中的設定屬性方法有兩個:
· public void setAttribute(String name,Object attribute) à 設定的屬性預設為page範圍
· public void setAttribute(String name,Object o,int scope) à 可以指定屬性的範圍
|- 在PageContext類中提供了以下幾個常量:
|- 表示page範圍:public static final int PAGE_SCOPE
|- 表示request範圍:public static final int REQUEST_SCOPE
|- 表示session範圍:public static final int SESSION_SCOPE
|- 表示application範圍:public static final int APPLICATION_SCOPE
下面通過pageContext對象設定一個request範圍的屬性
<b>RequestScopeDemo04.jsp</b><b>:</b>
pageContext.setAttribute("uname","HELLO",PageContext.REQUEST_SCOPE) ;
pageContext.setAttribute("udate",new Date(),PageContext.REQUEST_SCOPE) ;
<jsp:forward page="RequestScopeDemo02.jsp"/>
使用的原則:
· 因為四種屬性範圍的儲存時間不同,是以占用記憶體的時間也就不同了,能使用request就不要使用session,一般情況下,request和session兩個屬性範圍使用的頻率是最高的。
本文轉自 李興華 51CTO部落格,原文連結:http://blog.51cto.com/lixinghua/101383,如需轉載請自行聯系原作者