Tomcat 湯姆貓

圖片發(fā)自簡(jiǎn)書App

? ? ? ? ? ? ? ? ? ? ? ? Tomcat的主人

第一個(gè)問(wèn)題

Tomcat是什么?

Tomcat是應(yīng)用服務(wù)器起趾,區(qū)別于硬件(應(yīng)用服務(wù)器和數(shù)據(jù)服務(wù)器等)它是運(yùn)行在硬件上的軟件也叫Web應(yīng)用服務(wù)器夕冲。

百度百科是這樣解釋的:Tomcat是Apache 軟件基金會(huì)(Apache Software Foundation)的Jakarta 項(xiàng)目中的一個(gè)核心項(xiàng)目锨咙,由Apache、Sun 和其他一些公司及個(gè)人共同開發(fā)而成挤忙。由于有了Sun 的參與和支持霜威,最新的Servlet 和JSP 規(guī)范總是能在Tomcat 中得到體現(xiàn),Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 規(guī)范册烈。因?yàn)門omcat 技術(shù)先進(jìn)戈泼、性能穩(wěn)定,而且免費(fèi)赏僧,因而深受Java 愛(ài)好者的喜愛(ài)并得到了部分軟件開發(fā)商的認(rèn)可大猛,成為目前比較流行的Web 應(yīng)用服務(wù)器。

Tomcat 服務(wù)器是一個(gè)免費(fèi)的開放源代碼的Web 應(yīng)用服務(wù)器次哈,屬于輕量級(jí)應(yīng)用服務(wù)器胎署,在中小型系統(tǒng)和并發(fā)訪問(wèn)用戶不是很多的場(chǎng)合下被普遍使用,是開發(fā)和調(diào)試JSP 程序的首選窑滞。對(duì)于一個(gè)初學(xué)者來(lái)說(shuō)琼牧,可以這樣認(rèn)為,當(dāng)在一臺(tái)機(jī)器上配置好Apache 服務(wù)器哀卫,可利用它響應(yīng)HTML標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言下的一個(gè)應(yīng)用)頁(yè)面的訪問(wèn)請(qǐng)求巨坊。實(shí)際上Tomcat是Apache 服務(wù)器的擴(kuò)展,但運(yùn)行時(shí)它是獨(dú)立運(yùn)行的此改,所以當(dāng)你運(yùn)行tomcat 時(shí)趾撵,它實(shí)際上作為一個(gè)與Apache 獨(dú)立的進(jìn)程單獨(dú)運(yùn)行的。

訣竅是共啃,當(dāng)配置正確時(shí)占调,Apache 為HTML頁(yè)面服務(wù),而Tomcat 實(shí)際上運(yùn)行JSP 頁(yè)面和Servlet移剪。另外究珊,Tomcat和IIS等Web服務(wù)器一樣,具有處理HTML頁(yè)面的功能纵苛,另外它還是一個(gè)Servlet和JSP容器剿涮,獨(dú)立的Servlet容器是Tomcat的默認(rèn)模式言津。不過(guò),Tomcat處理靜態(tài)HTML的能力不如Apache服務(wù)器取试。目前Tomcat最新版本為9.0悬槽。

第二個(gè)問(wèn)題

Tomcat怎么用?

首先你就把它當(dāng)成一個(gè)運(yùn)行在服務(wù)器操作系統(tǒng)上的一個(gè)應(yīng)用軟件就好了瞬浓。既然是應(yīng)用軟件那就必然經(jīng)歷下面幾個(gè)過(guò)程:下載---安裝---配置環(huán)境變量初婆。經(jīng)過(guò)這樣3步,你的Tomcat就搭建好了瑟蜈,以后就可以把自己開發(fā)的應(yīng)用程序部署到Tomcat上運(yùn)行烟逊。那么自己開發(fā)的應(yīng)用程序是不能直接部署到操作系統(tǒng)的,而是部署到Tomcat里铺根,Tomcat實(shí)際上就是一個(gè)個(gè)應(yīng)用程序的管理者宪躯,所以叫它應(yīng)用服務(wù)器,這個(gè)服務(wù)器提供應(yīng)用服務(wù)位迂。

具體來(lái)講當(dāng)你在瀏覽器的網(wǎng)址輸入端輸入端輸入一個(gè)URL(統(tǒng)一資源定位)時(shí)访雪,經(jīng)過(guò)一個(gè)特別 復(fù)雜的過(guò)程后,瀏覽器才能將應(yīng)用服務(wù)器返回給它的內(nèi)容解析成你想要的樣子掂林。


訪問(wèn)某個(gè)網(wǎng)址我們經(jīng)li了什么

第三個(gè)問(wèn)題

