1. 程式人生 > >網站開發進階(四)Tomcat Server處理一個http請求的過程

網站開發進階(四)Tomcat Server處理一個http請求的過程

Tomcat Server處理一個http請求的過程

 

假設來自客戶的請求為:

http://localhost:8080/wsota/wsota_index.jsp

1) 請求被髮送到本機埠8080,被在那裡偵聽的Coyote HTTP/1.1 Connector獲得

2) Connector把該請求交給它所在的ServiceEngine來處理,並等待來自Engine的迴應

3) Engine獲得請求localhost/wsota/wsota_index.jsp,匹配它所擁有的所有虛擬主機Host

4) Engine匹配到名為localhostHost(即使匹配不到也把請求交給該Host處理,因為該Host

被定義為該Engine的預設主機)

5) localhost Host獲得請求/wsota/wsota_index.jsp,匹配它所擁有的所有Context

6) Host匹配到路徑為/wsotaContext(如果匹配不到就把該請求交給路徑名為""Context去處理)

7) path="/wsota"Context獲得請求/wsota_index.jsp,在它的mapping table中尋找對應的servlet

8) Context匹配到URL PATTERN*.jspservlet,對應於JspServlet

9) 構造HttpServletRequest物件和HttpServletResponse

物件,作為引數呼叫JspServletdoGetdoPost方法

10)Context把執行完了之後的HttpServletResponse物件返回給Host

11)HostHttpServletResponse物件返回給Engine

12)EngineHttpServletResponse物件返回給Connector

13)ConnectorHttpServletResponse物件返回給客戶browser

<Connector>元素

<Connector port="8088" protocol="HTTP/1.1" 

    connectionTimeout="20000"

redirectPort="8443"

URIEncoding="GBK" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"/>

<Connector>元素由Connector介面定義.<Connector>元素代表與客戶程式實際互動的給件,它負責接收客戶請求,以及向客戶返回響應結果一個“Connector”(聯結器)代表一個請求被接收和應答所需要的端點。每個聯結器通過相關的“Container”(容器)處理請求。

<Host>元素

<Host name="www.weimingcloud.cn"  appBase="webapps/lmapp"

   unpackWARs="true" autoDeploy="true"

   xmlValidation="false" xmlNamespaceAware="false">

它由Host介面定義.一個Engine元素可以包含多個<Host>元素.每個<Host>的元素定義了一個虛擬主機.它包含了一個或多個Web應用

注: name是虛擬主機的名字,appBase是虛擬主機指向的目錄,Tomcat啟動時,會自動載入appBase下的應用。 unpackWARs表示是否自動解壓縮appBase下已打成WAR包的應用,autoDeploy表示在伺服器執行的時候,將一個應用放入 appBase下,是否自動部署。 

<Context>元素

<Context path="" docBase="." reloadable="true" debug="0"> </Context>

<Context path="/lmapp/files" docBase="e:\webfiles_root\lmapp" reloadable="true" debug="0">

</Context>

它由Context介面定義.是使用最頻繁的元素.每個<Context>元素代表了執行在虛擬主機上的單個Web應用.一個<Host>可以包含多個<Context>元素.每個web應用有唯一的一個相對應的Context代表web應用自身.

path : Context的路徑名是"",故該Context是該Host的預設Context

docBase : Context的根目錄是webapps/mycontext/

reloadable:如果這個屬性設為true, Tomcat伺服器在執行狀態下會監視在WEB-INF/classesWeb-INF/lib目錄CLASS檔案的改運.如果監視到有class檔案被更新,伺服器自重新載入Web應用

useNaming:指定是否支援JNDI,預設值為了true 

cookies指定是否通過Cookies來支援Session,預設值為true

<Service>元素

  <Service name="Catalina">

 <Connector port="8088" protocol="HTTP/1.1" 

connectionTimeout="20000" redirectPort="8443" URIEncoding="GBK" maxThreads="150"  minSpareThreads="25" maxSpareThreads="75"/>

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

 <Engine name="Catalina" defaultHost="localhost"> </Engine>

  </Service>

該元素由org.apache.catalina.Service介面定義,它包含一個<Engine>元素,以及一個或多個<Connector>,這些Connector元素共享用同一個Engine元素.  

redirectPort 指定伺服器正在處理http請求時收到了一個SSL傳輸請求後重定向的埠號

   <Service name="Catalina">

   <Service name="Apache">

第一個<Service>處理所有直接由Tomcat伺服器接收的web客戶請求.

第二個<Service>處理所有由Apahce伺服器轉發過來的Web客戶請求 .

注:Server元素下可以有多個Service,埠就是在Service元素下配置的。

 其中protocal制定了該埠偵聽的協議型別,HTTP/1.1表示偵聽的是客戶的HTTP請求,即我們通過瀏覽器訪問需要輸入的埠,當埠號是80的時候,可以不用在瀏覽器位址列輸入埠號,這就是我們訪問很多網站不需要指定埠的原因。有時候protocal沒有指定,這時候預設的是HTTP/1.1。注意這個埠必須是閒置的。

Service元素下必須有一個Engine元素,Engine有一個名稱,和一個預設的虛擬主機名。

附:

Tomcat 是一款優秀的JSP/Servlet容器,最初由SUN開發,後來被貢獻給了Apache社群。