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工作流程

  

  •   
原文地址:https://www.cnblogs.com/lxq0309/p/3673080.html