<!-- 啓動Server 在端口8005處等待關閉命令 若是接受到"SHUTDOWN"字符串則關閉服務器 --> <Server port="8005" shutdown="SHUTDOWN" debug="0"> ...... <!-- Tomcat的Standalone Service Service是一組Connector的集合 它們共用一個Engine來處理全部Connector收到的請求 --> <Service name="Tomcat-Standalone"> <!-- Coyote HTTP/1.1 Connector className : 該Connector的實現類是org.apache.coyote.tomcat4.CoyoteConnector port : 在端口號8080處偵聽來自客戶browser的HTTP1.1請求 minProcessors : 該Connector先建立5個線程等待客戶請求,每一個請求由一個線程負責 maxProcessors : 當現有的線程不夠服務客戶請求時,若線程總數不足75個,則建立新線程來處理請求 acceptCount : 當現有線程已經達到最大數75時,爲客戶請求排隊 當隊列中請求數超過100時,後來的請求返回Connection refused錯誤 redirectport : 當客戶請求是https時,把該請求轉發到端口8443去 其它屬性略 --> <Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="8080" minProcessors="5" maxProcessors="75" acceptCount="100" enableLookups="true" redirectPort="8443" debug="0" connectionTimeout="20000" useURIValidationHack="false" disableUploadTimeout="true" /> <!-- Engine用來處理Connector收到的Http請求 它將匹配請求和本身的虛擬主機, 並把請求轉交給對應的Host來處理默認虛擬主機是localhost --> <Engine name="Standalone" defaultHost="localhost" debug="0"> <!-- 虛擬主機localhost appBase : 該虛擬主機的根目錄是webapps/ 它將匹配請求和 本身的Context的路徑,並把請求轉交給對應的Context來處理 --> <Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- Context,對應於一個Web App path : 該Context的路徑名是"",故該Context是該Host的 默認Context docBase : 該Context的根目錄是webapps/mycontext/ --> <Context path="" docBase="mycontext" debug="0"/> <!-- 另一個Context,路徑名是/wsota --> <Context path="/wsota" docBase="wsotaProject" debug="0"/> </Host> </Engine> </Service> </Server>
<web-app> <!-- 概述: 該文件是全部的WEB APP共用的部署配置文件, 每當一個WEB APP 被DEPLOY,該文件都將先被處理,而後纔是WEB APP本身的/WEB-INF/web.xml --> <!-- +-------------------------+ --> <!-- | servlet類定義部分 | --> <!-- +-------------------------+ --> <!-- DefaultServlet 當用戶的HTTP請求沒法匹配任何一個servlet的時候,該servlet被執行 URL PATTERN MAPPING : / --> <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> <!-- InvokerServlet 處理一個WEB APP中的匿名servlet 當一個servlet被編寫並編譯放入 /WEB-INF/classes/中,卻沒有在/WEB-INF/web.xml中定義的時候 該servlet被調用,把匿名servlet映射成/servlet/ClassName的形式 URL PATTERN MAPPING : /servlet/* --> <servlet> <servlet-name>invoker</servlet-name> <servlet-class>org.apache.catalina.servlets.InvokerServlet </servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <!-- JspServlet 當請求的是一個JSP頁面的時候(*.jsp)該servlet被調用 它是一個JSP編譯器,將請求的JSP頁面編譯成爲servlet再執行 URL PATTERN MAPPING : *.jsp --> <servlet> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> <init-param> <param-name>logVerbosityLevel</param-name> <param-value>WARNING</param-value> </init-param> <load-on-startup>3</load-on-startup> </servlet> <!-- +---------------------------+ --> <!-- | servlet映射定義部分 | --> <!-- +---------------------------+ --> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.jsp</url-pattern> </servlet-mapping> <!-- +------------------------+ --> <!-- | 其它部分,略去先 | --> <!-- +------------------------+ --> ... ... ... ... </web-app>
假設來自客戶的請求爲:web
http://localhost:8080/wsota/wsota_index.jspapache
1) 請求被髮送到本機端口8080,被在那裏偵聽的Coyote HTTP/1.1 Connector得到
2) Connector把該請求交給它所在的Service的Engine來處理,並等待來自Engine的迴應
3) Engine得到請求localhost/wsota/wsota_index.jsp,匹配它所擁有的全部虛擬主機Host
4) Engine匹配到名爲localhost的Host(即便匹配不到也把請求交給該Host處理,由於該Host被定義爲該Engine的默認主機)
5) localhost Host得到請求/wsota/wsota_index.jsp,匹配它所擁有的全部Context
6) Host匹配到路徑爲/wsota的Context(若是匹配不到就把該請求交給路徑名爲」"的Context去處理)
7) path=」/wsota」的Context得到請求/wsota_index.jsp,在它的mapping table中尋找對應的servlet
8) Context匹配到URL PATTERN爲*.jsp的servlet,對應於JspServlet類
9) 構造HttpServletRequest對象和HttpServletResponse對象,做爲參數調用JspServlet的doGet或doPost方法
10)Context把執行完了以後的HttpServletResponse對象返回給Host
11)Host把HttpServletResponse對象返回給Engine
12)Engine把HttpServletResponse對象返回給Connector
13)Connector把HttpServletResponse對象返回給客戶browsertomcat