Tomcat工作原理詳解
阿新 • • 發佈:2019-01-01
該檔案描述瞭如何啟動TomcatServer
<!----------------------------------------------------------------------------------------------->
<web-app>
<!-- 概述:
該檔案是所有的WEBAPP共用的部署配置檔案,
每當一個WEBAPP被DEPLOY,該檔案都將先被處理,然後才是WEBAPP自己的/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
處理一個WEBAPP中的匿名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><!-- 啟動Server
在埠8005處等待關閉命令
如果接受到"SHUTDOWN"字串則關閉伺服器
--><Serverport="8005" shutdown="SHUTDOWN" debug="0">
<!-- Listener ???
目前沒有看到這裡
--> <ListenerclassName="org.apache.catalina.mbeans.ServerLifecycleListener"debug="0"/>
<ListenerclassName="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"debug="0"/>
<!-- Global JNDI resources ???
目前沒有看到這裡,先略去
--> <GlobalNamingResources>
... ... ... ...
</GlobalNamingResources>
<!-- Tomcat的StandaloneService
Service是一組Connector的集合
它們共用一個Engine來處理所有Connector收到的請求
--> <Servicename="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時,後來的請求返回Connectionrefused錯誤
redirectport: 當客戶請求是https時,把該請求轉發到埠8443去
其它屬性略
--> <ConnectorclassName="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
--> <Enginename="Standalone" defaultHost="localhost"debug="0">
<!-- 日誌類,目前沒有看到,略去先--> <LoggerclassName="org.apache.catalina.logger.FileLogger".../> <!-- Realm,目前沒有看到,略去先--> <RealmclassName="org.apache.catalina.realm.UserDatabaseRealm" .../>
<!-- 虛擬主機localhost
appBase : 該虛擬主機的根目錄是webapps/
它將匹配請求和自己的Context的路徑,並把請求轉交給對應的Context來處理
--> <Host name="localhost"debug="0" appBase="webapps" unpackWARs="true"autoDeploy="true">
<!-- 日誌類,目前沒有看到,略去先--> <LoggerclassName="org.apache.catalina.logger.FileLogger" .../>
<!-- Context,對應於一個Web App
path : 該Context的路徑名是"",故該Context是該Host的預設Context
docBase : 該Context的根目錄是webapps/mycontext/
--> <Contextpath="" docBase="mycontext" debug="0"/>
<!-- 另外一個Context,路徑名是/wsota--> <Contextpath="/wsota" docBase="wsotaProject"debug="0"/> </Host> </Engine></Service></Server>
<!----------------------------------------------------------------------------------------------->
<web-app>
<!-- 概述:
該檔案是所有的WEBAPP共用的部署配置檔案,
每當一個WEBAPP被DEPLOY,該檔案都將先被處理,然後才是WEBAPP自己的/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
處理一個WEBAPP中的匿名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><!-- 啟動Server
在埠8005處等待關閉命令
如果接受到"SHUTDOWN"字串則關閉伺服器
--><Serverport="8005" shutdown="SHUTDOWN" debug="0">
<!-- Listener ???
目前沒有看到這裡
--> <ListenerclassName="org.apache.catalina.mbeans.ServerLifecycleListener"debug="0"/>
<ListenerclassName="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"debug="0"/>
<!-- Global JNDI resources ???
目前沒有看到這裡,先略去
--> <GlobalNamingResources>
... ... ... ...
</GlobalNamingResources>
<!-- Tomcat的StandaloneService
Service是一組Connector的集合
它們共用一個Engine來處理所有Connector收到的請求
--> <Servicename="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時,後來的請求返回Connectionrefused錯誤
redirectport: 當客戶請求是https時,把該請求轉發到埠8443去
其它屬性略
--> <ConnectorclassName="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
--> <Enginename="Standalone" defaultHost="localhost"debug="0">
<!-- 日誌類,目前沒有看到,略去先--> <LoggerclassName="org.apache.catalina.logger.FileLogger".../> <!-- Realm,目前沒有看到,略去先--> <RealmclassName="org.apache.catalina.realm.UserDatabaseRealm" .../>
<!-- 虛擬主機localhost
appBase : 該虛擬主機的根目錄是webapps/
它將匹配請求和自己的Context的路徑,並把請求轉交給對應的Context來處理
--> <Host name="localhost"debug="0" appBase="webapps" unpackWARs="true"autoDeploy="true">
<!-- 日誌類,目前沒有看到,略去先--> <LoggerclassName="org.apache.catalina.logger.FileLogger" .../>
<!-- Context,對應於一個Web App
path : 該Context的路徑名是"",故該Context是該Host的預設Context
docBase : 該Context的根目錄是webapps/mycontext/
--> <Contextpath="" docBase="mycontext" debug="0"/>
<!-- 另外一個Context,路徑名是/wsota--> <Contextpath="/wsota" docBase="wsotaProject"debug="0"/> </Host> </Engine></Service></Server>