Tomcat這個(gè)應(yīng)用程序的結(jié)構(gòu)是什么樣的臣缀?換句話說(shuō)這位大美女有什么特點(diǎn)啊泻帮?鼻子高不高精置?眼睛大不大?身材好不好锣杂?不好意思脂倦,在程序員眼里,向TOMCAT這樣的應(yīng)用程序?qū)嵲谑翘懒嗽梢援?dāng)做范本來(lái)學(xué)習(xí)赖阻,提高編程的能力,其中蘊(yùn)含的思想是非常有深度的踱蠢。

先來(lái)看看Tomcat的整體結(jié)構(gòu):


Tom的身體

層次分明火欧,是不是很有美感?

Tomcat中最頂層的容器叫Server茎截,代表整個(gè)服務(wù)器苇侵,Server中包含至少一個(gè)Service,用于具體提供服務(wù)企锌。Service主要包含兩部分:Connector和Container衅檀。Connector用于處理連接相關(guān)的事情,并提供Socket與request霎俩、response的轉(zhuǎn)換哀军,Container用于封裝和管理Servlet,以及具體處理request請(qǐng)求打却。一個(gè)Tomcat中只有一個(gè)Server杉适,一個(gè)Server可以包含多個(gè)Service,一個(gè)Service只有一個(gè)Container柳击,但可以有多個(gè)Connectors(因?yàn)橐粋€(gè)服務(wù)可以有多個(gè)連接猿推,如同時(shí)提供http和https連接,也可以提供相同協(xié)議不同端口的連接)捌肴。

這是標(biāo)準(zhǔn)技術(shù)性描述蹬叭,不用理解技術(shù)術(shù)語(yǔ)的前提下完全可以看懂Tomcat是由什么組成的,每個(gè)組件的數(shù)量是多少状知,這些說(shuō)得都非常清楚秽五。

說(shuō)了半天原來(lái)這個(gè)美女的外國(guó)名字叫:Server,你可以翻譯成女仆的饥悴。這位人民公仆會(huì)“分身術(shù)”坦喘,所以它可以同時(shí)提供很多個(gè)Service(服務(wù)),比如同時(shí)給你洗腳西设、捶背瓣铣、泡茶、做美食贷揽。牛不牛棠笑,這個(gè)“分身術(shù)”的設(shè)定就很牛!然后重點(diǎn)來(lái)了禽绪,每個(gè)Service都包括一個(gè)Connector和一個(gè)Container.翻譯過(guò)來(lái)就是蓖救,每一項(xiàng)服務(wù)都需要“預(yù)約”,然后把給你服務(wù)需要的工具箱(Container)拿出來(lái)丐一。

Connector這東西藻糖,看起來(lái)就是個(gè)簡(jiǎn)單的連接,像極了打電話库车,你撥號(hào)出去輸入1234567786等等巨柒,移動(dòng)服務(wù)商的設(shè)備卻經(jīng)歷了一個(gè)復(fù)雜的過(guò)程幫你呼叫那個(gè)叫“小麗”的用戶。Connector也是一樣的,要轉(zhuǎn)變或者翻譯給內(nèi)部的Container帮坚。

Connector: 處理連接相關(guān)的事情曼振,并提供Socket與request、response的轉(zhuǎn)換; 因?yàn)槲覀兊囊粋€(gè)請(qǐng)求通過(guò)瀏覽器發(fā)出后是通過(guò)Socket牺勾、TCP/IP、HTTP等完成的阵漏,這些內(nèi)容自己去看一下《網(wǎng)絡(luò)編程》驻民,應(yīng)用層翻具、傳輸層、網(wǎng)絡(luò)層回还、鏈路層裆泳、物理層等等,這個(gè)過(guò)程還是比較復(fù)雜的柠硕。

Container: 封裝和管理Servlet(服務(wù)器應(yīng)用)工禾,以及具體處理request請(qǐng)求。


結(jié)構(gòu)圖
容器裝配結(jié)構(gòu)圖

上面兩幅圖Container的結(jié)構(gòu)圖和Container容器裝配結(jié)構(gòu)圖蝗柔。

Container的子容器Engine闻葵、Host、Context癣丧、Wrapper是逐層包含的關(guān)系槽畔,其中Engine是最頂層,每個(gè)service最多只能有一個(gè)Engine坎缭,Engine里面可以有多個(gè)Host竟痰,每個(gè)Host下可以有多個(gè)Context,每個(gè)Context下可以有多個(gè)Wrapper掏呼。

4個(gè)容器的作用分別是:

□Engine:引擎坏快,用來(lái)管理多個(gè)站點(diǎn),一個(gè)Service最多只能有一個(gè)Engine憎夷。

□Host:代表一個(gè)站點(diǎn)莽鸿,也可以叫虛擬主機(jī),通過(guò)配置Host就可以添加站點(diǎn)拾给。

□Context:代表一個(gè)應(yīng)用程序祥得,對(duì)應(yīng)著平時(shí)開發(fā)的一套程序,或者一個(gè)WEB-INF目錄以及下面的web.xml文件蒋得。

