1.數(shù)據(jù)共享:OneServlet工作完畢后崖技,將產(chǎn)生數(shù)據(jù)交給TwoServlet來(lái)使用
Servlet規(guī)范中提供四種數(shù)據(jù)共享方案
1.ServletContext接口
2.Cookie類
3.HttpSession接口
4.HttpServletRequest接口
ServletContext接口:
1.介紹:
1)來(lái)自于Servlet規(guī)范中一個(gè)接口荣月。在Tomcat中存在servlet-api.jar在Tomcat中負(fù)責(zé)提供這個(gè)接口實(shí)現(xiàn)類
2)如果兩個(gè)Servlet來(lái)自于同一個(gè)網(wǎng)站。彼此之間通過(guò)網(wǎng)站的ServletContext 實(shí)例對(duì)象實(shí)現(xiàn)數(shù)據(jù)共享
3)開(kāi)發(fā)人員習(xí)慣于將ServletContext對(duì)象稱為【全局作用域?qū)ο蟆?/p>
2.工作原理:
每一個(gè)網(wǎng)站都存在一個(gè)全局作用域?qū)ο蟆?這個(gè)全局作用域?qū)ο蟆鞠喈?dāng)于】一個(gè)Map.在這個(gè)網(wǎng)站中OneServlet可以將一個(gè)數(shù)據(jù)存入到全局作用域?qū)ο螅?dāng)前網(wǎng)站中其他Servlet此時(shí)都可以從全局作用域?qū)ο蟮玫竭@個(gè)數(shù)據(jù)進(jìn)行使用
3.全局作用域?qū)ο笊芷冢?br>
1)在Http服務(wù)器啟動(dòng)過(guò)程中贿衍,自動(dòng)為當(dāng)前網(wǎng)站在內(nèi)存中創(chuàng)建一個(gè)全局作用域?qū)ο?br>
2)在Http服務(wù)器運(yùn)行期間時(shí)盆均,一個(gè)網(wǎng)站只有一個(gè)全局作用域?qū)ο?br>
3)在Http服務(wù)器運(yùn)行期間,全局作用域?qū)ο笠恢碧幱诖婊顮顟B(tài)
4)在Http服務(wù)器準(zhǔn)備關(guān)閉時(shí)肩碟,負(fù)責(zé)將當(dāng)前網(wǎng)站中全局作用域?qū)ο筮M(jìn)行銷毀處理
全局作用域?qū)ο笊芷谪灤┚W(wǎng)站整個(gè)運(yùn)行期間
4.命令實(shí)現(xiàn): 【同一個(gè)網(wǎng)站】OneServlet將數(shù)據(jù)共享給TwoServlet
OneServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response){
//1.通過(guò)【請(qǐng)求對(duì)象】向Tomcat索要當(dāng)前網(wǎng)站中【全局作用域?qū)ο蟆? ServletContext application = request.getServletContext();
//2.將數(shù)據(jù)添加到全局作用域?qū)ο笞鳛椤竟蚕頂?shù)據(jù)】
application.setAttribute("key1",數(shù)據(jù)) }
}
TwoServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response){
//1.通過(guò)【請(qǐng)求對(duì)象】向Tomcat索要當(dāng)前網(wǎng)站中【全局作用域?qū)ο蟆?ServletContext application = request.getServletContext();
//2.從全局作用域?qū)ο蟮玫街付P(guān)鍵字對(duì)應(yīng)數(shù)據(jù)
Object 數(shù)據(jù) = application.getAttribute("key1"); }
}
Cookie:
1.介紹:
1)Cookie來(lái)自于Servlet規(guī)范中一個(gè)工具類强窖,存在于Tomcat提供servlet-api.jar中
2)如果兩個(gè)Servlet來(lái)自于同一個(gè)網(wǎng)站,并且為同一個(gè)瀏覽器/用戶提供服務(wù)削祈,此時(shí)借助于Cookie對(duì)象進(jìn)行數(shù)據(jù)共享
3).Cookie存放當(dāng)前用戶的私人數(shù)據(jù)翅溺,在共享數(shù)據(jù)過(guò)程中提高服務(wù)質(zhì)量
4).在現(xiàn)實(shí)生活場(chǎng)景中,Cookie相當(dāng)于用戶在服務(wù)端得到會(huì)員卡
2.原理:
用戶通過(guò)瀏覽器第一次向MyWeb網(wǎng)站發(fā)送請(qǐng)求申請(qǐng)OneServlet OneServlet在運(yùn)行期間創(chuàng)建一個(gè)Cookie存儲(chǔ)與當(dāng)前用戶相關(guān)數(shù)據(jù) OneServlet工作完畢后,將Cookie寫入到響應(yīng)頭交還給當(dāng)前瀏覽器
瀏覽器收到響應(yīng)響應(yīng)包之后髓抑,將cookie存儲(chǔ)在瀏覽器的緩存
一段時(shí)間之后咙崎,用戶通過(guò)同一個(gè)瀏覽器再次向myWeb網(wǎng)站發(fā)送請(qǐng)求申請(qǐng)TwoServlet時(shí)。瀏覽器需要無(wú)條件的將myWeb網(wǎng)站之前推送過(guò)來(lái)的Cookie吨拍,寫入到請(qǐng)求頭發(fā)送過(guò)去此時(shí)TwoServlet在運(yùn)行時(shí)褪猛,就可以通過(guò)讀取請(qǐng)求頭中cookie中信息,得到OneServlet提供的共享數(shù)據(jù)
3.實(shí)現(xiàn)命令: 同一個(gè)網(wǎng)站 OneServlet 與 TwoServlet 借助于Cookie實(shí)現(xiàn)數(shù)據(jù)共享
OneServlet{
public void doGet(HttpServletRequest request,HttpServletResponse resp){
//1.創(chuàng)建一個(gè)cookie對(duì)象羹饰,保存共享數(shù)據(jù)(當(dāng)前用戶數(shù)據(jù))
Cookie card = new Cookie("key1","abc");
Cookie card1= new Cookie("key2","efg");
//cookie相當(dāng)于一個(gè)map
//一個(gè)cookie中只能存放一個(gè)鍵值對(duì)
//這個(gè)鍵值對(duì)的key與value只能是String
//鍵值對(duì)中key不能是中文
//2.【發(fā)卡】將cookie寫入到響應(yīng)頭伊滋,交給瀏覽器
resp.addCookie(card);
resp.addCookie(card1);}
}
TwoServlet{
public void doGet(HttpServletRequest request,HttpServletResponse resp){
//1.調(diào)用請(qǐng)求對(duì)象從請(qǐng)求頭得到瀏覽器返回的Cookie
Cookie cookieArray[] = request.getCookies();
//2.循環(huán)遍歷數(shù)據(jù)得到每一個(gè)cookie的key 與 value
for(Cookie card:cookieArray){
String key = card.getName(); //讀取key "key1"
Strign value = card.getValue();//讀取value "abc"
// 提供較好的服務(wù)碳却。涂滴。 }
}
}
4.Cookie銷毀時(shí)機(jī):
1.在默認(rèn)情況下乃秀,Cookie對(duì)象存放在瀏覽器的緩存中有巧。因此只要瀏覽器關(guān)閉肮疗,Cookie對(duì)象就被銷毀掉
2.在手動(dòng)設(shè)置情況下霸琴,可以要求瀏覽器將接收的Cookie尽狠。存放在客戶端計(jì)算機(jī)上硬盤上焕梅,同時(shí)需要指定Cookie在硬盤上存活時(shí)間输吏。在存活時(shí)間范圍內(nèi)物舒,關(guān)閉瀏覽器關(guān)閉客戶端計(jì)算機(jī)色洞,關(guān)閉服務(wù)器,都不會(huì)導(dǎo)致Cookie 被銷毀。在存活時(shí)間到達(dá)時(shí)冠胯,Cookie自動(dòng)從硬盤上被刪除
cookie.setMaxAge(60); //cookie在硬盤上存活1分鐘
HttpSession接口:
1.介紹:
1)HttpSession接口來(lái)自于Servlet規(guī)范下一個(gè)接口火诸。存在于Tomcat中servlet-api.jar,其實(shí)現(xiàn)類由Http服務(wù)器提供。Tomcat提供實(shí)現(xiàn)類存在于servlet-api.jar
2)如果兩個(gè)Servlet來(lái)自于同一個(gè)網(wǎng)站荠察,并且為同一個(gè)瀏覽器/用戶提供服務(wù)置蜀,此時(shí) 借助于HttpSession對(duì)象進(jìn)行數(shù)據(jù)共享
3)開(kāi)發(fā)人員習(xí)慣于將HttpSession接口修飾對(duì)象稱為【會(huì)話作用域?qū)ο蟆?/p>
2.HttpSession 與 Cookie 區(qū)別:【面試題】
1)存儲(chǔ)位置: 一個(gè)在天上,一個(gè)在地下
Cookie:存放在客戶端計(jì)算機(jī)(瀏覽器內(nèi)存/硬盤)
HttpSession:存放在服務(wù)端計(jì)算機(jī)內(nèi)存
2)數(shù)據(jù)類型:
Cookie對(duì)象存儲(chǔ)共享數(shù)據(jù)類型只能是String
HttpSession對(duì)象可以存儲(chǔ)任意類型的共享數(shù)據(jù)Object
- 數(shù)據(jù)數(shù)量:
一個(gè)Cookie對(duì)象只能存儲(chǔ)一個(gè)共享數(shù)據(jù)
HttpSession使用map集合存儲(chǔ)共享數(shù)據(jù)悉盆,所以可以存儲(chǔ)任意數(shù)量共享數(shù)據(jù)
4)參照物:
Cookie相當(dāng)于客戶在服務(wù)端【會(huì)員卡】
HttpSession相當(dāng)于客戶在服務(wù)端【私人保險(xiǎn)柜】
3.命令實(shí)現(xiàn): 同一個(gè)網(wǎng)站(myWeb)下OneServlet將數(shù)據(jù)傳遞給TwoServlet
OneServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response){
//1.調(diào)用請(qǐng)求對(duì)象向Tomcat索要當(dāng)前用戶在服務(wù)端的私人儲(chǔ)物柜
HttpSession session = request.getSession();
//2.將數(shù)據(jù)添加到用戶私人儲(chǔ)物柜
session.setAttribute("key1",共享數(shù)據(jù)) }
}
//瀏覽器訪問(wèn)/myWeb中TwoServlet
TwoServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response){
//1.調(diào)用請(qǐng)求對(duì)象向Tomcat索要當(dāng)前用戶在服務(wù)端的私人儲(chǔ)物柜
HttpSession session = request.getSession();
//2.從會(huì)話作用域?qū)ο蟮玫絆neServlet提供的共享數(shù)據(jù)
Object 共享數(shù)據(jù) = session.getAttribute("key1");}
}
4.Http服務(wù)器如何將用戶與HttpSession關(guān)聯(lián)起來(lái)
Tomcat在創(chuàng)建一個(gè)HttpSession對(duì)象時(shí)自動(dòng)為這個(gè)HttpSession對(duì)象生成一個(gè)編號(hào)
Tomcat將編號(hào)保存到cookie對(duì)象盯荤,推送到當(dāng)前瀏覽器緩存
cookie.JESSIONID
等到用戶第二次來(lái)訪時(shí),Tomcat根據(jù)請(qǐng)求頭JESSIONID確認(rèn)用戶是否有HttpSession以及哪一個(gè)HttpSession是當(dāng)前用戶的
5.getSession() 與 getSession(false)
1)getSession(): 如果當(dāng)前用戶在服務(wù)端已經(jīng)擁有了自己的私人儲(chǔ)物柜.要求tomcat將這個(gè)私人儲(chǔ)物柜進(jìn)行返回如果當(dāng)前用戶在服務(wù)端尚未擁有自己的私人儲(chǔ)物柜要求tocmat為當(dāng)前用戶創(chuàng)建一個(gè)全新的私人儲(chǔ)物柜
2)getSession(false):如果當(dāng)前用戶在服務(wù)端已經(jīng)擁有了自己的私人儲(chǔ)物柜. 要求tomcat將這個(gè)私人儲(chǔ)物柜進(jìn)行返回如果當(dāng)前用戶在服務(wù)端尚未擁有自己的私人儲(chǔ)物柜此時(shí)Tomcat將返回null
6.HttpSession銷毀時(shí)機(jī):
1.用戶與HttpSession關(guān)聯(lián)時(shí)使用的Cookie只能存放在瀏覽器緩存中.
2.在瀏覽器關(guān)閉時(shí)焕盟,意味著用戶與他的HttpSession關(guān)系被切斷
3.由于Tomcat無(wú)法檢測(cè)瀏覽器何時(shí)關(guān)閉秋秤,因此在瀏覽器關(guān)閉時(shí)并不會(huì)導(dǎo)致Tomcat將瀏覽器關(guān)聯(lián)的HttpSession進(jìn)行銷毀
4.為了解決這個(gè)問(wèn)題,Tomcat為每一個(gè)HttpSession對(duì)象設(shè)置【空閑時(shí)間】這個(gè)空閑時(shí)間默認(rèn)30分鐘脚翘,如果當(dāng)前HttpSession對(duì)象空閑時(shí)間達(dá)到30分鐘此時(shí)Tomcat認(rèn)為用戶已經(jīng)放棄了自己的HttpSession灼卢,此時(shí)Tomcat就會(huì)銷毀掉這個(gè)HttpSession
7.HttpSession空閑時(shí)間手動(dòng)設(shè)置
在當(dāng)前網(wǎng)站/web/WEB-INF/web.xml
<session-config>
<session-timeout>5</session-timeout>
<!--當(dāng)前網(wǎng)站中每一個(gè)session最大空閑時(shí)間5分鐘-->
</session-config>
HttpServletRequest接口實(shí)現(xiàn)數(shù)據(jù)共享
1.介紹:
1) 在同一個(gè)網(wǎng)站中,如果兩個(gè)Servlet之間通過(guò)【請(qǐng)求轉(zhuǎn)發(fā)】方式進(jìn)行調(diào)用来农, 彼此之間共享同一個(gè)請(qǐng)求協(xié)議包鞋真。而一個(gè)請(qǐng)求協(xié)議包只對(duì)應(yīng)一個(gè)請(qǐng)求對(duì)象 因此servlet之間共享同一個(gè)請(qǐng)求對(duì)象,此時(shí)可以利用這個(gè)請(qǐng)求對(duì)象在兩個(gè)Servlet之間實(shí)現(xiàn)數(shù)據(jù)共享
2) 在請(qǐng)求對(duì)象實(shí)現(xiàn)Servlet之間數(shù)據(jù)共享功能時(shí)沃于,開(kāi)發(fā)人員將請(qǐng)求對(duì)象稱為【請(qǐng)求作用域?qū)ο蟆?/p>
2.命令實(shí)現(xiàn): OneServlet通過(guò)請(qǐng)求轉(zhuǎn)發(fā)申請(qǐng)調(diào)用TwoServlet時(shí)涩咖,需要給TwoServlet提供共享數(shù)據(jù)
OneServlet{
public void doGet(HttpServletRequest req,HttpServletResponse response){
//1.將數(shù)據(jù)添加到【請(qǐng)求作用域?qū)ο蟆恐衋ttribute屬性
req.setAttribute("key1",數(shù)據(jù)); //數(shù)據(jù)類型可以任意類型Object
//2.向Tomcat申請(qǐng)調(diào)用TwoServlet
req.getRequestDispatcher("/two").forward(req,response)}
}
TwoServlet{
public void doGet(HttpServletRequest req,HttpServletResponse response){
//從當(dāng)前請(qǐng)求對(duì)象得到OneServlet寫入到共享數(shù)據(jù)
Object 數(shù)據(jù) = req.getAttribute("key1"); }
}