java httpserver 多个接口_多个Servlet之间数据共享实现方案
1.數(shù)據(jù)共享:OneServlet工作完畢后,將產(chǎn)生數(shù)據(jù)交給TwoServlet來使用
Servlet規(guī)范中提供四種數(shù)據(jù)共享方案
1.ServletContext接口
2.Cookie類
3.HttpSession接口
4.HttpServletRequest接口
ServletContext接口:
1.介紹:
1)來自于Servlet規(guī)范中一個接口。在Tomcat中存在servlet-api.jar在Tomcat中負(fù)責(zé)提供這個接口實(shí)現(xiàn)類
2)如果兩個Servlet來自于同一個網(wǎng)站。彼此之間通過網(wǎng)站的ServletContext 實(shí)例對象實(shí)現(xiàn)數(shù)據(jù)共享
3)開發(fā)人員習(xí)慣于將ServletContext對象稱為【全局作用域?qū)ο蟆?/p>
2.工作原理:
每一個網(wǎng)站都存在一個全局作用域?qū)ο蟆?這個全局作用域?qū)ο蟆鞠喈?dāng)于】一個Map.在這個網(wǎng)站中OneServlet可以將一個數(shù)據(jù)存入到全局作用域?qū)ο?#xff0c;當(dāng)前網(wǎng)站中其他Servlet此時都可以從全局作用域?qū)ο蟮玫竭@個數(shù)據(jù)進(jìn)行使用
3.全局作用域?qū)ο笊芷?#xff1a;
1)在Http服務(wù)器啟動過程中,自動為當(dāng)前網(wǎng)站在內(nèi)存中創(chuàng)建一個全局作用域?qū)ο?/p>
2)在Http服務(wù)器運(yùn)行期間時,一個網(wǎng)站只有一個全局作用域?qū)ο?/p>
3)在Http服務(wù)器運(yùn)行期間,全局作用域?qū)ο笠恢碧幱诖婊顮顟B(tài)
4)在Http服務(wù)器準(zhǔn)備關(guān)閉時,負(fù)責(zé)將當(dāng)前網(wǎng)站中全局作用域?qū)ο筮M(jìn)行銷毀處理
全局作用域?qū)ο笊芷谪灤┚W(wǎng)站整個運(yùn)行期間
4.命令實(shí)現(xiàn): 【同一個網(wǎng)站】OneServlet將數(shù)據(jù)共享給TwoServlet
OneServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response){
//1.通過【請求對象】向Tomcat索要當(dāng)前網(wǎng)站中【全局作用域?qū)ο蟆?/p>
ServletContext application = request.getServletContext();
//2.將數(shù)據(jù)添加到全局作用域?qū)ο笞鳛椤竟蚕頂?shù)據(jù)】
application.setAttribute("key1",數(shù)據(jù)) }
}
TwoServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response){
//1.通過【請求對象】向Tomcat索要當(dāng)前網(wǎng)站中【全局作用域?qū)ο蟆?/p>
ServletContext application = request.getServletContext();
//2.從全局作用域?qū)ο蟮玫街付P(guān)鍵字對應(yīng)數(shù)據(jù)
Object 數(shù)據(jù) = application.getAttribute("key1"); }
}
Cookie:
1.介紹:
1)Cookie來自于Servlet規(guī)范中一個工具類,存在于Tomcat提供servlet-api.jar中
2)如果兩個Servlet來自于同一個網(wǎng)站,并且為同一個瀏覽器/用戶提供服務(wù),此時借助于Cookie對象進(jìn)行數(shù)據(jù)共享
3).Cookie存放當(dāng)前用戶的私人數(shù)據(jù),在共享數(shù)據(jù)過程中提高服務(wù)質(zhì)量
4).在現(xiàn)實(shí)生活場景中,Cookie相當(dāng)于用戶在服務(wù)端得到會員卡
2.原理:
用戶通過瀏覽器第一次向MyWeb網(wǎng)站發(fā)送請求申請OneServlet OneServlet在運(yùn)行期間創(chuàng)建一個Cookie存儲與當(dāng)前用戶相關(guān)數(shù)據(jù) OneServlet工作完畢后,將Cookie寫入到響應(yīng)頭交還給當(dāng)前瀏覽器
瀏覽器收到響應(yīng)響應(yīng)包之后,將cookie存儲在瀏覽器的緩存
一段時間之后,用戶通過同一個瀏覽器再次向myWeb網(wǎng)站發(fā)送請求申請TwoServlet時。瀏覽器需要無條件的將myWeb網(wǎng)站之前推送過來的Cookie,寫入到請求頭發(fā)送過去此時TwoServlet在運(yùn)行時,就可以通過讀取請求頭中cookie中信息,得到OneServlet提供的共享數(shù)據(jù)
3.實(shí)現(xiàn)命令: 同一個網(wǎng)站 OneServlet 與 TwoServlet 借助于Cookie實(shí)現(xiàn)數(shù)據(jù)共享
OneServlet{
public void doGet(HttpServletRequest request,HttpServletResponse resp){
//1.創(chuàng)建一個cookie對象,保存共享數(shù)據(jù)(當(dāng)前用戶數(shù)據(jù))
Cookie card = new Cookie("key1","abc");
Cookie card1= new Cookie("key2","efg");
//cookie相當(dāng)于一個map
//一個cookie中只能存放一個鍵值對
//這個鍵值對的key與value只能是String
//鍵值對中key不能是中文
//2.【發(fā)卡】將cookie寫入到響應(yīng)頭,交給瀏覽器
resp.addCookie(card);
resp.addCookie(card1);}
}
TwoServlet{
public void doGet(HttpServletRequest request,HttpServletResponse resp){
//1.調(diào)用請求對象從請求頭得到瀏覽器返回的Cookie
Cookie cookieArray[] = request.getCookies();
//2.循環(huán)遍歷數(shù)據(jù)得到每一個cookie的key 與 value
for(Cookie card:cookieArray){
String key = card.getName(); //讀取key "key1"
Strign value = card.getValue();//讀取value "abc"
// 提供較好的服務(wù)。。 }
}
}
4.Cookie銷毀時機(jī):
1.在默認(rèn)情況下,Cookie對象存放在瀏覽器的緩存中。因此只要瀏覽器關(guān)閉,Cookie對象就被銷毀掉
2.在手動設(shè)置情況下,可以要求瀏覽器將接收的Cookie。存放在客戶端計算機(jī)上硬盤上,同時需要指定Cookie在硬盤上存活時間。在存活時間范圍內(nèi),關(guān)閉瀏覽器關(guān)閉客戶端計算機(jī),關(guān)閉服務(wù)器,都不會導(dǎo)致Cookie 被銷毀。在存活時間到達(dá)時,Cookie自動從硬盤上被刪除
cookie.setMaxAge(60); //cookie在硬盤上存活1分鐘
HttpSession接口:
1.介紹:
1)HttpSession接口來自于Servlet規(guī)范下一個接口。存在于Tomcat中servlet-api.jar,其實(shí)現(xiàn)類由Http服務(wù)器提供。Tomcat提供實(shí)現(xiàn)類存在于servlet-api.jar
2)如果兩個Servlet來自于同一個網(wǎng)站,并且為同一個瀏覽器/用戶提供服務(wù),此時 借助于HttpSession對象進(jìn)行數(shù)據(jù)共享
3)開發(fā)人員習(xí)慣于將HttpSession接口修飾對象稱為【會話作用域?qū)ο蟆?/p>
2.HttpSession 與 Cookie 區(qū)別:【面試題】
1)存儲位置: 一個在天上,一個在地下
Cookie:存放在客戶端計算機(jī)(瀏覽器內(nèi)存/硬盤)
HttpSession:存放在服務(wù)端計算機(jī)內(nèi)存
2)數(shù)據(jù)類型:
Cookie對象存儲共享數(shù)據(jù)類型只能是String
HttpSession對象可以存儲任意類型的共享數(shù)據(jù)Object
數(shù)據(jù)數(shù)量:
一個Cookie對象只能存儲一個共享數(shù)據(jù)
HttpSession使用map集合存儲共享數(shù)據(jù),所以可以存儲任意數(shù)量共享數(shù)據(jù)
4)參照物:
Cookie相當(dāng)于客戶在服務(wù)端【會員卡】
HttpSession相當(dāng)于客戶在服務(wù)端【私人保險柜】
3.命令實(shí)現(xiàn): 同一個網(wǎng)站(myWeb)下OneServlet將數(shù)據(jù)傳遞給TwoServlet
OneServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response){
//1.調(diào)用請求對象向Tomcat索要當(dāng)前用戶在服務(wù)端的私人儲物柜
HttpSession session = request.getSession();
//2.將數(shù)據(jù)添加到用戶私人儲物柜
session.setAttribute("key1",共享數(shù)據(jù)) }
}
//瀏覽器訪問/myWeb中TwoServlet
TwoServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response){
//1.調(diào)用請求對象向Tomcat索要當(dāng)前用戶在服務(wù)端的私人儲物柜
HttpSession session = request.getSession();
//2.從會話作用域?qū)ο蟮玫絆neServlet提供的共享數(shù)據(jù)
Object 共享數(shù)據(jù) = session.getAttribute("key1");}
}
4.Http服務(wù)器如何將用戶與HttpSession關(guān)聯(lián)起來
Tomcat在創(chuàng)建一個HttpSession對象時自動為這個HttpSession對象生成一個編號
Tomcat將編號保存到cookie對象,推送到當(dāng)前瀏覽器緩存
cookie.JESSIONID
等到用戶第二次來訪時,Tomcat根據(jù)請求頭JESSIONID確認(rèn)用戶是否有HttpSession以及哪一個HttpSession是當(dāng)前用戶的
5.getSession() 與 getSession(false)
1)getSession(): 如果當(dāng)前用戶在服務(wù)端已經(jīng)擁有了自己的私人儲物柜.要求tomcat將這個私人儲物柜進(jìn)行返回如果當(dāng)前用戶在服務(wù)端尚未擁有自己的私人儲物柜要求tocmat為當(dāng)前用戶創(chuàng)建一個全新的私人儲物柜
2)getSession(false):如果當(dāng)前用戶在服務(wù)端已經(jīng)擁有了自己的私人儲物柜. 要求tomcat將這個私人儲物柜進(jìn)行返回如果當(dāng)前用戶在服務(wù)端尚未擁有自己的私人儲物柜此時Tomcat將返回null
6.HttpSession銷毀時機(jī):
1.用戶與HttpSession關(guān)聯(lián)時使用的Cookie只能存放在瀏覽器緩存中.
2.在瀏覽器關(guān)閉時,意味著用戶與他的HttpSession關(guān)系被切斷
3.由于Tomcat無法檢測瀏覽器何時關(guān)閉,因此在瀏覽器關(guān)閉時并不會導(dǎo)致Tomcat將瀏覽器關(guān)聯(lián)的HttpSession進(jìn)行銷毀
4.為了解決這個問題,Tomcat為每一個HttpSession對象設(shè)置【空閑時間】這個空閑時間默認(rèn)30分鐘,如果當(dāng)前HttpSession對象空閑時間達(dá)到30分鐘此時Tomcat認(rèn)為用戶已經(jīng)放棄了自己的HttpSession,此時Tomcat就會銷毀掉這個HttpSession
7.HttpSession空閑時間手動設(shè)置
在當(dāng)前網(wǎng)站/web/WEB-INF/web.xml
5
HttpServletRequest接口實(shí)現(xiàn)數(shù)據(jù)共享
1.介紹:
1) 在同一個網(wǎng)站中,如果兩個Servlet之間通過【請求轉(zhuǎn)發(fā)】方式進(jìn)行調(diào)用, 彼此之間共享同一個請求協(xié)議包。而一個請求協(xié)議包只對應(yīng)一個請求對象 因此servlet之間共享同一個請求對象,此時可以利用這個請求對象在兩個Servlet之間實(shí)現(xiàn)數(shù)據(jù)共享
2) 在請求對象實(shí)現(xiàn)Servlet之間數(shù)據(jù)共享功能時,開發(fā)人員將請求對象稱為【請求作用域?qū)ο蟆?/p>
2.命令實(shí)現(xiàn): OneServlet通過請求轉(zhuǎn)發(fā)申請調(diào)用TwoServlet時,需要給TwoServlet提供共享數(shù)據(jù)
OneServlet{
public void doGet(HttpServletRequest req,HttpServletResponse response){
//1.將數(shù)據(jù)添加到【請求作用域?qū)ο蟆恐衋ttribute屬性
req.setAttribute("key1",數(shù)據(jù)); //數(shù)據(jù)類型可以任意類型Object
//2.向Tomcat申請調(diào)用TwoServlet
req.getRequestDispatcher("/two").forward(req,response)}
}
TwoServlet{
public void doGet(HttpServletRequest req,HttpServletResponse response){
//從當(dāng)前請求對象得到OneServlet寫入到共享數(shù)據(jù)
Object 數(shù)據(jù) = req.getAttribute("key1"); }
}
總結(jié)
以上是生活随笔為你收集整理的java httpserver 多个接口_多个Servlet之间数据共享实现方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: d3 mysql_javascript
- 下一篇: php 文章读取_php实现获取文章内容