Tomcat的工作原理
- Tomcat的组成
Server:一个Server 元素代表整个Catalina servlet容器. (单例模式设计)
Service:它由一个或者多个Connector组成,以及一个Engine,负责处理所有Connector所获得的客户请求。
Connector:一个Connector将在某个指定端口上侦听客户请求,并将获得的请求交给Engine来处理,从Engine处获得回应并返回客户。
Engine:Engine下可以配置多个虚拟主机Virtual Host,每个虚拟主机都有一个域名。
当Engine获得一个请求时,它把该请求匹配到某个Host上,然后把该请求交给该Host来处理。
Host:虚拟主机,每个虚拟主机和某个网络域名Domain Name相匹配。
Context:一个Context对应于一个Web Application
- server.xml
<!-----------------------------------------------------------------------------------------------> <!-- 启动Server 在端口8005处等待关闭命令 如果接受到"SHUTDOWN"字符串则关闭服务器 --> <Server port="8005" shutdown="SHUTDOWN" debug="0"> <!-- Listener ??? 目前没有看到这里 --> <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" debug="0"/> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" debug="0"/> <!-- Global JNDI resources ??? 目前没有看到这里,先略去 --> <GlobalNamingResources> ... ... ... ... </GlobalNamingResources> <!-- 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"> <!-- 日志类,目前没有看到,略去先 --> <Logger className="org.apache.catalina.logger.FileLogger" .../> <!-- Realm,目前没有看到,略去先 --> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" .../> <!-- 虚拟主机localhost appBase : 该虚拟主机的根目录是webapps/ 它将匹配请求和自己的Context的路径,并把请求转交给对应的Context来处理 --> <Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- 日志类,目前没有看到,略去先 --> <Logger className="org.apache.catalina.logger.FileLogger" .../> <!-- 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.xml
tomcat中的web.xml有两个部分存在:$CATALINA_HOME/conf/web.xml和Web App根目录下的WEB-INF/web.xml。
都是为了部署servlet类的:servlet、servletMapping等。也会部署struts2的filter等。
Tomcat启动的时候,先加载server.xml,然后加载web.xml。
- Tomcat工作流程