程序員在寫(xiě)代碼的時(shí)候,難免會(huì)遇到作用域的問(wèn)題,今天我們要談的也是JSP的四大作用域。本文主要總結(jié)了JSP四大作用域page、request、session和application和它們的請(qǐng)求范圍。
1、page
page直譯就是頁(yè)面的意思,所以page作用域就比較好理解了——page作用域表示只在當(dāng)前頁(yè)面有效,也就是用戶請(qǐng)求的頁(yè)面有效。當(dāng)當(dāng)前頁(yè)面關(guān)閉或轉(zhuǎn)到其他頁(yè)面時(shí),page對(duì)象將在響應(yīng)回饋給客戶端后釋放。當(dāng)程序運(yùn)行跑出了當(dāng)前的頁(yè)面,你就無(wú)法在其它的頁(yè)面訪問(wèn)當(dāng)前頁(yè)面設(shè)置的屬性值。
我們都知道,JSP最終會(huì)被編譯成Servlet文件。在Servlet容器中,每個(gè)Servlet都只存在一個(gè)實(shí)例。但是對(duì)于page作用域的屬性來(lái)說(shuō),在當(dāng)前頁(yè)面設(shè)置的屬性只在本次訪問(wèn)該頁(yè)面有效,當(dāng)你再次訪問(wèn)該頁(yè)面時(shí),又會(huì)重新初始化頁(yè)面的屬性。例如以下代碼:
<%out.print(pageContext.getAttribute("SiteName")); // 輸出nullpageContext.setAttribute("SiteName", "果凍想-一個(gè)原創(chuàng)技術(shù)文章分享網(wǎng)站");%>
當(dāng)我在瀏覽器訪問(wèn)該頁(yè)面時(shí)會(huì)輸出null;當(dāng)我再重新打開(kāi)一個(gè)該頁(yè)面時(shí),還會(huì)輸出null,并不會(huì)輸出”果凍想-一個(gè)原創(chuàng)技術(shù)文章分享網(wǎng)站”。也就是說(shuō),page作用域范圍的不會(huì)存在線程安全的問(wèn)題,每一次訪問(wèn)同一個(gè)頁(yè)面,設(shè)置的page作用域的屬性都是不一樣的。
2、request作用域
request表示一次客戶端的請(qǐng)求,他在請(qǐng)求中有效。
request可以通過(guò)setAttribute()和getAttribute方法存取值實(shí)現(xiàn)頁(yè)面中的信息傳遞,也可以通過(guò)forward()方法進(jìn)行頁(yè)面間的跳轉(zhuǎn)(需要注意的是request是轉(zhuǎn)發(fā)不是重定向,轉(zhuǎn)發(fā)相對(duì)于瀏覽器來(lái)說(shuō)是透明的,也就是無(wú)論頁(yè)面如何跳轉(zhuǎn),地址欄上顯示的依舊是最初的地址,瀏覽器感知不到),在這些轉(zhuǎn)發(fā)頁(yè)面中都可以使用request中存儲(chǔ)的信息。
一次請(qǐng)求的生命周期從客戶端發(fā)起到服務(wù)器接收并響應(yīng)該請(qǐng)求,或者將該請(qǐng)求forward到另一個(gè)頁(yè)面或者Servlet進(jìn)行處理而結(jié)束。在此期間,本次請(qǐng)求的參數(shù),屬性都是有效的;一旦客戶端刷新瀏覽器,重新發(fā)起請(qǐng)求,則之前的請(qǐng)求參數(shù)和屬性都將失效。
特別需要注意的是,當(dāng)我們使用<jsp:forward .../>動(dòng)作將當(dāng)前請(qǐng)求轉(zhuǎn)向另一個(gè)頁(yè)面或者Servlet的時(shí)候,該請(qǐng)求的參數(shù)和屬性也一并轉(zhuǎn)過(guò)去,并不會(huì)因?yàn)?lt;jsp:forward .../>動(dòng)作而丟失request的參數(shù)和屬性。
3、session作用域
session作用域在當(dāng)前回話中有效。當(dāng)我們向服務(wù)器發(fā)送第一個(gè)請(qǐng)求開(kāi)始,只要頁(yè)面不關(guān)閉,或者會(huì)話未過(guò)期(默認(rèn)30分鐘),或者未調(diào)用HttpSession的invalidate()方法,接下來(lái)的操作都屬于同一次會(huì)話的范疇。當(dāng)一個(gè)臺(tái)電腦上的同一瀏覽器對(duì)服務(wù)器進(jìn)行多次訪問(wèn)時(shí),在這多次訪問(wèn)之間傳遞的信息就是session作用域的范圍。它從瀏覽器發(fā)出第一個(gè)HTTP請(qǐng)求即可認(rèn)為會(huì)話開(kāi)始,在瀏覽器關(guān)閉時(shí)結(jié)束會(huì)話,但是會(huì)話結(jié)束的時(shí)間是不確定的,因?yàn)樵跒g覽器關(guān)閉時(shí)并不會(huì)通知服務(wù)器,一般Tomcat設(shè)置的默認(rèn)時(shí)間為120分鐘,也可以通過(guò)setMaxInactiveInterval(int)方法進(jìn)行設(shè)置,或是通過(guò)invalidate()方法強(qiáng)制結(jié)束當(dāng)前會(huì)話。session也可以通過(guò)setAttribute賦值和getAttribute取值。
在JSP中,每當(dāng)向服務(wù)器發(fā)送一個(gè)請(qǐng)求,服務(wù)器響應(yīng)這個(gè)請(qǐng)求的時(shí)候,會(huì)在客戶端的cookie中寫(xiě)一個(gè)session id值。每次發(fā)送請(qǐng)求的時(shí)候,會(huì)將該session id值一起發(fā)送到服務(wù)器端,服務(wù)器端根據(jù)該session id值來(lái)判斷每次請(qǐng)求是否屬于同一個(gè)session的范疇之內(nèi)。
4、application作用域
application的作用域是最廣的,它在所有的應(yīng)用程序中都有效。它代表著整個(gè)Web應(yīng)用的全局變量,對(duì)每一個(gè)頁(yè)面,每一個(gè)Servlet都是有效的。當(dāng)我們?cè)赼pplication中設(shè)置屬性時(shí),這個(gè)屬性在任意的一個(gè)頁(yè)面都是可以訪問(wèn)的。
也就是當(dāng)服務(wù)器開(kāi)始到服務(wù)器結(jié)束這段時(shí)間,application作用域中存儲(chǔ)的數(shù)據(jù)都是有效的,同樣可以通過(guò)setAttribute賦值和getAttribute取值。要注意application里的變量可以被所有用戶共用,當(dāng)一個(gè)用戶對(duì)application中的變量做了修改,其他用戶再訪問(wèn)的是修改后的值。
在application作用域中設(shè)置的屬性如果不手動(dòng)調(diào)用removeAttribute函數(shù)進(jìn)行刪除的話,那么application中的屬性將永遠(yuǎn)不會(huì)刪除,如果Web容器發(fā)生重啟,此時(shí)application范圍內(nèi)的所有屬性都將丟失。
Javaweb視頻教程下載
JSP視頻教程:http://www.bjpowernode.com/javavideo/120.html
以上就是天津卓眾教育java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Javaweb視頻下載之JSP四大作用”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
Java視頻教程下載