您好,登錄后才能下訂單哦!
這篇文章主要介紹了Servlet怎么實(shí)現(xiàn)共享數(shù)據(jù)JavaWeb組件的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Servlet怎么實(shí)現(xiàn)共享數(shù)據(jù)JavaWeb組件文章都會有所收獲,下面我們一起來看看吧。
Servlet JavaWeb三大組件包括,Servlet組件(接受請求,響應(yīng)數(shù)據(jù)),F(xiàn)ilter組件(過濾,攔截請求),Listener組件(監(jiān)聽器),這三大組件構(gòu)成了javaWeb核心內(nèi)容,也是作為后端來說,JavaWeb最重要的內(nèi)容。
Servlet是sun公司提供的一門用于開發(fā)動態(tài)web資源的技術(shù)。
Sun公司在其API中提供了一個servlet接口,用戶若想用發(fā)一個動態(tài)web資源(即開發(fā)一個Java程序向?yàn)g覽器輸出數(shù)據(jù)),需要完成以下2個步驟:
1、編寫一個Java類,實(shí)現(xiàn)servlet接口。
2、把開發(fā)好的Java類部署到web服務(wù)器中。
按照一種約定俗成的稱呼習(xí)慣,通常我們也把實(shí)現(xiàn)了servlet接口的java程序,稱之為Servlet
Servlet程序是由WEB服務(wù)器調(diào)用,web服務(wù)器收到客戶端的Servlet訪問請求后:
①Web服務(wù)器首先檢查是否已經(jīng)裝載并創(chuàng)建了該Servlet的實(shí)例對象。如果是,則直接執(zhí)行第④步,否則,執(zhí)行第②步。
?、谘b載并創(chuàng)建該Servlet的一個實(shí)例對象。
?、壅{(diào)用Servlet實(shí)例對象的init()方法。
④創(chuàng)建一個用于封裝HTTP請求消息的HttpServletRequest對象和一個代表HTTP響應(yīng)消息的HttpServletResponse對象,然后調(diào)用Servlet的service()方法并將請求和響應(yīng)對象作為參數(shù)傳遞進(jìn)去。
?、軼EB應(yīng)用程序被停止或重新啟動之前,Servlet引擎將卸載Servlet,并在卸載之前調(diào)用Servlet的destroy()方法。
什么是Servlet組件:處理請求和發(fā)送響應(yīng)的過程是由一種叫做Servlet的程序來完成的,并且Servlet是為了解決實(shí)現(xiàn)動態(tài)頁面而衍生的東西。
整個過程為:
客戶端發(fā)送請求至服務(wù)器端;服務(wù)器將請求信息發(fā)送至 Servlet;Servlet 生成響應(yīng)內(nèi)容并將其傳給服務(wù)器。響應(yīng)內(nèi)容動態(tài)生成,通常取決于客戶端的請求;服務(wù)器將響應(yīng)返回給客戶端。
Servlet規(guī)范中提供四種數(shù)據(jù)共享方案:
ServletContext接口
HttpServletRequest接口
HttpSession接口
Cookie類
Request和Responserequest
和response
對象的原理:
==都由服務(wù)器創(chuàng)建,我們來使用它們;
==request對象是來獲取請求消息,response對象是來設(shè)置響應(yīng)消息;
==request對象繼承體系結(jié)構(gòu):ServletRequest
接口
<<繼承>>HttpServletRequest
接口
<<實(shí)現(xiàn)>>
(tomcat類)org.apache.catalina.connector.RequestFacade
第一種 request.getRequestDispatcher().forward(request,response)
:
1、屬于轉(zhuǎn)發(fā),也是服務(wù)器跳轉(zhuǎn),相當(dāng)于方法調(diào)用,在執(zhí)行當(dāng)前文件的過程中轉(zhuǎn)向執(zhí)行目標(biāo)文件,兩個文件(當(dāng)前文件和目標(biāo)文件)屬于同一次請求,前后頁共用一個request,可以通過此來傳遞一些數(shù)據(jù)或者session信息,request.setAttribute()
和request.getAttribute()
。
2、在前后兩次執(zhí)行后,地址欄不變,仍是當(dāng)前文件的地址。
3、不能轉(zhuǎn)向到本web應(yīng)用之外的頁面和網(wǎng)站,所以轉(zhuǎn)向的速度要快。
4、URL中所包含的“/”表示應(yīng)用程序(項目)的路徑。
第二種 response.sendRedirect()
:
1、屬于重定向,也是客戶端跳轉(zhuǎn),相當(dāng)于客戶端向服務(wù)端發(fā)送請求之后,服務(wù)器返回一個響應(yīng),客戶端接收到響應(yīng)之后又向服務(wù)端發(fā)送一次請求,一共是2次請求,前后頁不共用一個request,不能讀取轉(zhuǎn)向前通過request.setAttribute()
設(shè)置的屬性值。
2、在前后兩次執(zhí)行后,地址欄發(fā)生改變,是目標(biāo)文件的地址。
3、可以轉(zhuǎn)向到本web應(yīng)用之外的頁面和網(wǎng)站,所以轉(zhuǎn)向的速度相對要慢。
4、URL種所包含的"/"表示根目錄的路徑。
特殊的應(yīng)用:對數(shù)據(jù)進(jìn)行修改、刪除、添加操作的時候,應(yīng)該用response.sendRedirect()
。如果是采用了request.getRequestDispatcher().forward(request,response)
,那么操作前后的地址欄都不會發(fā)生改變,仍然是修改的控制器,如果此時再對當(dāng)前頁面刷新的話,就會重新發(fā)送一次請求對數(shù)據(jù)進(jìn)行修改,這也就是有的人在刷新一次頁面就增加一條數(shù)據(jù)的原因。
如何采用第二種方式傳遞數(shù)據(jù):
1、可以選擇session,但要在第二個文件中刪除;
2、可以在請求的url中帶上參數(shù),如"add.htm?id=122"
典型的應(yīng)用場景:
forward: 訪問 Servlet 處理業(yè)務(wù)邏輯,然后 forward 到 jsp 顯示處理結(jié)果,瀏覽器里 URL 不變
redirect: 提交表單,處理成功后 redirect 到另一個 jsp,防止表單重復(fù)提交,瀏覽器里 URL 變了
6. 開發(fā)人員習(xí)慣將ServletContext
對象稱為【全局作用域?qū)ο蟆?br/>7. 工作原理:每個網(wǎng)站都存在一個全局作用域?qū)ο蟆鞠喈?dāng)于】一個Map;
將數(shù)據(jù)存入全局作業(yè)域?qū)ο?,?dāng)前其他servlet此時都可以從全局作用域?qū)ο蟮玫竭@個數(shù)據(jù)并進(jìn)行使用;
8. 生命周期:Http服務(wù)器啟動過程中,自動在內(nèi)存中創(chuàng)建一個全局作用域?qū)ο?,在運(yùn)行期間,全局作用域?qū)ο缶鸵粋€,并且一直存活,當(dāng)Http服務(wù)器關(guān)閉時,進(jìn)行銷毀;
全局作用域?qū)ο笊芷谪灤┚W(wǎng)站整個運(yùn)行周期
ServletContext
全局作用域?qū)ο螅械腟ervlet共享這個對象
是一個域?qū)ο?/p>
可以讀取全局配置參數(shù)
可以搜索當(dāng)前工程目錄下面的資源文件
可以獲取當(dāng)前工程名字(了解)
凡是域?qū)ο蠖加腥缦?個方法:
setAttribute(name,value);
name是String類型,value是Object類型;往域?qū)ο罄锩嫣砑訑?shù)據(jù),添加時以key-value形式添加
getAttribute(name);
根據(jù)指定的key讀取域?qū)ο罄锩娴臄?shù)據(jù)
removeAttribute(name);
根據(jù)指定的key從域?qū)ο罄锩鎰h除數(shù)據(jù)
HttpServletRequest
對象代表客戶端的請求,當(dāng)客戶端通過HTTP協(xié)議訪問服務(wù)器時,HTTP請求頭中的所有信息都封裝在這個對象中,通過這個對象提供的方法,可以獲得客戶端請求的所有信息。
HttpSession 服務(wù)端的技術(shù)
服務(wù)器會為每一個用戶 創(chuàng)建一個獨(dú)立的HttpSession
HttpSession原理
當(dāng)用戶第一次訪問Servlet時,服務(wù)器端會給用戶創(chuàng)建一個獨(dú)立的Session
并且生成一個SessionID
,這個SessionID在響應(yīng)瀏覽器的時候會被裝進(jìn)cookie中,從而被保存到瀏覽器中,當(dāng)用戶再一次訪問Servlet時,請求中會攜帶著cookie中的SessionID去訪問,服務(wù)器會根據(jù)這個SessionID去查看是否有對應(yīng)的Session
對象
有就拿出來使用;沒有就創(chuàng)建一個Session(相當(dāng)于用戶第一次訪問);
域的范圍:
Context域 > Session域 > Request域
Session域 只要會話不結(jié)束就會存在 但是Session有默認(rèn)的存活時間(30分鐘)
Cookie
客戶端會話技術(shù),將數(shù)據(jù)保存到客戶端
使用快速入門:
創(chuàng)建Cookie對象,綁定數(shù)據(jù)
new Cooike(String name,String value)
3.發(fā)送Cookie對象
response.addCookie(Cookie cookie)
4.獲取Cookie,拿到數(shù)據(jù)
Cookie[] request.getCookie()
Cookie銷毀時機(jī)
1.默認(rèn)情況隨瀏覽器關(guān)閉被銷毀
2.手動設(shè)置情況下,設(shè)置Cookie存活時間,關(guān)閉瀏覽器不會導(dǎo)致Cookie被刪除;
cookie.setMaxAge(60);//設(shè)置cookie在硬盤存活1分鐘
Session
服務(wù)器端會話技術(shù)
對于Servlet而言:
若Servlet是客戶端訪問的第一個WEB應(yīng)用的資源,則只有調(diào)用了request.getSession()或request.getSession(true) 才會創(chuàng)建HttpSession對象
1). 在Servlet中如何獲取HttpSession對象?
request.getSession(boolean create)
:create為false,若沒有和當(dāng)前JSP頁面關(guān)聯(lián)的HttpSession對象,則返回null;
若有返回true create為true一定返回一個HTTPSession對象。若沒有和昂前JSP頁面關(guān)聯(lián)的HttpSession對象,則服務(wù)器創(chuàng)建一個新的HttpSession對象返回,若有,則直接返回關(guān)聯(lián)。
request.getSession()
等同于request.getSession(true)
2. 什么時候銷毀HttpSession對象:
1).直接調(diào)用HttpSession的invalidate()方法:使HttpSession失效
2).服務(wù)器卸載了當(dāng)前Web應(yīng)用。
3).超出HttpSession的過期時間。
設(shè)置HttpSession的過期時間:單位為S
session.setMaxInactiveInterval(5); out.print(session.getMaxInactiveInterval()); <!--在web.xml文件中設(shè)置HttpSession過期時間。 --> <session-config> <session-timeout>30</session-timeout> </session-config> <!--系統(tǒng)默認(rèn)30分鐘 -->
這個時間就是Session的超時時間。如果超過了超時時間沒訪問過服務(wù)器,Session就自動失效了。
Session具有以下特點(diǎn):
(1)Session中的數(shù)據(jù)保存在服務(wù)器端;
(2)Session中可以保存任意類型的數(shù)據(jù);
(3)Session默認(rèn)的生命周期是30分鐘,可以手動設(shè)置更長或更短的時間。
關(guān)于“Servlet怎么實(shí)現(xiàn)共享數(shù)據(jù)JavaWeb組件”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Servlet怎么實(shí)現(xiàn)共享數(shù)據(jù)JavaWeb組件”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。