□Wrapper:每個(gè)Wrapper封裝著一個(gè)Servlet级及。

Context和Host的區(qū)別是Context表示一個(gè)應(yīng)用,比如额衙,默認(rèn)配置下webapps下的每個(gè)目錄都是一個(gè)應(yīng)用饮焦,其中ROOT目錄中存放著主應(yīng)用,其他目錄存放著別的子應(yīng)用窍侧,而整個(gè)webapps是一個(gè)站點(diǎn)县踢。假如www.excelib.com域名對(duì)應(yīng)著webapps目錄所代表的站點(diǎn),其中的ROOT目錄里的應(yīng)用就是主應(yīng)用伟件,訪問(wèn)時(shí)直接使用域名就可以硼啤,而webapps/test目錄存放的是test子應(yīng)用,訪問(wèn)時(shí)需要用www.excelib.com/test斧账,每一個(gè)應(yīng)用對(duì)應(yīng)一個(gè)Context谴返,所有webapps下的應(yīng)用都屬于www.excelib.com站點(diǎn)煞肾,而blog.excelib.com則是另外一個(gè)站點(diǎn),屬于另外一個(gè)Host嗓袱。

如果你只是想了解一下湯姆貓基本的“美”扯旷,科普到這里已經(jīng)可以了。如果你想更好地體會(huì)它的美索抓,那么到官網(wǎng)下載源碼來(lái)研究一下吧,那里你會(huì)發(fā)現(xiàn)一個(gè)不一樣的世界毯炮,歐耶逼肯!


圖片發(fā)自簡(jiǎn)書App

第四個(gè)問(wèn)題

細(xì)化Connector


圖片發(fā)自簡(jiǎn)書App

Connector中具體是用ProtocolHandler來(lái)處理請(qǐng)求的,不同的ProtocolHandler代表不同的連接類型桃煎,比如篮幢,Http11Protocol使用的是普通Socket來(lái)連接的,Http11NioProtocol使用的是NioSocket來(lái)連接的为迈。

ProtocolHandler里面有3個(gè)非常重要的組件:Endpoint三椿、Processor和Adapter。Endpoint用于處理底層Socket的網(wǎng)絡(luò)連接葫辐,Processor用于將Endpoint接收到的Socket封裝成Request搜锰,Adapter用于將封裝好的Request交給Container進(jìn)行具體處理。也就是說(shuō)Endpoint用來(lái)實(shí)現(xiàn)TCP/IP協(xié)議耿战,Processor用來(lái)實(shí)現(xiàn)HTTP協(xié)議蛋叼,Adapter將請(qǐng)求適配到Servlet容器進(jìn)行具體處理。

Endpoint的抽象實(shí)現(xiàn)AbstractEndpoint里面定義的Acceptor和AsyncTimeout兩個(gè)內(nèi)部類和一個(gè)Handler接口剂陡。Acceptor用于監(jiān)聽(tīng)請(qǐng)求狈涮,AsyncTimeout用于檢查異步request的超時(shí),Handler用于處理接收到的Socket鸭栖,在內(nèi)部調(diào)用了Processor進(jìn)行處理歌馍。

Connector的結(jié)構(gòu)如圖7-6所示。


圖片發(fā)自簡(jiǎn)書App


圖7-6 Connector結(jié)構(gòu)關(guān)系圖

7.5.2 Connector自身類

Connector類本身的作用主要是在其創(chuàng)建時(shí)創(chuàng)建ProtocolHandler晕鹊,然后在生命周期的相關(guān)方法中調(diào)用了ProtocolHandler的相關(guān)生命周期方法松却。Connector的使用方法是通過(guò)Connector標(biāo)簽配置在conf/server.xml文件中,所以Connector是在Catalina的load方法中根據(jù)conf/server.xml配置文件創(chuàng)建Server對(duì)象時(shí)創(chuàng)建的捏题。Connector的生命周期方法是在Service中調(diào)用的玻褪。

Connector的創(chuàng)建

Connector的創(chuàng)建過(guò)程主要是初始化ProtocolHandler。server.xml配置文件中Connector標(biāo)簽的protocol屬性會(huì)設(shè)置到Connector構(gòu)造函數(shù)的參數(shù)中公荧,它用于指定ProtocolHandler的類型带射,Connector的構(gòu)造函數(shù)代碼如下:

spring MVC 核心概念

Handler:也就是處理器,它直接對(duì)應(yīng)著MVC中的C也就是Controller層循狰,它的具體表現(xiàn)形式有很多窟社,可以是類券勺,也可以是方法,如果你能想到別的表現(xiàn)形式也可以使用灿里,它的類型是Object关炼。我們前面例子中標(biāo)注了@RequestMapping的所有方法都可以看成一個(gè)Handler。只要可以實(shí)際處理請(qǐng)求就可以是Handler匣吊。

