




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Web 服務(wù)器的工作原理2015/02/12 | 分類: 技術(shù)架構(gòu) | 5 條評論 | 標(biāo)簽: SERVLET分享到:47Web 服務(wù)器工作原理概述很多時(shí)候我們都想知道,web 容器或 web 服務(wù)器(比如 Tomcat 或者 jboss)是怎樣工作的?它們是怎樣處理來自全世界的 http 請求的?它們在幕后做了什么動(dòng)作?JavaServlet API(例如 ServletContext,ServletRequest,ServletResponse 和 Session 這些類)在其中扮演了什么角色?這些都是 web 應(yīng)用開發(fā)者或者想成為 web 應(yīng)用開發(fā)者的人必須要知道的重要問題或概念。在這篇
2、文章里,我將會(huì)盡量給出以上某些問題的答案。請集中精神!文章章節(jié):什么是 web 服務(wù)器、應(yīng)用服務(wù)器和 web 容器?什么是 Servlet?他們有什么作用?什么是 ServletContext?它由誰創(chuàng)建?ServletRequest 和 ServletResponse 從哪里進(jìn)入生命周期?如何管理 Session?知道 cookie 嗎?如何確保線程安全?什么是 web 服務(wù)器,應(yīng)用服務(wù)器和 web 容器?我先討論 web 服務(wù)器和應(yīng)用服務(wù)器。讓我在用一句話大概講講:“在過去它們是有區(qū)別的,但是這兩個(gè)不同的分類慢慢地合并了,而如今在大多在情況下和使用中可以把它們看成一個(gè)整體?!北疚挠?Imp
3、ortNew - 進(jìn)林 翻譯自 howtodoinjava。歡迎加入翻譯小組。轉(zhuǎn)載請見文末要求。在 Mosaic 瀏覽器(通常被認(rèn)為是第一個(gè)圖形化的 web 瀏覽器)和超鏈接內(nèi)容的初期,演變出了“web 服務(wù)器”的新概念,它通過 HTTP 協(xié)議來提供靜態(tài)頁面內(nèi)容和圖片服務(wù)。在那個(gè)時(shí)候,大多數(shù)內(nèi)容都是靜態(tài)的,并且 HTTP 1.0 只是一種傳送文件的方式。但在不久后 web 服務(wù)器提供了 CGI 功能。這意味著我們可以為每個(gè) web 請求啟動(dòng)一個(gè)進(jìn)程來產(chǎn)生動(dòng)態(tài)內(nèi)容?,F(xiàn)在,HTTP 協(xié)議已經(jīng)很成熟了并且 web 服務(wù)器變得更加復(fù)雜,擁有了像緩存、安全和 session 管理這些附加功能。隨著技術(shù)的
4、進(jìn)一步成熟,我們從 Kiva 和NetDynamics 學(xué)會(huì)了公司專屬的基于 Java 的服務(wù)器端技術(shù)。這些技術(shù)最終全都融入到我們今天依然在大多數(shù)應(yīng)用開發(fā)里使用的 JSP 中。以上是關(guān)于 web 服務(wù)器的?,F(xiàn)在我們來討論應(yīng)用服務(wù)器。在同一時(shí)期,應(yīng)用服務(wù)器已經(jīng)存在并發(fā)展很長一段時(shí)間了。一些公司為 Unix 開發(fā)了Tuxedo(面向事務(wù)的中間件)、TopEnd、Encina 等產(chǎn)品,這些產(chǎn)品都是從類似 IMS 和CICS 的主機(jī)應(yīng)用管理和監(jiān)控環(huán)境衍生而來的。大部分的這些產(chǎn)品都指定了“封閉的”產(chǎn)品專用通信協(xié)議來互連胖客戶機(jī)(“fat” client)和服務(wù)器。在 90 年代,這些傳統(tǒng)的應(yīng)用服務(wù)器產(chǎn)品
5、開始嵌入 HTTP 通信功能,剛開始要利用網(wǎng)關(guān)來實(shí)現(xiàn)。不久后它們之間的界線開始變得模糊了。同時(shí),web 服務(wù)器越來越成熟,可以處理更高的負(fù)載、更多的并發(fā)和擁有更好的特性;應(yīng)用服務(wù)器開始添加越來越多的基于 HTTP 的通信功能。所有的這些導(dǎo)致了 web 服務(wù)器與應(yīng)用服務(wù)器的界線變得更窄了。目前,“應(yīng)用服務(wù)器”和“web 服務(wù)器”之間的界線已經(jīng)變得模糊不清了。但是人們還把這兩個(gè)術(shù)語區(qū)分開來,作為強(qiáng)調(diào)使用。當(dāng)有人說到“web 服務(wù)器”時(shí),你通常要把它認(rèn)為是以 HTTP 為核心、web UI 為向?qū)У膽?yīng)用。當(dāng)有人說到“應(yīng)用服務(wù)器”時(shí),你可能想到“高負(fù)載、企業(yè)級特性、事務(wù)和隊(duì)列、多通道通信(HTTP 和
6、更多的協(xié)議)”。但現(xiàn)在提供這些需求的基本上都是同一個(gè)產(chǎn)品。以上就是關(guān)于 web 服務(wù)器和應(yīng)用服務(wù)器的全部內(nèi)容?,F(xiàn)在我們來看看第三個(gè)術(shù)語,即web 容器。在 Java 方面,web 容器一般是指 Servlet 容器。Servlet 容器是與 Java Servlet 交互的web 容器的組件。web 容器負(fù)責(zé)管理 Servlet 的生命周期、把 URL 映射到特定的Servlet、確保 URL 請求擁有正確的訪問權(quán)限和更多類似的服務(wù)。綜合來看,Servlet 容器就是用來運(yùn)行你的 Servlet 和維護(hù)它的生命周期的運(yùn)行環(huán)境。什么是 Servlet?他們有什么作用?在 Java 里,Servl
7、et 使你能夠編寫根據(jù)請求動(dòng)態(tài)生成內(nèi)容的服務(wù)端組件。事實(shí)上,Servlet是一個(gè)在 javax.servlet 包里定義的接口。它為 Servlet 的生命周期聲明了三個(gè)基本方法init()、service()和 destroy()。每個(gè) Servlet 都要實(shí)現(xiàn)這些方法(在 SDK 里定義或者用戶定義)并在它們的生命周期的特定時(shí)間由服務(wù)器來調(diào)用這些方法。類加載器通過懶加載(lazy-loading)或者預(yù)加載(eager loading)自動(dòng)地把 Servlet類加載到容器里。每個(gè)請求都擁有自己的線程,而一個(gè) Servlet 對象可以同時(shí)為多個(gè)線程服務(wù)。當(dāng) Servlet 對象不再被使用時(shí),
8、它就會(huì)被 JVM 當(dāng)做垃圾回收掉。懶加載的 Servlet預(yù)加載的 Servlet什么是 ServletContext?它由誰創(chuàng)建?當(dāng) Servlet 容器啟動(dòng)時(shí),它會(huì)部署并加載所有的 web 應(yīng)用。當(dāng) web 應(yīng)用被加載時(shí),Servlet 容器會(huì)一次性為每個(gè)應(yīng)用創(chuàng)建 Servlet 上下文(ServletContext)并把它保存在內(nèi)存里。Servlet 容器會(huì)處理 web 應(yīng)用的 web.xml 文件,并且一次性創(chuàng)建在 web.xml 里定義的 Servlet、Filter 和 Listener,同樣也會(huì)把它們保存在內(nèi)存里。當(dāng) Servlet 容器關(guān)閉時(shí),它會(huì)卸載所有的 web 應(yīng)用和 S
9、ervletContext,所有的 Servlet、Filter 和 Listner 實(shí)例都會(huì)被銷毀。從 Java 文檔可知,ServletContext 定義了一組方法,Servlet 使用這些方法來與它的Servlet 容器進(jìn)行通信。例如,用來獲取文件的 MIME 類型、轉(zhuǎn)發(fā)請求或者編寫日志文件。在 web 應(yīng)用的部署文件(deployment descriptor)標(biāo)明“分布式”的情況下,web 應(yīng)用的每一個(gè)虛擬機(jī)都擁有一個(gè)上下文實(shí)例。在這種情況下,不能把 Servlet 上下文當(dāng)做共享全局信息的變量(因?yàn)樗男畔⒁呀?jīng)不具有全局性了)。可以使用外部資源來代替,比如數(shù)據(jù)庫。ServletR
10、equest 和 ServletResponse 從哪里進(jìn)入生命周期?Servlet 容器包含在 web 服務(wù)器中,web 服務(wù)器來自特定端口的 HTTP 請求,這個(gè)端口通常是 80。當(dāng)客戶端(使用 web 瀏覽器的用戶)發(fā)送一個(gè) HTTP 請求時(shí),Servlet 容器會(huì)創(chuàng)建新的 HttpServletRequest 和 HttpServletResponse 對象,并且把它們傳遞給已經(jīng)創(chuàng)建的 Filter 和 URL 模式與請求 URL 匹配的 Servlet 實(shí)例的方法,所有的這些都使用同一個(gè)線程。request 對象提供了獲取 HTTP 請求的所有信息的入口,比如請求頭和請求實(shí)體。res
11、ponse 對象提供了控制和發(fā)送 HTTP 響應(yīng)的便利方法,比如設(shè)置響應(yīng)頭和響應(yīng)實(shí)體(通常是 JSP 生成的 HTML 內(nèi)容)。當(dāng) HTTP 響應(yīng)被提交并結(jié)束后,request 和response 對象都會(huì)被銷毀。如何管理 Session?知道 cookie 嗎?當(dāng)客戶端第一次訪問 web 應(yīng)用或者第一次使用 request.getSession()獲取 HttpSession時(shí),Servlet 容器會(huì)創(chuàng)建 Session,生成一個(gè) long 類型的唯一 ID(你可以使用session.getId()獲取它)并把它保存在服務(wù)器的內(nèi)存里。Servlet 容器同樣會(huì)在 HTTP 響應(yīng)里設(shè)置一個(gè) C
12、ookie,cookie 的名是 JSESSIONID 并且 cookie 的值是 session 的唯一ID。根據(jù) HTTP cookie 規(guī)范(正規(guī)的 web 瀏覽器和 web 服務(wù)器必須遵守的約定),在cookie 的有效期間,客戶端(web 瀏覽器)之后的請求都要把這個(gè) cookie 返回給服務(wù)器。Servlet 容器會(huì)利用帶有名為 JSESSIONID 的 cookie 檢測每一個(gè)到來的 HTTP 請求頭,并使用 cookie 的值從服務(wù)器內(nèi)容里獲取相關(guān)的 HttpSession。HttpSession 會(huì)一直存活著,除非超過一段時(shí)間沒使用。你可以在 web.xml 里設(shè)定這個(gè)時(shí)間段
13、,默認(rèn)時(shí)間段是 30 分鐘。因此,如果客戶端已經(jīng)超過 30 分鐘沒有訪問 web 應(yīng)用的話,Servlet 容器就會(huì)銷毀 Session。之后的每一個(gè)請求,即使帶有特定的 cookie,都再也不會(huì)訪問到同一個(gè) Session 了。servletcontainer 會(huì)創(chuàng)建一個(gè)新的 Session?,F(xiàn)有的 Session新的 Session另外,在客戶端的 session cookie 擁有一個(gè)默認(rèn)的存活時(shí)間,這個(gè)時(shí)間與瀏覽器的運(yùn)行時(shí)間相同。因此,當(dāng)用戶關(guān)閉瀏覽器后(所有的標(biāo)簽或者窗口),客戶端的 Session 就會(huì)被銷毀。重新打開瀏覽器后,與之前的 Session 關(guān)聯(lián)的 cookie 就再也
14、不會(huì)被發(fā)送出去了。再次使用 request.getSession()會(huì)返回一個(gè)全新的 HttpSession 并且使用一個(gè)全新的session ID 來設(shè)置 cookie。如何確保線程安全?你現(xiàn)在應(yīng)該已經(jīng)知道所有的請求都在共享 Servlet 和 Filter。這是 Java 的一個(gè)很棒的特性,它是多線程的并且不同的線程(即 HTTP 請求)可以使用同一個(gè)實(shí)例。否則,對每一個(gè)請求都重新創(chuàng)建一個(gè)實(shí)體會(huì)耗費(fèi)很多的資源。你同樣要知道,你不應(yīng)該使用 Servlet 或者 Filter 的實(shí)例變量來存放任何的請求或者會(huì)話范圍內(nèi)的數(shù)據(jù)。這些數(shù)據(jù)會(huì)被其他 Session 的所有請求共享。這是非線程安全的!下面的例子說明了這個(gè)問題:public class MyServlet extends HttpServlet 1 2 3 4 5 6 7 8 9 10 11 12 private Object thisIsNOTThreadSafe; /Dont to this protected void doGet(HttpServletRequest re
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 影響化學(xué)反應(yīng)速率的因素教案 (一)
- 企業(yè)培訓(xùn)課件pop海報(bào)
- Photoshop平面設(shè)計(jì)基礎(chǔ) 課件 任務(wù)6.2 珠寶雜志封面
- 英語 九年級全冊
- 餐飲店品牌形象保護(hù)與侵權(quán)糾紛處理合同范本
- 海鮮餐廳經(jīng)營權(quán)轉(zhuǎn)讓協(xié)議
- 環(huán)保產(chǎn)業(yè)現(xiàn)場安全評估咨詢服務(wù)協(xié)議
- 成都離婚協(xié)議書起草與共同財(cái)產(chǎn)分割及債務(wù)分擔(dān)策略
- 企事業(yè)單位內(nèi)部停車場租賃與員工福利合同
- 勞務(wù)派遣考勤考核方案
- 鍛壓設(shè)備安裝工程施工及驗(yàn)收規(guī)范
- 磨煤機(jī)檢修培訓(xùn)課件
- 瑞安市工業(yè)固廢與污泥無害化處置及資源化利用項(xiàng)目階段性竣工環(huán)境保護(hù)驗(yàn)收報(bào)告
- 檢驗(yàn)科對急診凝血標(biāo)本質(zhì)量不合格原因分析品管圈魚骨圖柏拉圖
- 中草藥的種植技術(shù)
- 關(guān)于中學(xué)生課余生活的調(diào)研報(bào)告
- 全國普通高等學(xué)校畢業(yè)生就業(yè)協(xié)議書
- 皖2015s209 混凝土砌塊式排水檢查井
- 2023火力發(fā)電廠熱工開關(guān)量和模擬量控制系統(tǒng)設(shè)計(jì)規(guī)程
- 史記《孔子世家》原文
- 妊娠高血壓綜合征眼底病變
評論
0/150
提交評論