當(dāng)訪問tomcat是,server.xml,web.xml配置著提供服務(wù)器的流程
server.xml文件分析
Tomcat組成分析
Tomcat
Server的組成部分
Service是這樣一個(gè)集合:它由一個(gè)或者多個(gè)Connector組成,以及一個(gè)Engine,負(fù)責(zé)處理所有Connector所獲得的客戶請(qǐng)求
Connector
一個(gè)Connector將在某個(gè)指定端口上偵聽客戶請(qǐng)求,并將獲得的請(qǐng)求交給Engine來處理,從Engine處獲得回應(yīng)并返回客戶
TOMCAT典型的Connector,一個(gè)直接偵聽來自browser的http請(qǐng)求,一個(gè)偵聽來自其它WebServer的請(qǐng)求
Coyote
Http/1.1 Connector 在端口8080處偵聽來自客戶browser的http請(qǐng)求
Coyote JK2 Connector
在端口8009處偵聽來自其它WebServer(Apache)的servlet/jsp代理請(qǐng)求
Coyote SSL HTTP/1.1 Connector 在端口8443處偵聽來自客戶端的SSL安全請(qǐng)求
Engine
Engine下可以配置多個(gè)虛擬主機(jī)Virtual
Host,每個(gè)虛擬主機(jī)都有一個(gè)域名
當(dāng)Engine獲得一個(gè)請(qǐng)求時(shí),它把該請(qǐng)求匹配到某個(gè)Host上,然后把該請(qǐng)求交給該Host來處理Engine有一個(gè)默認(rèn)虛擬主機(jī),當(dāng)請(qǐng)求無法匹配到任何一個(gè)Host上的時(shí)候,將交給該默認(rèn)Host來處理
Host
代表一個(gè)Virtual
Host,虛擬主機(jī),每個(gè)虛擬主機(jī)和某個(gè)網(wǎng)絡(luò)域名Domain Name相匹配
每個(gè)虛擬主機(jī)下都可以部署(deploy)一個(gè)或者多個(gè)Web App,每個(gè)Web
App對(duì)應(yīng)于一個(gè)Context,有一個(gè)Context
path
當(dāng)Host獲得一個(gè)請(qǐng)求時(shí),將把該請(qǐng)求匹配到某個(gè)Context上,然后把該請(qǐng)求交給該Context來處理
匹配的方法是“最長(zhǎng)匹配”,所以一個(gè)path==""的Context將成為該Host的默認(rèn)Context
所有無法和其它Context的路徑名匹配的請(qǐng)求都將最終和該默認(rèn)Context匹配
Context
一個(gè)Context對(duì)應(yīng)于一個(gè)Web
Application,一個(gè)Web
Application由一個(gè)或者多個(gè)Servlet組成
Context在創(chuàng)建的時(shí)候?qū)⒏鶕?jù)配置文件$CATALINA_HOME/conf/web.xml和$WEBAPP_HOME/WEB-INF/web.xml載入Servlet類
當(dāng)Context獲得請(qǐng)求時(shí),將在自己的映射表(mapping
table)中尋找相匹配的Servlet類
如果找到,則執(zhí)行該類,獲得請(qǐng)求的回應(yīng),并返回
|
%TOMCAT_HOME%/conf/web.xml文件分析
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
|
啟動(dòng)服務(wù)器上開始監(jiān)聽,加載默認(rèn)的服務(wù)器默認(rèn)servlet
當(dāng)用戶的HTTP請(qǐng)求無法匹配任何一個(gè)servlet的時(shí)候,該servlet被執(zhí)行
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
當(dāng)請(qǐng)求的是一個(gè)JSP頁(yè)面的時(shí)候(*.jsp)該servlet被調(diào)用
它是一個(gè)JSP編譯器,將請(qǐng)求的JSP頁(yè)面編譯成為servlet再執(zhí)行
|
Tomcat Server處理一個(gè)http請(qǐng)求的過程
|
假設(shè)我的虛擬主機(jī)和站點(diǎn)信息配置如下
<Host name="www.braden.com" appBase="e:\sohu">
<Context path="/" docBase="e:\www\braden\mail" />
</Host
來自客戶的請(qǐng)求為:
http://www.braden.com:8080/braden/hello.jsp
1) 請(qǐng)求被發(fā)送到本機(jī)端口8080,被在那里偵聽的Coyote HTTP/1.1 Connector獲得
2)
Connector把該請(qǐng)求交給它所在的Service的Engine來處理,并等待來自Engine的回應(yīng)
3) Engine獲得請(qǐng)求
www.braden.com:8080/braden/hello.jsp ,匹配它所擁有的所有虛擬主機(jī)Host
4)
Engine匹配到名為www.braden.com的Host(如果不匹配,則匹配該Engine的默認(rèn)主機(jī))
<Engine name="Catalina" defaultHost="localhost">
5) www.braden.com Host獲得請(qǐng)求 /braden/hello.jsp ,匹配它所擁有的所有Context
6) Host匹配到路徑為/braden的Context(如果匹配不到就把該請(qǐng)求交給路徑名為""的Context去處理)
7) path="/braden"的Context獲得請(qǐng)求/hello.jsp,在它的mapping table中尋找對(duì)應(yīng)的servlet
8) Context匹配到URL PATTERN為*.jsp的servlet,對(duì)應(yīng)于JspServlet類,如果找不到對(duì)應(yīng)的servlet類,把請(qǐng)求轉(zhuǎn)交給默認(rèn)servlet處理
9) 構(gòu)造HttpServletRequest對(duì)象和HttpServletResponse對(duì)象,作為參數(shù)調(diào)用JspServlet的doGet或doPost方法
10)Context把執(zhí)行完了之后的HttpServletResponse對(duì)象返回給Host
11)Host把HttpServletResponse對(duì)象返回給Engine
12)Engine把HttpServletResponse對(duì)象返回給Connector
13)Connector把HttpServletResponse對(duì)象返回給客戶browser
其中還有DNS的解析過程和tomcat的得到請(qǐng)求信息和發(fā)出響應(yīng)信息的過程,這里就不描述了