HandlerMapping:是用來(lái)查找Handler的儒拂,在Spring MVC中會(huì)處理很多請(qǐng)求,每個(gè)請(qǐng)求都需要一個(gè)Handler來(lái)處理色鸳,具體接收到一個(gè)請(qǐng)求后使用哪個(gè)Handler來(lái)處理呢社痛?這就是HandlerMapping要做的事情。

HandlerAdapter:很多人對(duì)這個(gè)的理解都不準(zhǔn)確命雀,其實(shí)從名字上就可以看出它是一個(gè)Adapter蒜哀,也就是適配器。因?yàn)镾pring MVC中的Handler可以是任意的形式吏砂,只要能處理請(qǐng)求就OK撵儿,但是Servlet需要的處理方法的結(jié)構(gòu)卻是固定的,都是以request和response為參數(shù)的方法(如doService方法)狐血。怎么讓固定的Servlet處理方法調(diào)用靈活的Handler來(lái)進(jìn)行處理呢淀歇?這就是HandlerAdapter要做的事情。

通俗點(diǎn)的解釋就是Handler是用來(lái)干活的工具氛雪,HandlerMapping用于根據(jù)需要干的活找到相應(yīng)的工具房匆,HandlerAdapter是使用工具干活的人。比如报亩,Handler就像車床浴鸿、銑床、電火花之類的設(shè)備弦追,HandlerMapping的作用是根據(jù)加工的需求選擇用什么設(shè)備進(jìn)行加工岳链,而HandlerAdapter是具體操作設(shè)備的工人,不同的設(shè)備需要不同的工人去加工劲件,車床需要車工掸哑,銑床需要銑工,如果讓車工使用銑床干活就可能出問(wèn)題零远,所以不同的Handler需要不同的HandlerAdapter去使用苗分。我們都知道在干活的時(shí)候人是柔性最強(qiáng)、靈活度最高的牵辣,同時(shí)也是問(wèn)題最多摔癣、困難最多的。Spring MVC中也一樣,在九大組件中HandlerAdapter也是最復(fù)雜的择浊,所以在后面學(xué)習(xí)HandlerAdapter的時(shí)候要多留心戴卜。

另外View和ViewResolver的原理與Handler和HandlerMapping的原理類似。View是用來(lái)展示數(shù)據(jù)的琢岩,而ViewResolver用來(lái)查找View投剥。通俗地講就是干完活后需要寫報(bào)告,寫報(bào)告又需要模板(比如担孔,是調(diào)查報(bào)告還是驗(yàn)收?qǐng)?bào)告或者是下一步工作的請(qǐng)示等)江锨,View就是所需要的模板,模板就像公文里邊的格式糕篇,內(nèi)容就是Model里邊的數(shù)據(jù)泳桦,ViewResolver就是用來(lái)選擇使用哪個(gè)模板的。

現(xiàn)在再回過(guò)頭去看上面的四句代碼應(yīng)該就覺(jué)得很容易理解了娩缰,它們分別是:使用HandlerMapping找到干活的Handler,找到使用Handler的HandlerAdapter谒府,讓HandlerAdapter使用Handler干活拼坎,干完活后將結(jié)果寫個(gè)報(bào)告交上去(通過(guò)View展示給用戶)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末完疫,一起剝皮案震驚了整個(gè)濱河市泰鸡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌壳鹤,老刑警劉巖盛龄,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異芳誓,居然都是意外死亡余舶,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門锹淌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)匿值,“玉大人,你說(shuō)我怎么就攤上這事赂摆⌒荆” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵烟号,是天一觀的道長(zhǎng)绊谭。 經(jīng)常有香客問(wèn)我,道長(zhǎng)汪拥,這世上最難降的妖魔是什么达传? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上趟大,老公的妹妹穿的比我還像新娘鹤树。我一直安慰自己,他們只是感情好逊朽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布罕伯。 她就那樣靜靜地躺著,像睡著了一般叽讳。 火紅的嫁衣襯著肌膚如雪追他。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天岛蚤,我揣著相機(jī)與錄音邑狸,去河邊找鬼。 笑死涤妒,一個(gè)胖子當(dāng)著我的面吹牛单雾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播她紫,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼硅堆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了贿讹?” 一聲冷哼從身側(cè)響起渐逃,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎民褂,沒(méi)想到半個(gè)月后茄菊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赊堪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年面殖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哭廉。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡畜普,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出群叶,到底是詐尸還是另有隱情吃挑,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布街立,位于F島的核電站舶衬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赎离。R本人自食惡果不足惜逛犹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧虽画,春花似錦舞蔽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至脖岛,卻和暖如春朵栖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柴梆。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工陨溅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绍在。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓门扇,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親偿渡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悯嗓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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