1.1 - Server
A Server element represents the entire Catalina servlet container. (Singleton)
1.2 - Service
A Service element represents the combination of one or more Connector components that share a single Engine
Serviceæ˜¯è¿™æ ·ä¸€ä¸ªé›†åˆï¼šå®ƒç”±ä¸€ä¸ªæˆ–者多个Connector¾l„æˆåQŒä»¥åŠä¸€ä¸ªEngineåQŒè´Ÿè´£å¤„ç†æ‰€æœ‰Connector所获得的客戯‚¯·æ±?br />
1.3 - Connector
一个Connectorž®†åœ¨æŸä¸ªæŒ‡å®šç«¯å£ä¸Šä¾¦å¬å®¢æˆ¯‚¯·æ±‚,òq¶å°†èŽ·å¾—çš„è¯·æ±‚äº¤¾l™Engineæ¥å¤„ç†ï¼Œä»ŽEngineå¤„èŽ·å¾—å›žåº”åÆˆ˜q”回客户
TOMCAT有两个典型的ConnectoråQŒä¸€ä¸ªç›´æŽ¥ä¾¦å¬æ¥è‡ªbrowserçš„httpè¯äh±‚åQŒä¸€ä¸ªä¾¦å¬æ¥è‡ªå…¶å®ƒWebServer的请æ±?br />Coyote Http/1.1 Connector 在端å?080处侦嬿¥è‡ªå®¢æˆ·browserçš„httpè¯äh±‚
Coyote JK2 Connector 在端å?009处侦嬿¥è‡ªå…¶å®ƒWebServer(Apache)çš„servlet/jsp代ç†è¯äh±‚
1.4 - Engine
The Engine element represents the entire request processing machinery associated with a particular Service
It receives and processes all requests from one or more Connectors
and returns the completed response to the Connector for ultimate transmission back to the client
Engine下å¯ä»¥é…¾|®å¤šä¸ªè™šæ‹Ÿä¸»æœºVirtual HoståQŒæ¯ä¸ªè™šæ‹Ÿä¸»æœºéƒ½æœ‰ä¸€ä¸ªåŸŸå?br />当Engine获得一个请求时åQŒå®ƒæŠŠè¯¥è¯äh±‚匚w…到æŸä¸ªHostä¸Šï¼Œç„¶åŽæŠŠè¯¥è¯äh±‚交给该Hostæ¥å¤„ç?br />Engineæœ‰ä¸€ä¸ªé»˜è®¤è™šæ‹Ÿä¸»æœºï¼Œå½“è¯·æ±‚æ— æ³•åŒ¹é…到ä»ÖM½•一个Host上的时候,ž®†äº¤¾l™è¯¥é»˜è®¤Hostæ¥å¤„ç?br />
1.5 - Host
Â
代表一个Virtual HoståQŒè™šæ‹Ÿä¸»æœºï¼Œæ¯ä¸ªè™šæ‹Ÿä¸ÀLœºå’ŒæŸä¸ªç½‘¾lœåŸŸåDomain Name相匹é…?br />æ¯ä¸ªè™šæ‹Ÿä¸ÀLœºä¸‹éƒ½å¯ä»¥éƒ¨çÖv(deploy)一个或者多个Web AppåQŒæ¯ä¸ªWeb App对应于一个ContextåQŒæœ‰ä¸€ä¸ªContext path
当Host获得一个请求时åQŒå°†æŠŠè¯¥è¯äh±‚匚w…到æŸä¸ªContextä¸Šï¼Œç„¶åŽæŠŠè¯¥è¯äh±‚交给该Contextæ¥å¤„ç?br />匚w…的方法是“最长匹é…â€ï¼Œæ‰€ä»¥ä¸€ä¸ªpath==""çš„Contextž®†æˆä¸ø™¯¥Host的默认Context
æ‰€æœ‰æ— æ³•å’Œå…¶å®ƒContextçš„èµ\径å匚w…的请求都ž®†æœ€¾lˆå’Œè¯¥é»˜è®¤Context匚w…
1.6 - Context
一个Context对应于一个Web ApplicationåQŒä¸€ä¸ªWeb Applicationç”׃¸€ä¸ªæˆ–者多个Servlet¾l„æˆ
Context在创建的时候将æ ÒŽ®é…置文äšg$CATALINA_HOME/conf/web.xmlå’?WEBAPP_HOME/WEB-INF/web.xml载入Servlet¾c?br />当Context获得è¯äh±‚æ—Óž¼Œž®†åœ¨è‡ªå·±çš„æ˜ ž®„表(mapping table)ä¸å¯»æ‰„¡›¸åŒšw…çš„Servlet¾c?br />如果扑ֈ°åQŒåˆ™æ‰§è¡Œè¯¥ç±»åQŒèŽ·å¾—è¯·æ±‚çš„å›žåº”åQŒåƈ˜q”回
该文件æ˜qîCº†å¦‚何å¯åЍTomcat Server
Â
一个Context对应于一个Web AppåQŒæ¯ä¸ªWeb App是由一个或者多个servlet¾l„æˆçš?br />当一个Web App被åˆå§‹åŒ–的时候,它将用自å·Þqš„ClassLoader对象载入“部¾|²é…¾|®æ–‡ä»¶web.xmlâ€ä¸å®šä¹‰çš„æ¯ä¸ªservlet¾c?br />它首先è²å…¥åœ¨$CATALINA_HOME/conf/web.xmlä¸éƒ¨¾|²çš„servlet¾c?br />ç„¶åŽè½½å…¥åœ¨è‡ªå·Þqš„Web Appæ ¹ç›®å½•ä¸‹çš„WEB-INF/web.xmlä¸éƒ¨¾|²çš„servlet¾c?br />web.xmlæ–‡äšg有两部分åQšservlet¾cÕd®šä¹‰å’Œservletæ˜ å°„å®šä¹‰
æ¯ä¸ªè¢«è²å…¥çš„servlet¾c»éƒ½æœ‰ä¸€ä¸ªåå—,且被填入该Contextçš„æ˜ ž®„表(mapping table)ä¸ï¼Œå’ŒæŸ¿UURL PATTERN对应
当该Context获得è¯äh±‚æ—Óž¼Œž®†æŸ¥è¯¢mapping tableåQŒæ‰¾åˆ°è¢«è¯äh±‚çš„servletåQŒåƈ执行以获得请求回åº?br />
分æžä¸€ä¸‹æ‰€æœ‰çš„Contextå…׃ínçš„web.xmlæ–‡äšgåQŒåœ¨å…¶ä¸å®šä¹‰çš„servlet被所有的Web App载入
Â
å‡è®¾æ¥è‡ªå®¢æˆ·çš„è¯·æ±‚äØ“åQ?br />http://localhost:8080/wsota/wsota_index.jsp
<!----------------------------------------------------------------------------------------------->
<web-app>
<!-- 概述åQ?br /> 该文件是所有的WEB APPå…Þq”¨çš„部¾|²é…¾|®æ–‡ä»Óž¼Œ
æ¯å½“一个WEB APP被DEPLOYåQŒè¯¥æ–‡äšg都将先被处ç†åQŒç„¶åŽæ‰æ˜¯WEB APP自己çš?WEB-INF/web.xml
-->
<!-- +-------------------------+ -->
<!-- | servlet¾cÕd®šä¹‰éƒ¨åˆ? | -->
<!-- +-------------------------+ -->
<!-- DefaultServlet
当用æˆïLš„HTTPè¯äh±‚æ— æ³•åŒšw…ä»ÖM½•一个servlet的时候,该servlet被执è¡?br /> 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ä¸å®šä¹‰çš„æ—¶å€?br /> 该servlet被调用,把匿åservletæ˜ å°„æˆ?servlet/ClassNameçš„åÅžå¼?br /> 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åQ‰è¯¥servlet被调ç”?br /> 它是一个JSP¾~–译器,ž®†è¯·æ±‚çš„JSP™åµé¢¾~–译æˆäØ“servlet冿‰§è¡?br /> 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>
<!-- +------------------------+ -->
<!-- | 其它部分åQŒç•¥åŽÕd…ˆ | -->
<!-- +------------------------+ -->
... ... ... ...
</web-app>
<!----------------------------------------------------------------------------------------------->
<!----------------------------------------------------------------------------------------------->
<!-- å¯åЍServer
在端å?005处ç‰å¾…å…³é—命ä»?br /> 如果接å—åˆ?SHUTDOWN"å—ç¬¦ä¸²åˆ™å…³é—æœåŠ¡å™?br /> -->
<Server port="8005" shutdown="SHUTDOWN" debug="0">
<!-- Listener ???
ç›®å‰æ²¡æœ‰çœ‹åˆ°˜q™é‡Œ
-->
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" debug="0"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" debug="0"/>
<!-- Global JNDI resources ???
ç›®å‰æ²¡æœ‰çœ‹åˆ°˜q™é‡ŒåQŒå…ˆç•¥åŽ»
-->
<GlobalNamingResources>
... ... ... ...
</GlobalNamingResources>
<!-- Tomcat的Standalone Service
Service是一¾l„Connector的集å?br /> 它们å…Þq”¨ä¸€ä¸ªEngineæ¥å¤„ç†æ‰€æœ‰Connector收到的请æ±?br /> -->
<Service name="Tomcat-Standalone">
<!-- Coyote HTTP/1.1 Connector
className : 该Connector的实现类是org.apache.coyote.tomcat4.CoyoteConnector
port : 在端å£å·8080处侦嬿¥è‡ªå®¢æˆ·browserçš„HTTP1.1è¯äh±‚
minProcessors : 该Connector先创å»?个线½E‹ç‰å¾…客戯‚¯·æ±‚,æ¯ä¸ªè¯äh±‚ç”׃¸€ä¸ªçº¿½E‹è´Ÿè´?br /> maxProcessors : 当现有的¾U¿ç¨‹ä¸å¤ŸæœåŠ¡å®¢æˆ·è¯äh±‚æ—Óž¼Œè‹¥çº¿½E‹æ€ÀL•°ä¸èƒö75个,则创建新¾U¿ç¨‹æ¥å¤„ç†è¯·æ±?br /> acceptCount : 当现有线½E‹å·²¾l达到最大数75æ—Óž¼Œä¸ºå®¢æˆ¯‚¯·æ±‚排é˜?br /> 当队列ä¸è¯äh±‚æ•°è¶…˜q?00æ—Óž¼ŒåŽæ¥çš„请求返回Connection refused错误
redirectport : 当客戯‚¯·æ±‚是httpsæ—Óž¼ŒæŠŠè¯¥è¯äh±‚转å‘到端å?443åŽ?br /> 其它属性略
-->
<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è¯äh±‚
它将匚w…è¯äh±‚和自å·Þqš„虚拟ä¸ÀLœºåQŒåƈ把请求è{交给对应的Hostæ¥å¤„ç?br /> 默认虚拟ä¸ÀLœºæ˜¯localhost
-->
<Engine name="Standalone" defaultHost="localhost" debug="0">
<!-- 日志¾c»ï¼Œç›®å‰æ²¡æœ‰çœ‹åˆ°åQŒç•¥åŽÕd…ˆ -->
<Logger className="org.apache.catalina.logger.FileLogger" .../>
<!-- RealmåQŒç›®å‰æ²¡æœ‰çœ‹åˆŽÍ¼Œç•¥åŽ»å…?-->
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" .../>
<!-- 虚拟ä¸ÀLœºlocalhost
appBase : è¯¥è™šæ‹Ÿä¸»æœºçš„æ ¹ç›®å½•æ˜¯webapps/
它将匚w…è¯äh±‚和自å·Þqš„Contextçš„èµ\径,òq¶æŠŠè¯äh±‚转交¾l™å¯¹åº”çš„Contextæ¥å¤„ç?br /> -->
<Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true">
<!-- 日志¾c»ï¼Œç›®å‰æ²¡æœ‰çœ‹åˆ°åQŒç•¥åŽÕd…ˆ -->
<Logger className="org.apache.catalina.logger.FileLogger" .../>
<!-- ContextåQŒå¯¹åº”于一个Web App
path : 该Contextçš„èµ\å¾„åæ˜?"åQŒæ•…该Context是该Host的默认Context
docBase : 该Contextçš„æ ¹ç›®å½•æ˜¯webapps/mycontext/
-->
<Context path="" docBase="mycontext" debug="0"/>
<!-- å¦å¤–一个ContextåQŒèµ\å¾„åæ˜?wsota -->
<Context path="/wsota" docBase="wsotaProject" debug="0"/>
</Host>
</Engine>
</Service>
</Server>
<!----------------------------------------------------------------------------------------------->