Tomcat外傳
時(shí)間:2023-06-29 16:03:02 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)
時(shí)間:2023-06-29 16:03:02 來(lái)源:網(wǎng)站運(yùn)營(yíng)
Tomcat外傳:本來(lái)想這周著手寫SSM的,后來(lái)想想,還是決定稍微繞一下遠(yuǎn)路吧,也順便看看JavaWeb的犄角旮旯,故地重游或許有另一番風(fēng)景。我當(dāng)初初學(xué)JavaWeb時(shí)遇到的第一個(gè)困難其實(shí)是Tomcat!Servlet/JSP難嗎?難也不難。只是開頭被Tomcat搞懵了,導(dǎo)致學(xué)習(xí)Servlet時(shí)還有點(diǎn)暈,各種概念學(xué)不明白,于是更糊涂了。
如果對(duì)Tomcat/Servlet等知識(shí)沒(méi)有足夠的自我理解,后面SSM學(xué)起來(lái)很累。相信我,繞一下遠(yuǎn)路,可能比抄近道收獲更多,速度更快。
內(nèi)容簡(jiǎn)介:
- Tomcat學(xué)藝
- 我們?yōu)槭裁葱枰?wù)器?
- 3個(gè)容易混淆的小概念
- 什么是動(dòng)態(tài)資源?
- Tomcat架構(gòu)
- 對(duì)JavaWeb(6):淺談JSP的補(bǔ)充
- 動(dòng)手實(shí)現(xiàn)"Tomcat"(視頻,比較簡(jiǎn)陋,就是socket編程,大家自己看)
Tomcat學(xué)藝
Tomcat,熟悉的陌生人。我們所有的項(xiàng)目都運(yùn)行在它上面,而我們卻往往對(duì)它視而不見?,F(xiàn)實(shí)中也是如此,我們周圍充滿了空氣,我們無(wú)時(shí)無(wú)刻不在呼吸,但你從來(lái)沒(méi)關(guān)心過(guò)它。同樣的,Tomcat于我們而言,也只是在創(chuàng)建環(huán)境或者運(yùn)行項(xiàng)目爆出各種錯(cuò)誤時(shí),才會(huì)去看看它。
上世紀(jì)90年代在大洋彼岸,有一家名喚SUN的公司,創(chuàng)造了一門全新的語(yǔ)言,叫Java。經(jīng)過(guò)短短幾年的發(fā)展,一躍成為市場(chǎng)上最炙手可熱的語(yǔ)言。隨后又悟出“Java13絕技”,也就是所謂的JavaEE規(guī)范:JDBC,JNDI,EJB,RMI,JSP,Servlets,XML,JMS,Java IDL,JTS,JTA,JavaMail,JAF。
在大洋彼岸還有一家公司,準(zhǔn)確來(lái)說(shuō)它是一個(gè)組織,專門搞開源的,叫Apache。這家公司搞出了一個(gè)叫Tomcat的服務(wù)器。這個(gè)名字取得真好啊。中國(guó)有個(gè)詞叫三腳貓,專門來(lái)吐槽別人功夫不到家。巧了,Tomcat也沒(méi)完全實(shí)現(xiàn)JavaEE規(guī)范。13種核心技術(shù),Tomcat只實(shí)現(xiàn)了倆:Servlet和JSP。而其他服務(wù)器比如JBoss、Weblogic啥的都是完全支持的。所以人們往往更愿意叫Tomcat為輕量級(jí)的服務(wù)器,也有叫它Servlet/JSP容器的。
聽到這,你不禁大叫:不對(duì)啊,我記得自己寫的程序里有用到JDBC啊,還可以運(yùn)行哩!
啊,那是因?yàn)槟銓?dǎo)了JDBC包...但是你安裝了Tomcat后另外導(dǎo)過(guò)Servlet/JSP的包嗎?沒(méi)有嘛!人家實(shí)現(xiàn)了Servlet/JSP規(guī)范,都整到自己源碼里了。
說(shuō)到這,我也是淚流滿面。因?yàn)槲也虐l(fā)現(xiàn)自己也是個(gè)三腳貓。上面“Java13絕技”我特么也就學(xué)過(guò)JDBC/XML/JSP/Servlet...所以我更愿意稱自己是JavaWeb程序員,而不是JavaEE程序員。JavaEE其實(shí)很重,我拿不動(dòng),打擾了。
我們?yōu)槭裁葱枰?wù)器?
在我看來(lái),服務(wù)器最本質(zhì)的作用有兩個(gè):
- 將資源對(duì)外暴露
- 配合各種傳輸協(xié)議進(jìn)行響應(yīng)輸出
假設(shè)現(xiàn)在有個(gè)問(wèn)題:
給你兩臺(tái)電腦,不通過(guò)藍(lán)牙/QQ/微信,也不通過(guò)網(wǎng)盤或USB等可移動(dòng)設(shè)備做中介,你要如何把一張圖片從一臺(tái)電腦傳到另一臺(tái)?
聽到這個(gè)問(wèn)題,我估計(jì)大部分非科班的朋友都要懵。因?yàn)槿绻笃跊](méi)有刻意去學(xué)習(xí)計(jì)算機(jī)網(wǎng)絡(luò),我們對(duì)于網(wǎng)絡(luò)的了解基本僅限于基礎(chǔ)班4小時(shí)的“網(wǎng)絡(luò)編程”講解。而大家平時(shí)又太習(xí)慣地址欄鍵入"www.baidu.com",無(wú)腦一回車就上網(wǎng)沖浪了?,F(xiàn)在突然讓你去訪問(wèn)隔壁的電腦,確實(shí)有點(diǎn)束手無(wú)策。
解決這個(gè)問(wèn)題的方法可能有多種,這里介紹其中一種:通過(guò)服務(wù)器訪問(wèn)。
請(qǐng)先了解以下三個(gè)概念:
- IP:電子設(shè)備(計(jì)算機(jī))在網(wǎng)絡(luò)中的唯一標(biāo)識(shí),一個(gè)IP對(duì)應(yīng)一臺(tái)實(shí)體電腦
- 端口:應(yīng)用程序在計(jì)算機(jī)中的唯一標(biāo)識(shí),一個(gè)端口只能被唯一程序占用
- 傳輸協(xié)議:數(shù)據(jù)傳輸?shù)囊?guī)則
中國(guó)有14億人口,每個(gè)人都有唯一的身份標(biāo)識(shí):身份證,用以精確定位某個(gè)個(gè)體。同樣的,網(wǎng)絡(luò)上有幾十億臺(tái)電腦,每臺(tái)電腦都有自己的一串特有IP(不同局域網(wǎng)內(nèi)可以相同),也就是說(shuō)一個(gè)IP代表一臺(tái)特定的
實(shí)體電腦。比如《唐伯虎點(diǎn)秋香》中華安的編號(hào)是9527,而華府的管家從不叫他名字,而是直接喊“9527”。因?yàn)椤?527”就是華安。
雖然根據(jù)IP可以精準(zhǔn)定位一臺(tái)電腦,但是還不足以讓我們?cè)L問(wèn)這臺(tái)電腦。就好比你知道了我的門牌號(hào),但是我沒(méi)給你開門。所謂的門,就是一個(gè)端口,而端口的背后是應(yīng)用程序。
一般來(lái)說(shuō),一個(gè)端口可以定位一個(gè)軟件,但一個(gè)軟件可以占用多個(gè)端口(你家的門,只屬于你家,但可以有前后門)。在現(xiàn)實(shí)生活中,你家的門如果被別人占用了或者堵了,客人(請(qǐng)求)就進(jìn)不去了。而在程序中,如果有兩個(gè)程序的端口相同,就會(huì)發(fā)生端口沖突,也就是所謂的“端口占用”。端口占用的后果往往是程序無(wú)法啟動(dòng),更遑論運(yùn)行。
關(guān)于端口,再舉個(gè)例子:
微信和QQ都是騰訊公司的,你的電腦上同時(shí)裝了這兩個(gè)軟件。為什么我用QQ給你發(fā)消息,你的微信收不到?正常人看起來(lái)很傻的問(wèn)題,實(shí)際上并不是那么簡(jiǎn)單。
每個(gè)應(yīng)用程序都有自己的端口號(hào)(可能有多個(gè)),它們一旦運(yùn)行,就要去監(jiān)聽這些端口。每個(gè)程序都是電腦的囚犯,看不到外面的世界,而端口就是給這些囚犯送飯的窗口。應(yīng)用程序們整天躲在電腦里盯著自己的端口們,祈求著別的計(jì)算機(jī)來(lái)訪時(shí)能送個(gè)大雞腿(Request請(qǐng)求)。
其實(shí)QQ這些軟件屬于C/S架構(gòu),已經(jīng)為我們屏蔽了太多底層,什么IP、端口全部都是自動(dòng)封裝的。相比來(lái)說(shuō),B/S架構(gòu)更直觀一些。比如用瀏覽器訪問(wèn)百度:
想要訪問(wèn)一臺(tái)服務(wù)器,必須知道它的IP。但我們?nèi)祟惒簧瞄L(zhǎng)記憶長(zhǎng)串?dāng)?shù)字,于是人類搞了所謂的域名來(lái)指向IP。但實(shí)際請(qǐng)求時(shí),最終還是要換算成IP去訪問(wèn)。總得來(lái)說(shuō)有兩種換算的途徑:1.本機(jī)的hosts文件 2.DNS服務(wù)器不知道有沒(méi)有細(xì)心的朋友注意到了下面的細(xì)節(jié):
即使DNS解析域名得到對(duì)應(yīng)的IP后,Request請(qǐng)求里還是會(huì)帶上host。為什么?
因?yàn)椋河蛎?=IP。實(shí)際上一個(gè)IP可以對(duì)應(yīng)多個(gè)域名。也就是說(shuō)
一臺(tái)實(shí)體服務(wù)器(大鐵柜),理論上可以有
多個(gè)域名(虛擬主機(jī))。實(shí)體服務(wù)器和網(wǎng)站是兩個(gè)概念。
IP只是對(duì)應(yīng)實(shí)體服務(wù)器,而域名對(duì)應(yīng)具體的網(wǎng)站。比如上面百度服務(wù)器,雖然看起來(lái)115.239.210.27這個(gè)IP完全等同于
http://www.baidu.com,但也有可能這個(gè)IP對(duì)應(yīng)的服務(wù)器上配置了兩個(gè)虛擬主機(jī):www.baidu.com和tieba.baidu.com。所以即使找到了IP對(duì)應(yīng)的服務(wù)器實(shí)體,Request請(qǐng)求還是要帶上host主機(jī)名,以確定是哪個(gè)虛擬主機(jī)。
通過(guò)DNS解析域名得到IP,然后根據(jù)IP+host找到服務(wù)器另外,如果兩個(gè)域名對(duì)應(yīng)同一個(gè)IP,那么必須設(shè)置其中一個(gè)域名為默認(rèn)的,不然同一臺(tái)服務(wù)器有兩個(gè)虛擬主機(jī),我該訪問(wèn)誰(shuí)?
已經(jīng)知道IP,就無(wú)需DNS解析,可直接訪問(wèn)服務(wù)器。若這個(gè)IP對(duì)應(yīng)的服務(wù)器有兩個(gè)虛擬主機(jī),而用戶Request請(qǐng)求行中又沒(méi)有指定host,則會(huì)訪問(wèn)默認(rèn)主機(jī)(因此服務(wù)器要事先指定默認(rèn)主機(jī)!Tomcat默認(rèn)localhost)最后,再用Tomcat舉個(gè)例子。比如,現(xiàn)在我有一臺(tái)筆記本電腦(一個(gè)實(shí)體服務(wù)器),它的本機(jī)IP是192.168.112.1,我在上面裝了Tomcat。如果Tomcat不改動(dòng)配置,則默認(rèn)只有一個(gè)虛擬主機(jī)localhost(默認(rèn)主機(jī))。接著我開發(fā)了一個(gè)JavaWeb程序demo1部署到Tomcat,然后我同事在瀏覽器輸入下方地址
192.168.112.1:8080/demo1/index.html
訪問(wèn)我的電腦。雖然沒(méi)有帶host,但是localhost是默認(rèn)的,于是訪問(wèn)它。
最后必須解釋的是,上面的百度服務(wù)器只是舉個(gè)例子,實(shí)際上百度搜索和百度貼吧的IP是不同的,也就是說(shuō)它們不在同一臺(tái)服務(wù)器上。通常來(lái)說(shuō),一個(gè)IP對(duì)應(yīng)一臺(tái)服務(wù)器,服務(wù)器上只有一個(gè)主機(jī)。拿到IP基本就可以確定要訪問(wèn)哪個(gè)網(wǎng)站。
3個(gè)容易混淆的小概念
我們經(jīng)常開口閉口“服務(wù)器”、“服務(wù)器”的,其實(shí)“服務(wù)器”是個(gè)很容易引發(fā)歧義的概念,我能想到的就有3點(diǎn):
- 軟件概念的服務(wù)器和硬件概念的服務(wù)器
軟件概念上,只要是一臺(tái)硬件配置正常、裝有操作系統(tǒng)、插著電能上網(wǎng),并且安裝特定軟件的電腦,都可以稱為服務(wù)器。比如你要學(xué)習(xí)數(shù)據(jù)庫(kù)了,于是你裝了MySQL服務(wù)端,那么此時(shí)你的電腦就是一個(gè)MySQL服務(wù)器。然后你又裝了SVN服務(wù)端,那么此時(shí)你的電腦既是MySQL服務(wù)器,又是SVN服務(wù)器。Tomcat服務(wù)器同理。
硬件概念上,服務(wù)器本質(zhì)上也是一臺(tái)電腦,只不過(guò)配置高的同時(shí)長(zhǎng)相丑了點(diǎn),基本就是一個(gè)冰冷的大鐵柜。我們的筆記本電腦既能看片又能玩游戲,而它們基本上專機(jī)專用。
其實(shí),Tomcat服務(wù)器 = Web服務(wù)器 + Servlet/JSP容器(Web容器)。
Web服務(wù)器的作用是接收客戶端的請(qǐng)求,給客戶端作出響應(yīng)。但是很明顯,服務(wù)器不止靜態(tài)資源呀,所以客戶端發(fā)起請(qǐng)求后,如果是動(dòng)態(tài)資源,Web服務(wù)器不可能直接把它響應(yīng)回去(比如JSP),因?yàn)闉g覽器只認(rèn)識(shí)靜態(tài)資源。所以對(duì)于JavaWeb程序而言,還需要JSP/Servlet容器,
JSP/Servlet容器的基本功能是把動(dòng)態(tài)資源轉(zhuǎn)換成靜態(tài)資源。我們JavaWeb工程師需要使用Web服務(wù)器和JSP/Servlet容器,而通常這兩者會(huì)集于一身,比如Tomcat。
Web服務(wù)器接收、響應(yīng)客戶端請(qǐng)求,Web容器裝載Servlet/JSP,讓它們?nèi)ヌ幚韯?dòng)態(tài)資源[來(lái)自尚硅谷]所以剛才我們畫的百度服務(wù)器,其實(shí)細(xì)節(jié)還可以更豐滿些:
百度服務(wù)器細(xì)節(jié)圖訪問(wèn)百度完整的流程- 我們開發(fā)的Web應(yīng)用都是半成品!
我們寫代碼的時(shí)候,都知道相同代碼最好抽取成公共方法以復(fù)用?,F(xiàn)在我們來(lái)想一想,上百上千的Web應(yīng)用有什么共性嗎?首先,資源肯定不同,無(wú)法抽取。比如優(yōu)酷主打視頻,本站基本都是文字。其次,業(yè)務(wù)也肯定不同,比如百度主要是搜索,淘寶是電商。但是有一點(diǎn)是一樣的,這些網(wǎng)站都需要“接收用戶請(qǐng)求”+“響應(yīng)用戶請(qǐng)求”。
嗯?橋多麻袋??!這兩個(gè)概念,好像哪里見過(guò)!不錯(cuò),就是上面的Web服務(wù)器。仔細(xì)回想一下,我們開發(fā)JavaWeb時(shí),你操心過(guò)如何接收HTTP請(qǐng)求和響應(yīng)HTTP請(qǐng)求嗎?顯然沒(méi)有嘛!因?yàn)槟阋恢泵χ鴇ebug。
所以,我們用Java開發(fā)的Web應(yīng)用只是一個(gè)半成品,類似于一個(gè)插件,而服務(wù)器則像一個(gè)收發(fā)器:
什么是動(dòng)態(tài)資源?
其實(shí)對(duì)于何謂動(dòng)態(tài)資源,我也沒(méi)有很精準(zhǔn)的概念。要講清楚一個(gè)東西是什么,有時(shí)是比較難的事。不如先說(shuō)它不是什么。
首先,
動(dòng)態(tài)資源不等同于動(dòng)態(tài)頁(yè)面。所謂動(dòng)態(tài)頁(yè)面,就是頁(yè)面會(huì)動(dòng),而會(huì)動(dòng)的頁(yè)面不一定是動(dòng)態(tài)資源。比如我可以用JQuery執(zhí)行一段代碼,讓一個(gè)Div不斷放大縮小,但是很顯然它還是一個(gè)HTML頁(yè)面。
所謂動(dòng)態(tài)資源,其實(shí)最顯著的特征就是它能動(dòng)態(tài)地生成HTML!比如JSP。動(dòng)態(tài)資源有個(gè)“特色”:它的數(shù)據(jù)是“可拼裝”的、而且“可以隨時(shí)間變化”。下面用號(hào)稱可以抗住8個(gè)明星同時(shí)出軌的新浪服務(wù)器舉個(gè)例子:
突然,新浪《花花世界》專欄的小編發(fā)現(xiàn),原來(lái)和bravo1988有緋聞的不是劉亦菲,而是佟麗婭,于是打開專欄做了修改:
此時(shí),粉絲們?cè)俅未蜷_《花花世界》專欄,看到的就是:佟麗婭深夜買醉bravo。
上面這個(gè)例子很好地說(shuō)明了動(dòng)態(tài)資源(JSP)的兩個(gè)特性:
- 可拼裝:${name}"深夜買醉bravo"
- 隨時(shí)間變化:劉亦菲→佟麗婭
那么為什么說(shuō)HTML就是靜態(tài)資源呢?我也可以修改HTML頁(yè)面使它發(fā)生改變??!很好,很有想法。那么請(qǐng)小編先學(xué)會(huì)Linux,然后遠(yuǎn)程連接服務(wù)器進(jìn)入到Tomcat目錄下修改吧。
動(dòng)態(tài)資源和靜態(tài)資源雖然都在服務(wù)器里,但是動(dòng)態(tài)資源包含變量(“可拼裝”特性),而變量維系著數(shù)據(jù)庫(kù)和程序之間的聯(lián)系。
如果把JSP比作電子廣告牌,變量比作一根電線,而電線連接著一臺(tái)電腦(數(shù)據(jù)庫(kù)服務(wù)器)。那么只要電腦上重新編輯文本,廣告牌的內(nèi)容也會(huì)變,此謂動(dòng)態(tài)。而靜態(tài)資源就像一張布告,當(dāng)初寫什么就是什么,任他風(fēng)吹雨打,都不會(huì)再改變了。
Tomcat架構(gòu)
Tomcat的目錄結(jié)構(gòu)就不再多說(shuō),每個(gè)機(jī)構(gòu)的培訓(xùn)視頻都會(huì)強(qiáng)調(diào)。
先看一下我的Tomcat目錄(免安裝版),我把它放在了F盤的develop文件夾下:
重點(diǎn)介紹一下Tomcat的架構(gòu):
嗯?這個(gè)connector的畫法,好像哪里見過(guò)?其實(shí)這張圖,應(yīng)該結(jié)合Tomcat的一個(gè)配置文件(Server.xml)來(lái)看:
簡(jiǎn)略解釋一下xml里的配置:
- Server.xml文件中的配置結(jié)構(gòu)和Tomcat的架構(gòu)是一一對(duì)應(yīng)的。根目錄是<Server>,代表服務(wù)器,<Server>下面有且僅有1個(gè)<Service>,代表服務(wù)。
- <Service>下有兩個(gè)<Connector>,代表連接(需要的話可以再加)。
其實(shí)這個(gè)Connector就是我們?cè)谏厦嬗懻摪俣确?wù)器時(shí)畫過(guò)的端口。大家可以看到Tomcat默認(rèn)配置了兩個(gè)端口,一個(gè)是HTTP/1.1協(xié)議的,一個(gè)是AJP/1.3協(xié)議(我也不知道是啥)。前者專門處理HTTP請(qǐng)求。 - 當(dāng)我們?cè)跒g覽器輸入"http://localhost:8080/demo/index.html"時(shí),瀏覽器是以HTTP協(xié)議發(fā)送的,當(dāng)這個(gè)請(qǐng)求到了服務(wù)器后,會(huì)被識(shí)別為HTTP類型,于是服務(wù)器就找來(lái)專門處理HTTP的Connector,它的默認(rèn)端口正是上門Server.xml配置的8080。
- 與Connector平級(jí)的還有個(gè)<Engine>(Tomcat引擎),也就是說(shuō)<Service>有兩個(gè)孩子,小兒子是<Connector>,大兒子是<Engine>。Connector的作用說(shuō)穿了就是監(jiān)聽端口,如果用戶訪問(wèn)地址是“l(fā)ocalhost:8080/xx/xx”,那就由監(jiān)聽8080端口的Connector負(fù)責(zé),如果是"https://www.baidu.com",那么就是443端口處理。其實(shí)Connector也不處理實(shí)際業(yè)務(wù),它只是個(gè)孩子。但它會(huì)負(fù)責(zé)把客人(請(qǐng)求)帶到哥哥Engine那,然后Engine會(huì)處理。
- <Engine>下面有個(gè)Host,代表主機(jī)。
配置介紹到這里,要先停一下,講個(gè)故事:
從前有個(gè)國(guó)家,叫The United States of Tomcat。
國(guó)王Service是個(gè)愛貓的人,家庭和諧美滿。
他立了一個(gè)太子,叫做Engine。
另外還有還幾個(gè)很小的兒子,不過(guò)都是親王(Connector),未來(lái)可能還要再生幾個(gè)Connector。
由于Tomcat國(guó)實(shí)在太小了,全城上下就幾個(gè)人,所以親王Connector們被派去守城門。
為了讓太子得到鍛煉,早日繼承衣缽,國(guó)王Service告訴親王兒子們:他國(guó)使者若來(lái)拜訪,你們就帶他去你們哥哥Engine那去,他會(huì)處理一切。
Engine貴為太子,有好幾處府邸,比如HOST1,HOST2,未來(lái)可能再建幾座府?。ㄐ陆ㄌ摂M主機(jī)),但是Engine說(shuō)了,我一般都在localhost待著,來(lái)這找我便可。
每一座府邸里,都有好幾個(gè)廂房(Context:我們開發(fā)的Web應(yīng)用)。Engine會(huì)根據(jù)來(lái)訪使者的通關(guān)文牒(localhost:8080/myWeb/index.html)安排他們?nèi)ツ膫€(gè)房間(myWeb),拿什么禮品(index.html)。
最后結(jié)合文件目錄再看一次Tomcat架構(gòu):
對(duì)JavaWeb(6):淺談JSP的補(bǔ)充
有兩個(gè)Servlet很重要,但是在“淺談JSP”中沒(méi)有提到。
- DefaultServlet:該出手時(shí)就出手
TestDefaultServlethttps://www.zhihu.com/video/1065277886390398976上面案例中,我新建一個(gè)動(dòng)態(tài)web工程,只是寫了一個(gè)HTML,沒(méi)有編寫Servlet,甚至一句Java代碼都沒(méi)寫。但是啟動(dòng)Tomcat后我卻可以通過(guò)瀏覽器訪問(wèn)到剛才編寫的haha.html。這是為何?
我們知道,對(duì)于像Tomcat這樣的Servlet容器來(lái)說(shuō),任何一個(gè)請(qǐng)求的背后肯定有個(gè)Servlet在默默處理:
所以這次也不例外,肯定也有對(duì)應(yīng)的Servlet處理了本次請(qǐng)求。既然不是我們寫的,那只能是Tomcat提供的。查看Tomcat下的conf目錄,除了我們熟悉的Server.xml,還有個(gè)web.xml。
不錯(cuò),我們每個(gè)動(dòng)態(tài)web工程都有個(gè)web.xml,而conf里的這個(gè),是它們的“老爹”。它里面的配置,如果動(dòng)態(tài)web工程沒(méi)有覆蓋,就會(huì)被“繼承”下來(lái)。我們會(huì)發(fā)現(xiàn),conf/web.xml里配置了一個(gè)DefaultServlet:
DefaultServlet的作用:最低級(jí)匹配,當(dāng)沒(méi)有對(duì)應(yīng)的Servlet處理當(dāng)前請(qǐng)求時(shí),才輪到它處理。要么找到并響應(yīng)請(qǐng)求的資源,要么給出404頁(yè)面。我們都知道JSP是“化了濃妝”的Servlet,但是好不容易偽裝成了一個(gè)JSP,是誰(shuí)幫它卸妝的呢?另外,大家仔細(xì)想想,一般來(lái)說(shuō)JavaWeb階段我們?cè)L問(wèn)資源有三種“形式”:
localhost:8080/demo/AServlet:很明顯,我們手動(dòng)寫了一個(gè)AServlet處理它localhost:8080/demo/haha.html:雖然我們沒(méi)寫,但是Tomcat自己準(zhǔn)備了DefaultServletlocalhost:8080/demo/index.jsp:我擦,誰(shuí)來(lái)處理?
對(duì)呀,細(xì)思恐極,這*.jsp的資源,誰(shuí)來(lái)處理?其實(shí)就是JspServlet。它的作用簡(jiǎn)而言之就是:
- 首先,根據(jù)請(qǐng)求路徑找到JSP
- 然后,將它“翻譯成”Servlet
剛才帶大家看conf/web.xml時(shí),我把它隱藏了,因?yàn)橥瑫r(shí)講解DefaultServlet和JspServlet會(huì)比較亂。強(qiáng)烈建議大家現(xiàn)在暫停一下,打開本機(jī)的Tomcat找到conf/web.xml看一下。下面是JspServlet的配置:
所以最后總結(jié)一下Tomcat處理請(qǐng)求的幾種方式:
動(dòng)手實(shí)現(xiàn)"Tomcat"
最后,還有個(gè)很無(wú)聊的問(wèn)題留給大家思考:JavaSE階段,我們無(wú)論做什么,都是上來(lái)先敲main()。學(xué)了JavaWeb后,我想問(wèn)問(wèn),你有多久沒(méi)敲main()了?她去哪了呢?
動(dòng)手實(shí)現(xiàn)Tomcat(黑馬公開課):鏈接見評(píng)論區(qū)置頂。
其實(shí)SpringIOC可以細(xì)分為父子容器,后面SSM再說(shuō)
參考資料:
1.傳智播客崔希凡JavaWeb day8
2.傳智播客12年云計(jì)算班JavaWeb(梁桐) day4
3.黑馬12期JavaWeb(劉悅東) day06
4.尚硅谷JavaWeb(佟剛)
5.tomcat中對(duì)靜態(tài)資源的訪問(wèn)也會(huì)用servlet來(lái)處理嗎?
2019-1-6
博主耗費(fèi)一年時(shí)間編寫的Java進(jìn)階小冊(cè)已經(jīng)上線,覆蓋日常開發(fā)所需大部分技術(shù),且通俗易懂、深入淺出、圖文豐富,需要的同學(xué)請(qǐng)戳:
2021-07-06