客戶端用戶點(diǎn)擊瀏覽器服務(wù)連接,瀏覽器通過客戶端底層服務(wù)通過路由傳送報文,目標(biāo)服務(wù)器獲取解析報文,Tomcat監(jiān)聽程序觸發(fā)處理請求
一、Tomcat 軟件目錄結(jié)構(gòu)及功能
- bin: 服務(wù)相關(guān)腳本,例如:啟動、關(guān)閉等
- conf: 存放不同的配置文件,列如:server.xml、web.xml
- lib: tomcat 運(yùn)行需要的庫文件
- logs: 運(yùn)行的日志文件
- webApps: web部署的根目錄
- work :存放jsp編譯后的class文件
二、server分析系統(tǒng)結(jié)構(gòu)
1、server
提供一個接口讓其它程序能夠訪問到這個 Service 集合、同時要維護(hù)它所包含的所有 Service 的生命周期,包括如何初始化、如何結(jié)束服務(wù)、如何找到別人要訪問的 Service
2、service
service 是server下一個集合,service包含多個接收請求的connector并有一個處理所有連接的容器container
3、connector
connector 作用是監(jiān)聽客戶端請求,并將請求封裝提交container處理,然后將處理結(jié)果返回客戶端
tomcat有兩個典型的connector,一個用來監(jiān)聽瀏覽器的http,另一個是用來監(jiān)聽webservice
Coyote Http/1.1 Connector 在端口8080處偵聽來自客戶browser的http請求
Coyote AJP/1.3 Connector 在端口8009處偵聽來自其它WebServer(Apache)的servlet/jsp代理請求
4、container
4.1 Engine
- Engine下可以配置多個虛擬主機(jī)Virtual Host,每個虛擬主機(jī)都有一個域名
- 當(dāng)Engine獲得一個請求時,它把該請求匹配到某個Host上,然后把該請求交給該Host來處理
- Engine有一個默認(rèn)虛擬主機(jī),當(dāng)請求無法匹配到任何一個Host上的時候,將交給該默認(rèn)Host來處理
4.2 Host
- 代表一個Virtual Host,虛擬主機(jī),每個虛擬主機(jī)和某個網(wǎng)絡(luò)域名Domain Name相匹配
- 每個虛擬主機(jī)下都可以部署(deploy)一個或者多個Web App,每個Web App對應(yīng)于一個Context,有一個Context path。
- 當(dāng)Host獲得一個請求時,將把該請求匹配到某個Context上,然后把該請求交給該Context來處理。
- 匹配的方法是“最長匹配”,所以一個path==""的Context將成為該Host的默認(rèn)Context。
- 所有無法和其它Context的路徑名匹配的請求都將最終和該默認(rèn)Context匹配。
4.3 Context
- 一個Context對應(yīng)于一個Web Application,一個Web Application由一個或者多個Servlet組成。
- Context在創(chuàng)建的時候?qū)⒏鶕?jù)配置文件WEBAPP_HOME/WEB-INF/web.xml載入Servlet類。
- 當(dāng)Context獲得請求時,將在自己的映射表(mapping table)中尋找相匹配的Servlet類,如果找到,則執(zhí)行該類,獲得請求的回應(yīng),并返回。
5、Context的部署配置文件web.xml的說明
- 一個Context對應(yīng)于一個Web App,每個Web App是由一個或者多個servlet組成的
- 當(dāng)一個Web App被初始化的時候,它將用自己的ClassLoader對象載入“部署配置文件web.xml”中定義的每個servlet類
- 它首先載入在$CATALINA_HOME/conf/web.xml中部署的servlet類
- 然后載入在自己的Web App根目錄下的WEB-INF/web.xml中部署的servlet類
- web.xml文件有兩部分:servlet類定義和servlet映射定義
- 每個被載入的servlet類都有一個名字,且被填入該Context的映射表(mapping table)中,和某種URL PATTERN對應(yīng)
- 當(dāng)該Context獲得請求時,將查詢mapping table,找到被請求的servlet,并執(zhí)行以獲得請求回應(yīng)
- 分析一下所有的Context共享的web.xml文件,在其中定義的servlet被所有的Web App載入
三、例子
Tomcat Server處理一個http請求的過程
假設(shè)來自客戶的請求為:
http://localhost:8080/wsota/wsota_index.jsp
請求被發(fā)送到本機(jī)端口8080,被在那里偵聽的Coyote HTTP/1.1 Connector獲得
- Connector把該請求交給它所在的Service的Engine來處理,并等待來自Engine的回應(yīng)
- Engine獲得請求localhost/wsota/wsota_index.jsp,匹配它所擁有的所有虛擬主機(jī)Host
- Engine匹配到名為localhost的Host(即使匹配不到也把請求交給該Host處理,因為該Host被定義為該Engine的默認(rèn)主機(jī))
- localhost Host獲得請求/wsota/wsota_index.jsp,匹配它所擁有的所有Context
- Host匹配到路徑為/wsota的Context(如果匹配不到就把該請求交給路徑名為""的Context去處理)
- path="/wsota"的Context獲得請求/wsota_index.jsp,在它的mapping table中尋找對應(yīng)的servlet
- Context匹配到URL PATTERN為*.jsp的servlet,對應(yīng)于JspServlet類
- 構(gòu)造HttpServletRequest對象和HttpServletResponse對象,作為參數(shù)調(diào)用JspServlet的doGet或doPost方法
- Context把執(zhí)行完了之后的HttpServletResponse對象返回給Host
- Host把HttpServletResponse對象返回給Engine
- Engine把HttpServletResponse對象返回給Connector
- Connector把HttpServletResponse對象返回給客戶browser