Tomcat工作原理解析

本文主要講解Tomcat啟動和部署webapp時的原理和過程淑蔚,以及其使用的配置文件的詳解。主要有三大部分:

1.Tomcat的簡介和啟動過程

2.Tomcat部署webapp

3.Tomcat處理一個http請求的過程

【簡介】

Tomcat依賴/conf/server.xml這個配置文件啟動server(一個Tomcat實例,核心就是啟動容器Catalina)劳较。

Tomcat部署Webapp時后众,依賴context.xml和web.xml(/conf/目錄下的context.xml和web.xml在部署任何webapp時都會啟動,他們定義一些默認行為祟昭,而具體每個webapp的 ?META-INF/context.xml ?和 ?WEB-INF/web.xml ?則定義了每個webapp特定的行為)兩個配置文件部署web應用缕坎。

第一部分、Tomcat的簡介和啟動過程


一個標準TOMCAT結(jié)構(gòu)目錄如上圖所示:

BIN目錄主要存放各種平臺下啟動和關(guān)閉Tomcat的腳本文件.其中 有個檔是catalina.bat,打開這個windos配置文件,在非注釋行加入JDK路徑,例如 : SET? JAVA_HOME=C:\j2sdk1.4.2_06 保存后,就配置好tomcat環(huán)境了. startup.bat是windows下啟動tomcat的文件,shutdown.bat是關(guān)閉tomcat的文件.

conf:存放不同的配置文件(如:server.xml和web.xml)篡悟;?

server.xml文件:該文件用于配置和server相關(guān)的信息谜叹,比如tomcat啟動的端口號、配置host主機搬葬、配置Context?

web.xml文件:部署描述文件荷腊,這個web.xml中描述了一些默認的servlet,部署每個webapp時急凰,都會調(diào)用這個文件女仰,配置該web應用的默認servlet。

tomcat-users.xml文件:配置tomcat的用戶密碼與權(quán)限。

context.xml:定義web應用的默認行為疾忍。

/lib:存放Tomcat運行需要的庫文件(JARS)乔外;?

/logs:存放Tomcat執(zhí)行時的LOG文件;?

/temp:?臨時目錄

/webapps:Tomcat的主要Web發(fā)布目錄(包括應用程序示例)锭碳;?

/work:存放jsp編譯成Servlet后產(chǎn)生的class文件袁稽;

二、Tomcat啟動過程?

1擒抛、開啟Tomcat:可以在IDE中啟動Tomcat的服務器推汽,也可以手動在/bin/目錄下找到startup.bat并雙擊,然后程序就會依次執(zhí)行以下步驟:

(1)引導(Bootstrap)啟動:調(diào)用了org.apache.catalina.startup.Bootstrap.class中的main方法歧沪,開始啟動Tomcat容器歹撒;main方法如下:

publicstaticvoid main(String args[]) {

? ? ? ? if(daemon ==null) {

? ? ? ? ? ? daemon =newBootstrap();//創(chuàng)建了一個引導對象try{//引導對象初始化,即創(chuàng)建了Catalina容器? ? ? ? ? ? ? ? daemon.init();

? ? ? ? ? ? } catch (Throwable t) {

? ? ? ? ? ? ? ? t.printStackTrace();

? ? ? ? ? ? ? ? return;

? ? ? ? ? ? }

? ? ? ? }


? ? ? ? // 根據(jù)不同的命令參數(shù)執(zhí)行try {

? ? ? ? ? ? String command = "start";

? ? ? ? ? ? if(args.length > 0) {

? ? ? ? ? ? ? ? command = args[args.length - 1];

? ? ? ? ? ? }

? ? ? ? ? ? if(command.equals("startd")) {

? ? ? ? ? ? ? ? args[args.length - 1] = "start";

? ? ? ? ? ? ? ? daemon.load(args);

? ? ? ? ? ? ? ? daemon.start();

? ? ? ? ? ? } elseif(command.equals("stopd")) {

? ? ? ? ? ? ? ? args[args.length - 1] = "stop";

? ? ? ? ? ? ? ? daemon.stop();

? ? ? ? ? ? } elseif(command.equals("start")) {

? ? ? ? ? ? ? ? daemon.setAwait(true);

? ? ? ? ? ? ? ? daemon.load(args);

? ? ? ? ? ? ? ? daemon.start();

? ? ? ? ? ? } elseif(command.equals("stop")) {

? ? ? ? ? ? ? ? daemon.stopServer(args);

? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? log.warn("Bootstrap: command \"" + command + "\" does not exist.");

? ? ? ? ? ? }

? ? ? ? } catch (Throwable t) {

? ? ? ? ? ? t.printStackTrace();

? ? ? ? }

? ? }publicvoid init()?

? ? ? ? throws Exception?

