Tomcat启动过程

Tomcat启动过程

Tomcat是一个基于组件的服务器,它的构成组件都是可配置的,其中最外层的是Catalina servlet容器,其他组件按照一定的格式要求配置在这个顶层容器中。
Tomcat的各种组件都是在Tomcat安装目录下的/conf/server.xml文件中配置的。

Tomcat部署web应用程序的时候先读取全局的conf/web.xml,创建然后再读取web应用程序中的WEB-INF/web.xml。全局设置会应用于所有的web应用程序,web程序的WEB-INF/web.xml仅仅应用于当前web程序本身。如果没有web.xml Tomcat会输出找不到的消息,但是一样会部署并使用Web用用程序,但是最好还是需要每一个web应用程序都有web.xml配置文件。

这个是Tomcat启动的一个图解,但是比较复杂,我们要看的只是StandardServer——StandardService——Connector(连接器)和Container(容器)——Engine(引擎)加上HOST(虚拟主机)和Context(上下文)——最后是我们要部署的Webapp项目

这里Connector创建HttpServletRequest请求,在CoyoteAdapter中处理成HttpServletRequest,在此之前接收的是org.apache.coyote.Request 和 org.apache.coyote.Response类型的,这个方法就是请求对象、响应对象和套接字进行信息交互的地方,也就是真真正正将套接字中的信息转化为请求信息,还要把响应信息写到套接字中。

参考昨天的Tomcat的容器结构

1.Tomcat启动是由Bootstrap作对外界的启动类,然后它创建Catalina的实例,然后对其初始化和启动

2.Catalina解析全局的server.xml文件,然后创建Server、Service、Engine、Host:

Tomcat的server.xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
   ……

   ……

   <Service name="Catalina">
       <Connector URIEncoding="utf-8" port="8080" protocol="HTTP/1.1"
                  connectionTimeout="20000"
                  redirectPort="8443" />
       <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
       <Engine name="Catalina" defaultHost="localhost">
           <Realm className="org.apache.catalina.realm.LockOutRealm">
               <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                      resourceName="UserDatabase"/>
           </Realm>
           <Host name="localhost"  appBase="webapps"
                 unpackWARs="true" autoDeploy="true">
               <Context path="/test" docBase="test" reloadable="true"/>
               <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                      prefix="localhost_access_log" suffix=".txt"
                      pattern="%h %l %u %t &quot;%r&quot; %s %b" />
           </Host>
       </Engine>
   </Service>
</Server>

Server:即StandardServer,代表的是整个容器,一个tomcat里一个Server,包含一个或者多个Service

Service:即StanderdService,一个Service只有一个Container(容器)和一个Engine(引擎),但是可以包含一个或者多个Connerctor(连接器),它把Connector组件绑定到一个单独的Engine上,这两个都是在解析conf/servcice.xml的时候创建的。负责处理所有Connector所获得的客户请求。

tomcat的两大组件Connector和Container:

Connector就是接收连接请求然后分配线程让Container处理

Connector:连接器,它会在指定的端口上监听客户请求,接收浏览器发过来的TCP请求,然后执行创建Request和create对象(用于和请求交换数据),然后会产生一个线程来处理这个请求,把产生的request和response对象传给Engine,然后Engine再匹配Host,再匹配到它所拥有的Context(配置里path=“/path”),然后就会根据web,xml配置找出对应的Servlet,Servlet就会构造出实现Http协议的Servlet,根据传参来决定实行doGet或者doPost方法,再执行后面程序里的业务逻辑和db交互等等。

“Tomccat7默认连接器是类org.apache.catalina.connector.Connector.连接器的作用是等待引入的HTTP请求,创建request对象和response对象,然后调用org.apache.catalina.Container接口的invoke方法将request和response传递给servlet容器.在invoke方法内部,servlet容器会载入相应的servlet类,调用其service方法,管理session对象,记录错误消息等操作.”

Container:容器,也是Tomcat中的容器接口,它一共有四个子接口(子容器),Engine、Host,Context,Wrapper和一个默认的实现类ContainerBase,这四个子容器都有一个对应的StandXXX实现类,都继承自ContainerBase,Base又间接继承LifecycleBase,然后LifecycleBase又会继承Lifecycle(Lifecycle接口是一个公用的接口,定义了组件生命周期的一些方法,用于启动、停止Catalina组件)

Engine:即StanderdEngine(标准实现),是service引擎,每个service只有一个ServletEngine,一个引擎可以包含多个Host,它只是定义了一些基本的关联关系,表示一个特定的Service的请求处理流水线,引擎从连接器接收和处理所有的请求,将响应返回给适合的连接器,通过连接器传输给用户。

Host:StandardHost,代表一个Virtual Host,也就是虚拟主机,然后每个虚拟主机下都可以部署一个或者多个WebApp,每个web项目对应一个Context(StandardContext)上下文,StandardContext是tomcat中最大的一个类。它封装的是每个web项目。

Context:代表 Servlet 的 Context,每个Context对应一个web程序。它具备了 Servlet 运行的基本环境,理论上只要有 Context 就能运行 Servlet 了。简单的 Tomcat 可以没有 Engine 和 Host。Context 最重要的功能就是管理它里面的 Servlet 实例,Servlet 实例在 Context 中是以 Wrapper 出现的,它根据web.xml配置来创建Servlet,Servlet的生命周期可以看下昨天的日报。

图解:

图残了……

也就是说:

一个Tomcat里一个Server,包含多个Service,一个Service只有一个Container容器、一个Engine引擎和多个Container,然后Engine可以有多个Host主机/站点,然后每个虚拟主机下可以有多个Context,每个Context就代表一个或者多个web应用,也就是封装我们web项目里的Servlet

Server由Catalina管理,管理Server的生命周期。

具体的参数传递:Tomcat是如何将请求一步步传递到我们编写的HttpServlet类中的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值