javascript
javaweb学习总结(十八)——JSP属性范围
所謂的屬性范圍就是一個(gè)屬性設(shè)置之后,可以經(jīng)過多少個(gè)其他頁面后仍然可以訪問的保存范圍。
一、JSP屬性范圍
JSP中提供了四種屬性范圍,四種屬性范圍分別指以下四種:
- 當(dāng)前頁:一個(gè)屬性只能在一個(gè)頁面中取得,跳轉(zhuǎn)到其他頁面無法取得
- 一次服務(wù)器請(qǐng)求:一個(gè)頁面中設(shè)置的屬性,只要經(jīng)過了服務(wù)器跳轉(zhuǎn),則跳轉(zhuǎn)之后的頁面可以繼續(xù)取得。
- 一次會(huì)話:一個(gè)用戶設(shè)置的內(nèi)容,只要是與此用戶相關(guān)的頁面都可以訪問(一個(gè)會(huì)話表示一個(gè)人,這個(gè)人設(shè)置的東西只要這個(gè)人不走,就依然有效)
- 上下文中:在整個(gè)服務(wù)器上設(shè)置的屬性,所有人都可以訪問
二、屬性的操作方法
既然JSP中提供了四種屬性范圍,則四種屬性范圍中都將包含以下的屬性操作方法。
| No. | 方法 | 描述 |
| 1 | public?void?setAttribute(String?name,Object?value) | 設(shè)置屬性 |
| 2 | public?object?getAttribute(String?name) | 取得屬性 |
| 3 | public?void?removeAttribute(String?name) | 刪除屬性 |
屬性的操作無外乎就是增加、取得和刪除這個(gè)幾個(gè)操作。
單詞Attribute的意思是“屬性”,setAttribute(String?name,Object?value)從單詞的組合來看就可以知道是這個(gè)方法的是設(shè)置屬性,設(shè)置屬性的名字和屬性的值,名字(name)為String類型,值(value)為Object類型,由于值為Object類型,這表示可以設(shè)置任意類型的數(shù)據(jù)作為值,因?yàn)樗械念惗际菑腛bject類型繼承而來。因此設(shè)置屬性值的時(shí)候可以是任意類型的數(shù)據(jù)。getAttribute(String?name)方法是根據(jù)屬性的名字取得屬性,removeAttribute(String?name)方法是根據(jù)屬性的名字刪除屬性。
三、JSP四種屬性范圍的具體介紹
3.1、page屬性范圍(pageContext)
page屬性范圍相對(duì)好理解一些:在一個(gè)頁面設(shè)置的屬性,跳轉(zhuǎn)到其他頁面就無法訪問了。但是在使用page屬性范圍的時(shí)候必須注意的是,雖然習(xí)慣上將頁面范圍的屬性稱為page范圍,但是實(shí)際上操作的時(shí)候是使用pageContext內(nèi)置對(duì)象完成的。
pageContext屬性范圍操作流程圖
pageContext從字面上的定義,可以發(fā)現(xiàn),是表示一個(gè)頁面(page)的上下文(Context),可以表示一個(gè)頁面中的所有內(nèi)容。
從操作流程圖來看,在第一個(gè)頁面設(shè)置的屬性經(jīng)過服務(wù)器端跳轉(zhuǎn)到第二個(gè)頁面以后,在第二個(gè)頁面是無法取得在第一個(gè)頁面中設(shè)置的屬性的,就好比現(xiàn)在坐著的桌子上有一支筆,但一旦離開了這張桌子,坐到別的桌子上時(shí),筆就沒有了。
下面通過代碼來觀察此范圍的屬性
范例:pageContextDemo01.jsp
在頁面中設(shè)置兩個(gè)屬性
1 <%@page contentType="text/html;charset=UTF-8"%>2 <%@page import="java.util.*"%>3 <%4 //此時(shí)設(shè)置的屬性只能夠在本頁中取得5 pageContext.setAttribute("name","孤傲蒼狼"); //設(shè)置屬性6 pageContext.setAttribute("date",new Date()); //設(shè)置屬性7 //注意:這里設(shè)置的兩個(gè)屬性的名字分別為name和date,這兩個(gè)是字符串類型的數(shù)據(jù),但對(duì)應(yīng)的屬性值MLDN和new Date這個(gè)兩個(gè)值卻不是字符串類型,而是兩個(gè)Object類型的數(shù)據(jù)。8 %>9 <% 10 //取得設(shè)置的屬性 11 String refName = (String)pageContext.getAttribute("name"); 12 //由于取得的值為Object類型,因此必須使用String強(qiáng)制向下轉(zhuǎn)型,轉(zhuǎn)換成String類型 13 Date refDate = (Date)pageContext.getAttribute("date"); 14 %> 15 <h1>姓名:<%=refName%></h1> 16 <h1>日期:<%=refDate%></h1>程序運(yùn)行結(jié)果如下:
這說明了在本頁設(shè)置的pageContext范圍屬性在本頁確實(shí)可以取得,下面使用跳轉(zhuǎn)語句,觀察跳轉(zhuǎn)之后是否還可以取得屬性。
范例: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標(biāo)簽進(jìn)行服務(wù)器端跳轉(zhuǎn)--%> 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只是設(shè)置了兩個(gè)屬性,跳轉(zhuǎn)到pageScopeDemo03.jsp之后再在pageScopeDemo03.jsp中取在pageScopeDemo02.jsp設(shè)置的page屬性。此時(shí),運(yùn)行結(jié)果如下:
使用了服務(wù)器端跳轉(zhuǎn),但是發(fā)現(xiàn)內(nèi)容并不能取得,證明page范圍的屬性只能在本頁中取得,跳轉(zhuǎn)到其他頁面之中不能取得。如果現(xiàn)在希望跳轉(zhuǎn)到其他頁面之中,依然可以取得,則可以擴(kuò)大屬性范圍,使用request屬性范圍即可。
3.2、request屬性范圍
request屬性范圍表示在一次服務(wù)器跳轉(zhuǎn)中有效,只要是服務(wù)器跳轉(zhuǎn),則設(shè)置的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標(biāo)簽進(jìn)行服務(wù)器端跳轉(zhuǎn)--%> 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設(shè)置的屬性 5 String refName = (String)request.getAttribute("name"); 6 Date refDate = (Date)request.getAttribute("date"); 7 %> 8 <h1>姓名:<%=refName%></h1> 9 <h1>日期:<%=refDate%></h1>運(yùn)行結(jié)果如下:
從運(yùn)行結(jié)果來看,程序跳轉(zhuǎn)了,但是與page范圍相比,內(nèi)容可以向下繼續(xù)傳遞,即在第一個(gè)頁面設(shè)置的屬性跳轉(zhuǎn)到第二個(gè)頁面后在第二個(gè)頁面中依然可以取得第一個(gè)頁面設(shè)置的屬性。
如果現(xiàn)在有第三個(gè)頁面了,則也可以繼續(xù)向后傳遞
范例:修改requestScopeDemo02.jsp
1 <%@page contentType="text/html;charset=UTF-8"%> 2 <%@page import="java.util.*"%> 3 <%--使用jsp:forward標(biāo)簽進(jìn)行服務(wù)器端跳轉(zhuǎn)--%> 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設(shè)置的屬性 5 String refName = (String)request.getAttribute("name"); 6 Date refDate = (Date)request.getAttribute("date"); 7 %> 8 <h1>姓名:<%=refName%></h1> 9 <h1>日期:<%=refDate%></h1>以上的結(jié)果依然可以訪問,但是如果,此時(shí)使用了超鏈接的方式傳遞的話,則屬性是無法向下繼續(xù)傳遞的。
范例:修改requestScopeDemo03.jsp
1 <%@page contentType="text/html;charset=UTF-8"%>2 <%@page import="java.util.*"%>3 <%4 //取得requestScopdemo01.jsp設(shè)置的屬性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 <%--使用超鏈接的形式跳轉(zhuǎn),這是客戶端跳轉(zhuǎn),URL地址會(huì)改變--%> 12 <a href="${pageContext.request.contextPath}/requestScopeDemo04.jsp">跳轉(zhuǎn)到requestScopeDemo04.jsp</a> 13 </h1>此時(shí)使用了超鏈接跳轉(zhuǎn),一旦跳轉(zhuǎn)之后,地址欄改變,所以此種跳轉(zhuǎn)也可以稱為客戶端跳轉(zhuǎn)。
requestScopeDemo04.jsp
1 <%@page contentType="text/html;charset=UTF-8"%> 2 <%@page import="java.util.*"%> 3 <% 4 //取得requestScopdemo01.jsp設(shè)置的屬性 5 String refName = (String)request.getAttribute("name"); 6 Date refDate = (Date)request.getAttribute("date"); 7 %> 8 <h1>姓名:<%=refName%></h1> 9 <h1>日期:<%=refDate%></h1>運(yùn)行結(jié)果:
?
requestScopeDemo04.jsp頁面顯示的結(jié)果是null。這說明了在requestScopeDemo01.jsp這個(gè)頁面設(shè)置的屬性經(jīng)過超鏈接這種客戶端跳轉(zhuǎn)到別的頁面時(shí)別的頁面是無法取得requestScopeDemo01.jsp中設(shè)置的屬性的。
如果還想進(jìn)一步擴(kuò)大屬性范圍,則可以使用session范圍屬性
?3.3、session屬性范圍
session設(shè)置的屬性不管如何跳轉(zhuǎn),都可以取得的。當(dāng)然,session只針對(duì)一個(gè)用戶
在第一個(gè)頁面上設(shè)置的屬性,跳轉(zhuǎn)(服務(wù)器跳轉(zhuǎn)/客戶端跳轉(zhuǎn))到其他頁面之后,其他的頁面依然可以取得第一個(gè)頁面上設(shè)置的屬性。
下面通過代碼來觀察session屬性范圍
范例:sessionScopeDemo01.jsp
1 <%@page contentType="text/html;charset=UTF-8"%> 2 <%@page import="java.util.*"%> 3 <% 4 //此時(shí)設(shè)置的屬性只能夠在與本頁相關(guān)的任何頁面中取得 5 session.setAttribute("name","孤傲蒼狼"); //設(shè)置屬性 6 session.setAttribute("date",new Date()); 7 %> 8 <%--使用服務(wù)器端跳轉(zhuǎn)--%> 9 <jsp:forward page="/sessionScopeDemo02.jsp"/>這里使用的是服務(wù)器端跳轉(zhuǎn)
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 <%--使用超鏈接這種客戶端跳轉(zhuǎn)--%> 10 <h1><a href="${pageContext.request.contextPath}/sessionScopeDemo03.jsp">sessionScopeDemo03</a></h1>這里使用的是超鏈接這種客戶端跳轉(zhuǎn)
運(yùn)行程序sessionScopeDemo01.jsp結(jié)果如下所示:
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>點(diǎn)擊超鏈接sessionScopeDemo03,跳轉(zhuǎn)到了sessionScopeDemo03.jsp這個(gè)頁面,此時(shí)程序的運(yùn)行結(jié)果如下:
這說明了即使是采用客戶端跳轉(zhuǎn),在別的頁面依然可以取得第一個(gè)頁面中設(shè)置的session屬性。但是,如果,此時(shí)新開了一個(gè)瀏覽器,則sessionScopeDemo03.jsp肯定無法取得sessionScopeDemo01.jsp中設(shè)置的session對(duì)象的屬性,因?yàn)閟ession只是保留了一個(gè)人的信息。
如果一個(gè)屬性想讓所有的用戶都可以訪問,則可以使用最后一種屬性范圍:application范圍。
3.4、application屬性范圍
因?yàn)閍pplication屬性范圍是在服務(wù)器上設(shè)置的一個(gè)屬性,所以一旦設(shè)置之后任何用戶都可以瀏覽到此屬性。
下面通過代碼來觀察application屬性范圍
范例:applicationScopeDemo01.jsp
1 <%@ page contentType="text/html;charset=GBK"%> 2 <%@ page import="java.util.*"%> 3 <% 4 //此時(shí)設(shè)置的屬性任何用戶都可以取得 5 application.setAttribute("name","孤傲蒼狼"); //設(shè)置屬性 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>觀察頁面的運(yùn)行效果:
開啟多個(gè)瀏覽器窗口,運(yùn)行applicationScopeDemo02.jsp時(shí),都可以顯示出上圖所示的結(jié)果,因?yàn)閷傩苑秶O(shè)置在了服務(wù)器中,所以只要是連接到此服務(wù)器的任意用戶都可以取得此屬性,當(dāng)然,如果服務(wù)器關(guān)閉的話,則此屬性肯定消失。
如把Tomcat服務(wù)器先關(guān)閉后再重新啟動(dòng),打開瀏覽器窗口運(yùn)行applicationScopeDemo02.jsp時(shí),得到的結(jié)果如下圖所示:
注意:如果在服務(wù)器上設(shè)置了過多的application屬性,則會(huì)影響到服務(wù)器的性能。
3.5、關(guān)于pageContext屬性范圍的進(jìn)一步補(bǔ)充
之前所講解的四種屬性范圍,實(shí)際上都是通過pageContext屬性范圍設(shè)置上的。打開pageContext所在的說明文檔。
PageContext類繼承了JspContext類,在JspContext類中定義了setAttribute方法,如下:
??????? ?public?abstract?void?setAttribute(String name,Object value,int?scope)?
? 此方法中存在一個(gè)scope的整型變量,此變量就表示一個(gè)屬性的保存范圍。
PageContext類繼承了JspContext類,所以在PageContext類中實(shí)現(xiàn)了抽象的setAttribute方法:
1 public abstract void setAttribute(String name,Object value,int scope)這個(gè)setAttribute()方法如果不寫后面的int類型的scope參數(shù),則此參數(shù)默認(rèn)為PAGE_SCOPE,則此時(shí)setAttribute()方法設(shè)置的就是page屬性范圍,如果傳遞過來的int類型參數(shù)scope為REQUEST_SCOPE,則此時(shí)setAttribute()方法設(shè)置的就是request屬性范圍,同理,傳遞的scope參數(shù)為SESSION_SCOPE和APPLICATION_SCOPE時(shí),則表示setAttribute()方法設(shè)置的就是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); //設(shè)置屬性,并指明屬性范圍 5 pageContext.setAttribute("date",new Date(),PageContext.REQUEST_SCOPE); //設(shè)置屬性,并指明屬性范圍 6 %> 7 <jsp:forward page="/pageScopeDemo05.jsp"/>pageScopeDemo05.jsp
1 <%@page contentType="text/html;charset=GBK"%>2 <%@page import="java.util.*"%>3 <%4 //使用request對(duì)象獲取屬性5 String refName = (String)request.getAttribute("name");6 Date refDate = (Date)request.getAttribute("date");7 //也可以使用pageContext對(duì)象獲取屬性,只要在獲取時(shí)指明對(duì)象的屬性范圍即可8 String refName2 = (String)pageContext.getAttribute("name", PageContext.REQUEST_SCOPE);9 Date refDate2 = (Date)pageContext.getAttribute("date", PageContext.REQUEST_SCOPE); 10 %> 11 使用request對(duì)象獲取屬性: 12 <h1>姓名:<%=refName%></h1> 13 <h1>日期:<%=refDate%></h1> 14 使用pageContext對(duì)象獲取屬性: 15 <h1>姓名:<%=refName2%></h1> 16 <h1>日期:<%=refDate2%></h1>運(yùn)行結(jié)果:
從運(yùn)行結(jié)果可以看到:在pageScopeDemo04.jsp使用的是pageContext對(duì)象調(diào)用setAttribute()方法設(shè)置的屬性范圍是request的屬性范圍,因此在調(diào)用此方法時(shí),把一個(gè)int類型的scope范圍常量REQUEST_SCOPE傳遞了進(jìn)來,這個(gè)REQUEST_SCOPE屬性范圍常量的作用就是告訴pageContext對(duì)象現(xiàn)在要設(shè)置的屬性范圍是request的屬性范圍,所以pageScopeDemo05.jsp這個(gè)頁面中可以直接使用request.getAttribute();方法獲取在pageScopeDemo04.jsp設(shè)置的屬性。
四、jsp四種屬性范圍的使用場(chǎng)合
1、request:如果客戶向服務(wù)器發(fā)請(qǐng)求,產(chǎn)生的數(shù)據(jù),用戶看完就沒用了,像這樣的數(shù)據(jù)就存在request域,像新聞數(shù)據(jù),屬于用戶看完就沒用的。
2、session:如果客戶向服務(wù)器發(fā)請(qǐng)求,產(chǎn)生的數(shù)據(jù),用戶用完了等一會(huì)兒還有用,像這樣的數(shù)據(jù)就存在session域中,像購物數(shù)據(jù),用戶需要看到自己購物信息,并且等一會(huì)兒,還要用這個(gè)購物數(shù)據(jù)結(jié)帳。
3、application(servletContext):如果客戶向服務(wù)器發(fā)請(qǐng)求,產(chǎn)生的數(shù)據(jù),用戶用完了,還要給其它用戶用,像這樣的數(shù)據(jù)就存在application(servletContext)域中,像聊天數(shù)據(jù)。
總結(jié)
以上是生活随笔為你收集整理的javaweb学习总结(十八)——JSP属性范围的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javaweb学习总结(十六)——JSP
- 下一篇: javaweb学习总结(十九)——JSP