Tomcat原理学习---主机(host)和引擎(engine)

如果需要在一个Tomcat部署中部署多个上下文,需要使用一个主机。理论上,当只有一个上下文容器的时候不需要主机,正如org.apache.catalina.Context接口中描述的那样。 
    上下文容器的父容器是主机,但是可能有一些其它实现,没有必要的时候也可以忽略。


    引擎表示整个Catalina 的Servlet引擎。如果使用的话,它位于容器等级的最高层。可以添加到引擎上的容器包括org.apache.catalina.Host 或者org.apache.catalina.Context。在一个Tomcat部署中,默认的容器是引擎。在该部署中,引擎只有一个主机,默认主机。 




    Host 接口 :
    主机是用org.apache.catalina.Host接口表示的。本接口继承了Container接口


    StandardHost 类:
    org.apache.catalina.core.StandardHost类是对Host接口的标准实现。该继承了org.apache.catalina.core.ContainerBase类并实现了Host接口和Deployer接口


    跟StandardContext和StandardWrapper类相似,StandardHost类的构造函数在它的流水线中添加一个基本阀门
    public StandardHost() { 
 super(); 
 pipeline.setBasic(new StandardHostValve()); 

该阀门的类型为org.apache.catalina.core.StandardHostValve。 
当它的start方法被调用的时候,StandardHost上面添加两个阀门:
ErrorReportValve 和 ErrorDispatcherValve。它们都在org.apache.catalina.valves包中


对于每一个请求,都会调用主机的invoke方法。由于StanardHost类并没有实现invoke方法,所以会调用它的父类ContainerBase类的invoke方法。该invoke方法会转而调用StandardHost 的基本阀门StandardHostValve的invoke方法


在Tomcat4中,StandardHostVavle 的invoke 方法调用ContainerBase的map方法,它由转而调用StandardHost的map方法。在Tomcat5中,没有映射器组件,适当的上下文由请求对象获得。




StandardHostMapper 类:
在Tomcat4中,StandardHost的父类ContainerBase使用addDefaultMapper方法创建一个默认映射器。默认映射器的类型由mapperClass属性指定。


StandardHost定义mapperClass变量如下: 
private String mapperClass = "org.apache.catalina.core.StandardHostMapper"; 
另外,StandardHost类的start方法在它的最后调用super.start(),这样保证了创建一个默认的映射器。 


注意:
start方法调用addDefaultMapper来传递mapperClass变量
Tomcat4中的standardContext使用了不同的方法来创建一个默认映射器。它的start方法中并没有调用super.start()。相反Standardcontext的


StandardHostMapper中最重要的方法是map方法。map方法仅仅是简单的调用了Host 的map方法。 




StandardHostValve 类 :
org.apache.catalina.core.StandardHostValve类是StandardHost的基本阀门类型。当有HTTP请求的时候会调用它的invoke方法:
在Tomcat4中的invoke方法中调用StandardHost的map方法来获得一个合适的上下文。
Invoke方法解析来得到一个Session对象并调用它的access方法, access方法更新它的最后进入时间,这里是
org.apache.catalina.session.StandardSession类中的access方法。 
public void access() { 
 this.isNew = false;   this.lastAccessedTime = this.thisAccessedTime; 
 this.thisAccessedTime = System.currentTimeMillis(); 

最后,invoke方法调用上下文容器的invoke 方法,让上下文来处理请求.




为什么 Host 是必须的:
一个Tomcat部署必须有一个主机如果该上下文使用ContextConfig来配置。
ContextConfig需要应用文件web.xml的位置,它在它的applicationConfig方法中尝试打开该文件.
简单的说,除非你自己写ContextConfig类,否则你必须有一个主机


StandardEngine 类 :
类org.apache.catalina.core.StandardEngine是Engine接口的标准实现,跟StandardContext和StandardHost相比,StandardEngine类相对较小。初始化的时候,StandardEngine类需要添加一个基本阀门,下面是该类构造函数: 
public StandardEngine() { 
 super(); 
 pipeline.setBasic(new StandardEngineValve()); 

在Container容器的顶层,StandardEngine可以有子容器,它的子容器必须是主机(host)。如果你尝试给它添加一个非主机容器,会产生异常。
由于位于容器的顶层,所以引擎不能有父容器,当你尝试给引擎设置父容器的时候会产生异常


StandardEngineValve 类 :
org.apache.catalina.core.StandardEngineValve是StandardEngine的基本阀门.


在验证了请求对象和响应对象之后, invoke方法获得一个Host实例来处理请求。
它得到主机的方法是调用引擎的map方法。一旦获得了一个主机,它的invoke方法将会被调用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值