? ? {?


? ? ? ? // Set Catalina path?

? ? ? ? // 設置catalina_home屬性诊胞,tomcat啟動腳本里有通過-Dcatalina.home設置? ? ? ? ? setCatalinaHome();?

? ? ? ? // 設置catalina_base屬性暖夭,運行多實例的時候該目錄與catalina_home不同? ? ? ? ? setCatalinaBase();?


? ? ? ? // 初始化classloader,讀取conf/catalina.properties撵孤,根據(jù)指定的repository創(chuàng)建classloader?

? ? ? ? // 有三個classloader? 分別是common迈着、catalina、shared邪码,tomcat6中三個相同? ? ? ? ? initClassLoaders();?

? ? ? ? // 設置當前線程的classloader? ? ? ? ? Thread.currentThread().setContextClassLoader(catalinaLoader);?

? ? ? ? // 待研究? ? ? ? ? SecurityClassLoad.securityClassLoad(catalinaLoader);?


? ? ? ? // 以下通過反射調(diào)用Catalina中的方法?

? ? ? ? // Load our startup class and call its process() method? if (log.isDebugEnabled())?

? ? ? ? ? ? log.debug("Loading startup class");?

? ? ? ? Class startupClass =?

? ? ? ? ? ? catalinaLoader.loadClass?

? ? ? ? ? ? ("org.apache.catalina.startup.Catalina");?

? ? ? ? Object startupInstance = startupClass.newInstance();?


? ? ? ? // Set the shared extensions class loader? if (log.isDebugEnabled())?

? ? ? ? ? ? log.debug("Setting startup class properties");?

? ? ? ? String methodName = "setParentClassLoader";?

? ? ? ? Class paramTypes[] =newClass[1];?

? ? ? ? paramTypes[0] = Class.forName("java.lang.ClassLoader");?

? ? ? ? Object paramValues[] =newObject[1];?

? ? ? ? paramValues[0] = sharedLoader;?

? ? ? ? Method method =?

? ? ? ? ? ? startupInstance.getClass().getMethod(methodName, paramTypes);?

? ? ? ? method.invoke(startupInstance, paramValues);?


? ? ? ? catalinaDaemon = startupInstance;?


? ? }

2)調(diào)用Bootstrap中的init()裕菠,創(chuàng)建了Catalina對象(核心容器):主要進行了以下三步:

//設置tomcat實例的環(huán)境變量

①?Set up the environment variables required by this Tomcat instance

//實例化將用于運行Tomcat實例的通用類加載

②?Instantiate the general class loaders that will be used for our running? Tomcat instance

//初始化tomcat實例

③?Initialize this Tomcat instance

(3)調(diào)用Bootstrap中的load():實際上是通過反射調(diào)用了catalina的load方法。

①Parse the main configuration file for a Tomcat instance, server.xml,?converting each configuration element into the appropriate Tomcat?component1闭专。(找到config file(server.xml)奴潘;然后創(chuàng)建digester,解析server.xml影钉,生成各組件對象(Server画髓、Service、Container平委、Connector等)以及建立相互之間的關(guān)系奈虾。 )

(4)Start up our outermost Top Level Element—the Server instance。(最后start()廉赔,同樣是在Bootstrap中通過反射調(diào)用catalina對象的start方法肉微。接著啟動server.start()方法:((Lifecycle)?getServer()).start();?接著調(diào)用service.start()方法。接下來是一系列的container的start昂勉,后續(xù)在分析(會部署所有的項目)

三浪册、server.xml配置簡介:?下面講述這個文件中的基本配置信息,更具體的配置信息請參考tomcat的文檔

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末岗照,一起剝皮案震驚了整個濱河市村象,隨后出現(xiàn)的幾起案子笆环,更是在濱河造成了極大的恐慌,老刑警劉巖厚者,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件躁劣,死亡現(xiàn)場離奇詭異,居然都是意外死亡库菲,警方通過查閱死者的電腦和手機账忘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來熙宇,“玉大人鳖擒,你說我怎么就攤上這事√讨梗” “怎么了蒋荚?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長馆蠕。 經(jīng)常有香客問我期升,道長,這世上最難降的妖魔是什么互躬? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任播赁,我火速辦了婚禮,結(jié)果婚禮上吼渡,老公的妹妹穿的比我還像新娘容为。我一直安慰自己,他們只是感情好诞吱,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布舟奠。 她就那樣靜靜地躺著竭缝,像睡著了一般房维。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抬纸,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天咙俩,我揣著相機與錄音,去河邊找鬼湿故。 笑死阿趁,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的坛猪。 我是一名探鬼主播脖阵,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼墅茉!你這毒婦竟也來了命黔?” 一聲冷哼從身側(cè)響起呜呐,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悍募,沒想到半個月后蘑辑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡坠宴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年洋魂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喜鼓。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡副砍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出庄岖,到底是詐尸還是另有隱情址晕,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布顿锰,位于F島的核電站谨垃,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏硼控。R本人自食惡果不足惜刘陶,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牢撼。 院中可真熱鬧匙隔,春花似錦、人聲如沸熏版。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撼短。三九已至再膳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間曲横,已是汗流浹背喂柒。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留禾嫉,地道東北人灾杰。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像熙参,于是被迫代替她去往敵國和親艳吠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容