所謂的屬性範圍就是一個屬性設置以後,能夠通過多少個其餘頁面後仍然能夠訪問的保存範圍。html
JSP中提供了四種屬性範圍,四種屬性範圍分別指如下四種:java
既然JSP中提供了四種屬性範圍,則四種屬性範圍中都將包含如下的屬性操做方法。瀏覽器
No.服務器 |
方法session |
描述app |
1jsp |
public void setAttribute(String name,Object value)性能 |
設置屬性spa |
23d |
public object getAttribute(String name) |
取得屬性 |
3 |
public void removeAttribute(String name) |
刪除屬性 |
屬性的操做無外乎就是增長、取得和刪除這個幾個操做。
單詞Attribute的意思是「屬性」,setAttribute(String name,Object value)從單詞的組合來看就能夠知道是這個方法的是設置屬性,設置屬性的名字和屬性的值,名字(name)爲String類型,值(value)爲Object類型,因爲值爲Object類型,這表示能夠設置任意類型的數據做爲值,由於全部的類都是從Object類型繼承而來。所以設置屬性值的時候能夠是任意類型的數據。getAttribute(String name)方法是根據屬性的名字取得屬性,removeAttribute(String name)方法是根據屬性的名字刪除屬性。
page屬性範圍相對好理解一些:在一個頁面設置的屬性,跳轉到其餘頁面就沒法訪問了。可是在使用page屬性範圍的時候必須注意的是,雖然習慣上將頁面範圍的屬性稱爲page範圍,可是實際上操做的時候是使用pageContext內置對象完成的。
pageContext屬性範圍操做流程圖
pageContext從字面上的定義,能夠發現,是表示一個頁面(page)的上下文(Context),能夠表示一個頁面中的全部內容。
從操做流程圖來看,在第一個頁面設置的屬性通過服務器端跳轉到第二個頁面之後,在第二個頁面是沒法取得在第一個頁面中設置的屬性的,就比如如今坐着的桌子上有一支筆,但一旦離開了這張桌子,坐到別的桌子上時,筆就沒有了。
下面經過代碼來觀察此範圍的屬性
範例:pageContextDemo01.jsp
在頁面中設置兩個屬性
1 <%@page contentType="text/html;charset=UTF-8"%> 2 <%@page import="java.util.*"%> 3 <% 4 //此時設置的屬性只可以在本頁中取得 5 pageContext.setAttribute("name","孤傲蒼狼"); //設置屬性 6 pageContext.setAttribute("date",new Date()); //設置屬性 7 //注意:這裏設置的兩個屬性的名字分別爲name和date,這兩個是字符串類型的數據,但對應的屬性值MLDN和new Date這個兩個值卻不是字符串類型,而是兩個Object類型的數據。 8 %> 9 <% 10 //取得設置的屬性 11 String refName = (String)pageContext.getAttribute("name"); 12 //因爲取得的值爲Object類型,所以必須使用String強制向下轉型,轉換成String類型 13 Date refDate = (Date)pageContext.getAttribute("date"); 14 %> 15 <h1>姓名:<%=refName%></h1> 16 <h1>日期:<%=refDate%></h1>
程序運行結果以下:
這說明了在本頁設置的pageContext範圍屬性在本頁確實能夠取得,下面使用跳轉語句,觀察跳轉以後是否還能夠取得屬性。
範例:pageScopeDemo02.jsp
1 <%@page contentType="text/html;charset=UTF-8"%> 2 <%@page import="java.util.*"%> 3 <% 4 pageContext.setAttribute("name","孤傲蒼狼"); 5 pageContext.setAttribute("date",new Date()); 6 %> 7 <%--使用jsp:forward標籤進行服務器端跳轉--%> 8 <jsp:forward page="/pageScopeDemo03.jsp" />
範例:pageScopeDemo03.jsp
1 <%@page contentType="text/html;charset=UTF-8"%> 2 <%@page import="java.util.*"%> 3 <% 4 String refName = (String)pageContext.getAttribute("name"); 5 Date refDate = (Date)pageContext.getAttribute("date"); 6 %> 7 <h1>姓名:<%=refName%></h1> 8 <h1>日期:<%=refDate%></h1>
在以上程序中的pageScopeDemo02.jsp只是設置了兩個屬性,跳轉到pageScopeDemo03.jsp以後再在pageScopeDemo03.jsp中取在pageScopeDemo02.jsp設置的page屬性。此時,運行結果以下:
使用了服務器端跳轉,可是發現內容並不能取得,證實page範圍的屬性只能在本頁中取得,跳轉到其餘頁面之中不能取得。若是如今但願跳轉到其餘頁面之中,依然能夠取得,則能夠擴大屬性範圍,使用request屬性範圍便可。
request屬性範圍表示在一次服務器跳轉中有效,只要是服務器跳轉,則設置的request屬性能夠一直傳遞下去。
範例:requestScopeDemo01.jsp
1 <%@page contentType="text/html;charset=UTF-8"%> 2 <%@page import="java.util.*"%> 3 <% 4 request.setAttribute("name","孤傲蒼狼"); 5 request.setAttribute("date",new Date()); 6 %> 7 <%--使用jsp:forward標籤進行服務器端跳轉--%> 8 <jsp:forward page="/requestScopeDemo02.jsp" />
範例:requestScopeDemo02.jsp
1 <%@page contentType="text/html;charset=UTF-8"%> 2 <%@page import="java.util.*"%> 3 <% 4 //取得requestScopdemo01.jsp設置的屬性 5 String refName = (String)request.getAttribute("name"); 6 Date refDate = (Date)request.getAttribute("date"); 7 %> 8 <h1>姓名:<%=refName%></h1> 9 <h1>日期:<%=refDate%></h1>
運行結果以下:
從運行結果來看,程序跳轉了,可是與page範圍相比,內容能夠向下繼續傳遞,即在第一個頁面設置的屬性跳轉到第二個頁面後在第二個頁面中依然能夠取得第一個頁面設置的屬性。
若是如今有第三個頁面了,則也能夠繼續向後傳遞
範例:修改requestScopeDemo02.jsp
1 <%@page contentType="text/html;charset=UTF-8"%> 2 <%@page import="java.util.*"%> 3 <%--使用jsp:forward標籤進行服務器端跳轉--%> 4 <jsp:forward page="/requestScopeDemo03.jsp" />
範例:requestScopeDemo03.jsp
1 <%@page contentType="text/html;charset=UTF-8"%> 2 <%@page import="java.util.*"%> 3 <% 4 //取得requestScopdemo01.jsp設置的屬性 5 String refName = (String)request.getAttribute("name"); 6 Date refDate = (Date)request.getAttribute("date"); 7 %> 8 <h1>姓名:<%=refName%></h1> 9 <h1>日期:<%=refDate%></h1>
以上的結果依然能夠訪問,可是若是,此時使用了超連接的方式傳遞的話,則屬性是沒法向下繼續傳遞的。
範例:修改requestScopeDemo03.jsp
1 <%@page contentType="text/html;charset=UTF-8"%> 2 <%@page import="java.util.*"%> 3 <% 4 //取得requestScopdemo01.jsp設置的屬性 5 String refName = (String)request.getAttribute("name"); 6 Date refDate = (Date)request.getAttribute("date"); 7 %> 8 <h1>姓名:<%=refName%></h1> 9 <h1>日期:<%=refDate%></h1> 10 <h1> 11 <%--使用超連接的形式跳轉,這是客戶端跳轉,URL地址會改變--%> 12 <a href="${pageContext.request.contextPath}/requestScopeDemo04.jsp">跳轉到requestScopeDemo04.jsp</a> 13 </h1>
此時使用了超連接跳轉,一旦跳轉以後,地址欄改變,因此此種跳轉也能夠稱爲客戶端跳轉。
requestScopeDemo04.jsp
1 <%@page contentType="text/html;charset=UTF-8"%> 2 <%@page import="java.util.*"%> 3 <% 4 //取得requestScopdemo01.jsp設置的屬性 5 String refName = (String)request.getAttribute("name"); 6 Date refDate = (Date)request.getAttribute("date"); 7 %> 8 <h1>姓名:<%=refName%></h1> 9 <h1>日期:<%=refDate%></h1>
運行結果:
requestScopeDemo04.jsp頁面顯示的結果是null。這說明了在requestScopeDemo01.jsp這個頁面設置的屬性通過超連接這種客戶端跳轉到別的頁面時別的頁面是沒法取得requestScopeDemo01.jsp中設置的屬性的。
若是還想進一步擴大屬性範圍,則可使用session範圍屬性
session設置的屬性無論如何跳轉,均可以取得的。固然,session只針對一個用戶
在第一個頁面上設置的屬性,跳轉(服務器跳轉/客戶端跳轉)到其餘頁面以後,其餘的頁面依然能夠取得第一個頁面上設置的屬性。
下面經過代碼來觀察session屬性範圍
範例:sessionScopeDemo01.jsp
1 <%@page contentType="text/html;charset=UTF-8"%> 2 <%@page import="java.util.*"%> 3 <% 4 //此時設置的屬性只可以在與本頁相關的任何頁面中取得 5 session.setAttribute("name","孤傲蒼狼"); //設置屬性 6 session.setAttribute("date",new Date()); 7 %> 8 <%--使用服務器端跳轉--%> 9 <jsp:forward page="/sessionScopeDemo02.jsp"/>
這裏使用的是服務器端跳轉
sessionScopeDemo02.jsp
1 <%@page contentType="text/html;charset=UTF-8"%> 2 <%@page import="java.util.*"%> 3 <% 4 String refName = (String)session.getAttribute("name"); 5 Date refDate = (Date)session.getAttribute("date"); 6 %> 7 <h1>姓名:<%=refName%></h1> 8 <h1>日期:<%=refDate%></h1> 9 <%--使用超連接這種客戶端跳轉--%> 10 <h1><a href="${pageContext.request.contextPath}/sessionScopeDemo03.jsp">sessionScopeDemo03</a></h1>
這裏使用的是超連接這種客戶端跳轉
運行程序sessionScopeDemo01.jsp結果以下所示:
sessionScopeDemo03.jsp
1 <%@page contentType="text/html;charset=UTF-8"%> 2 <%@page import="java.util.*"%> 3 <% 4 String refName = (String)session.getAttribute("name"); 5 Date refDate = (Date)session.getAttribute("date"); 6 %> 7 <h1>姓名:<%=refName%></h1> 8 <h1>日期:<%=refDate%></h1>
點擊超連接sessionScopeDemo03,跳轉到了sessionScopeDemo03.jsp這個頁面,此時程序的運行結果以下:
這說明了即便是採用客戶端跳轉,在別的頁面依然能夠取得第一個頁面中設置的session屬性。可是,若是,此時新開了一個瀏覽器,則sessionScopeDemo03.jsp確定沒法取得sessionScopeDemo01.jsp中設置的session對象的屬性,由於session只是保留了一我的的信息。
若是一個屬性想讓全部的用戶均可以訪問,則可使用最後一種屬性範圍:application範圍。
由於application屬性範圍是在服務器上設置的一個屬性,因此一旦設置以後任何用戶均可以瀏覽到此屬性。
下面經過代碼來觀察application屬性範圍
範例:applicationScopeDemo01.jsp
1 <%@ page contentType="text/html;charset=GBK"%> 2 <%@ page import="java.util.*"%> 3 <% 4 //此時設置的屬性任何用戶均可以取得 5 application.setAttribute("name","孤傲蒼狼"); //設置屬性 6 application.setAttribute("date",new Date()); 7 %> 8 <h1><a href="${pageContext.request.contextPath}/applicationScopeDemo02.jsp">applicationScopeDemo02</a></h1>
範例:applicationScopeDemo02.jsp
1 <%@ page contentType="text/html;charset=GBK"%> 2 <%@ page import="java.util.*"%> 3 <% 4 String refName = (String)application.getAttribute("name"); 5 Date refDate = (Date)application.getAttribute("date"); 6 %> 7 <h1>姓名:<%=refName%></h1> 8 <h1>日期:<%=refDate%></h1>
觀察頁面的運行效果:
開啓多個瀏覽器窗口,運行applicationScopeDemo02.jsp時,均可以顯示出上圖所示的結果,由於屬性範圍設置在了服務器中,因此只要是鏈接到此服務器的任意用戶均可以取得此屬性,固然,若是服務器關閉的話,則此屬性確定消失。
如把Tomcat服務器先關閉後再從新啓動,打開瀏覽器窗口運行applicationScopeDemo02.jsp時,獲得的結果以下圖所示:
注意:若是在服務器上設置了過多的application屬性,則會影響到服務器的性能。
以前所講解的四種屬性範圍,實際上都是經過pageContext屬性範圍設置上的。打開pageContext所在的說明文檔。
PageContext類繼承了JspContext類,在JspContext類中定義了setAttribute方法,以下:
public abstract void setAttribute(String name,Object value,int scope)
此方法中存在一個scope的整型變量,此變量就表示一個屬性的保存範圍。
PageContext類繼承了JspContext類,因此在PageContext類中實現了抽象的setAttribute方法:
1 public abstract void setAttribute(String name,Object value,int scope)
這個setAttribute()方法若是不寫後面的int類型的scope參數,則此參數默認爲PAGE_SCOPE,則此時setAttribute()方法設置的就是page屬性範圍,若是傳遞過來的int類型參數scope爲REQUEST_SCOPE,則此時setAttribute()方法設置的就是request屬性範圍,同理,傳遞的scope參數爲SESSION_SCOPE和APPLICATION_SCOPE時,則表示setAttribute()方法設置的就是session屬性範圍和application屬性範圍。
下面經過代碼來觀察此四種屬性範圍常量的做用,以:request爲例
範例:pageScopeDemo04.jsp
1 <%@page contentType="text/html;charset=GBK"%> 2 <%@page import="java.util.*"%> 3 <% 4 pageContext.setAttribute("name","孤傲蒼狼",PageContext.REQUEST_SCOPE); //設置屬性,並指明屬性範圍 5 pageContext.setAttribute("date",new Date(),PageContext.REQUEST_SCOPE); //設置屬性,並指明屬性範圍 6 %> 7 <jsp:forward page="/pageScopeDemo05.jsp"/>
pageScopeDemo05.jsp
1 <%@page contentType="text/html;charset=GBK"%> 2 <%@page import="java.util.*"%> 3 <% 4 //使用request對象獲取屬性 5 String refName = (String)request.getAttribute("name"); 6 Date refDate = (Date)request.getAttribute("date"); 7 //也可使用pageContext對象獲取屬性,只要在獲取時指明對象的屬性範圍便可 8 String refName2 = (String)pageContext.getAttribute("name", PageContext.REQUEST_SCOPE); 9 Date refDate2 = (Date)pageContext.getAttribute("date", PageContext.REQUEST_SCOPE); 10 %> 11 使用request對象獲取屬性: 12 <h1>姓名:<%=refName%></h1> 13 <h1>日期:<%=refDate%></h1> 14 使用pageContext對象獲取屬性: 15 <h1>姓名:<%=refName2%></h1> 16 <h1>日期:<%=refDate2%></h1>
運行結果:
從運行結果能夠看到:在pageScopeDemo04.jsp使用的是pageContext對象調用setAttribute()方法設置的屬性範圍是request的屬性範圍,所以在調用此方法時,把一個int類型的scope範圍常量REQUEST_SCOPE傳遞了進來,這個REQUEST_SCOPE屬性範圍常量的做用就是告訴pageContext對象如今要設置的屬性範圍是request的屬性範圍,因此pageScopeDemo05.jsp這個頁面中能夠直接使用request.getAttribute();方法獲取在pageScopeDemo04.jsp設置的屬性。
一、request:若是客戶向服務器發請求,產生的數據,用戶看完就沒用了,像這樣的數據就存在request域,像新聞數據,屬於用戶看完就沒用的。 二、session:若是客戶向服務器發請求,產生的數據,用戶用完了等一下子還有用,像這樣的數據就存在session域中,像購物數據,用戶須要看到本身購物信息,而且等一下子,還要用這個購物數據結賬。 三、application(servletContext):若是客戶向服務器發請求,產生的數據,用戶用完了,還要給其它用戶用,像這樣的數據就存在application(servletContext)域中,像聊天數據。