Servlet原理 一:Servlet容器

注:在網(wǎng)上看到一篇文章--《Servlet工作原理》,整理并做了一些筆記

1. 了解 Servlet 容器

首先鸥昏,要從servlet 容器開始电抚。servlet容器,故名思議,就是裝載和管理Servlet的服務端程序盆耽。借用一個前輩的解釋:Servlet與Servlet容器的關系有點像槍和子彈的關系,槍是為子彈而生枚粘,而子彈又讓槍有了殺傷力涩拙。
下圖是Tomcat容器模型:


tomcat.png

可以看出 Tomcat 的容器分為四個等級,真正管理 Servlet 的容器是 Context 容器丧慈,一個 Context 對應一個 Web 工程析命, Context 容器如何運行將直接影響 Servlet 的工作方式。

2. Servlet 容器啟動過程

Servlet啟動過程.png

Tomcat7 支持嵌入式功能逃默,增加了一個啟動類 org.apache.catalina.startup.Tomcat鹃愤。創(chuàng)建一個實例對象并調用 start 方法就可以很容易啟動 Tomcat,還可以通過這個對象來增加和修改 Tomcat 的配置參數(shù)完域。下面我們就利用這個 Tomcat 類來管理新增的一個 Context 容器软吐,我們就選擇 Tomcat7 自帶的 examples Web 工程,并看看它是如何加到這個 Context 容器中的吟税。

# 創(chuàng)建一個 Tomcat 實例
Tomcat tomcat = getTomcatInstance(); 
File appDir = new File(getBuildDirectory(), "webapps/examples"); 
# 新增一個 Web 應用
tomcat.addWebapp(null, "/examples", appDir.getAbsolutePath()); 
# 啟動 Tomcat
tomcat.start(); 
# 調用其中的一個 HelloWorldExample Servlet凹耙,看有沒有正確返回預期的數(shù)據(jù)。
ByteChunk res = getUrl("http://localhost:" + getPort() + 
               "/examples/servlets/servlet/HelloWorldExample");  assertTrue(res.toString().indexOf("<h1>Hello World!</h1>") > 0); 

一個 Web 應用對應一個 Context 容器肠仪,也就是 Servlet 運行時的 Servlet 容器肖抱,添加一個 Web 應用時將會創(chuàng)建一個 StandardContext 容器(StandardContext是Context的標準實現(xiàn)),并且給這個 Context 容器設置必要的參數(shù)异旧,url 和 path 分別代表這個應用在 Tomcat 中的訪問路徑和這個應用實際的物理路徑意述。其中最重要的一個配置是 ContextConfig,這個類將會負責整個 Web 應用配置的解析工作吮蛹。最后將這個 Context 容器加到父容器 Host 中荤崇。

接下去將會調用 Tomcat 的 start 方法啟動 Tomcat,Tomcat 的啟動邏輯是基于觀察者模式設計的潮针,所有的容器都會繼承 Lifecycle 接口术荤,它管理者容器的整個生命周期,所有容器的的修改和狀態(tài)的改變都會由它去通知已經(jīng)注冊的觀察者(Listener)然低。

當 Context 容器初始化狀態(tài)設為 init 時喜每,添加在 Contex 容器的 Listener 將會被調用。ContextConfig 繼承了 LifecycleListener 接口雳攘,它是在調用 addWebapp 時被加入到 StandardContext 容器中带兜。ContextConfig 類會負責整個 Web 應用的配置文件的解析工作。

ContextConfig 的 init 方法將會主要完成以下工作:
1. 創(chuàng)建用于解析 xml 配置文件的 contextDigester 對象
2. 讀取默認 context.xml 配置文件吨灭,如果存在解析它
3. 讀取默認 Host 配置文件刚照,如果存在解析它
4. 讀取默認 Context 自身的配置文件,如果存在解析它
5. 設置 Context 的 DocBase
ContextConfig 的 init 方法完成后喧兄,Context 容器的會執(zhí)行 startInternal 方法无畔,這個方法啟動邏輯比較復雜啊楚,主要包括如下幾個部分:
1. 創(chuàng)建讀取資源文件的對象
2. 創(chuàng)建 ClassLoader 對象
3. 設置應用的工作目錄
4. 啟動相關的輔助類如:logger、realm浑彰、resources 等
5. 修改啟動狀態(tài)恭理,通知感興趣的觀察者(Web 應用的配置)
6. 子容器的初始化
7. 獲取 ServletContext 并設置必要的參數(shù)
8. 初始化“l(fā)oad on startup”的 Servlet

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市郭变,隨后出現(xiàn)的幾起案子颜价,更是在濱河造成了極大的恐慌,老刑警劉巖诉濒,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件周伦,死亡現(xiàn)場離奇詭異,居然都是意外死亡未荒,警方通過查閱死者的電腦和手機专挪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來片排,“玉大人寨腔,你說我怎么就攤上這事』Γ” “怎么了脆侮?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長勇劣。 經(jīng)常有香客問我靖避,道長,這世上最難降的妖魔是什么比默? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任幻捏,我火速辦了婚禮,結果婚禮上命咐,老公的妹妹穿的比我還像新娘篡九。我一直安慰自己,他們只是感情好醋奠,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布榛臼。 她就那樣靜靜地躺著,像睡著了一般窜司。 火紅的嫁衣襯著肌膚如雪沛善。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天塞祈,我揣著相機與錄音金刁,去河邊找鬼。 笑死,一個胖子當著我的面吹牛尤蛮,可吹牛的內容都是我干的媳友。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼产捞,長吁一口氣:“原來是場噩夢啊……” “哼醇锚!你這毒婦竟也來了?” 一聲冷哼從身側響起轧葛,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤搂抒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后尿扯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡焰雕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年衷笋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矩屁。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡辟宗,死狀恐怖,靈堂內的尸體忽然破棺而出吝秕,到底是詐尸還是另有隱情泊脐,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布烁峭,位于F島的核電站容客,受9級特大地震影響,放射性物質發(fā)生泄漏约郁。R本人自食惡果不足惜缩挑,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鬓梅。 院中可真熱鬧供置,春花似錦、人聲如沸绽快。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坊罢。三九已至续担,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間艘绍,已是汗流浹背赤拒。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挎挖。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓这敬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蕉朵。 傳聞我的和親對象是個殘疾皇子崔涂,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內容