StandardHost及UML类图:

1、StandardHost类是Host接口的默认实现;其继承自ContainerBase类,说明他也是一个容器类,既然是容器类,那肯定也有管道对象PipeLine和阀门,其基础阀门(Basic Valve)的实现类是org.apache.catalina.core.StandardHostValve,ErrorReportValve和ErrorDispatcherValve类作为管道对象中的错误处理阀门;

2、当客户端的请求Request要在Host中查找到相应的Context处理请求时,就需要使用mapper对象处理,StandardHost中的mapper实现类是org.apache.catalina.core.StandardHostMapper;当ContainerBase.start启动时会调用addDefaultmapper添加默认的映射器,也就会调用到StandardHost.addDefaultmapper方法:

此处的mapperClass的内容就是org.apache.catalina.core.StandardHostMapper;

3、StandardHost继承自ContainerBase类,也就实现了LifeCycle接口,在其start方法中将ErrorReportValve和ErrorDispatcherValve阀门添加到管道对象中,在其invoke方法调用中总是先调用Basic Valve后再调用PipeLine中的阀门:

4、在ApplicationContext的getResource方法中会去获取资源路径,其中就使用到了Host的getName方法,因此Context至少要配置一个Host(除非自己重新实现一个ContextConfig对象);

Standardhost处理请求流程:

1、客户端的请求Request在Connector中封装好后传递给StandardHost.invoke方法,由于StandardHost没有实现invoke方法,因此invoke会调用到其父类ContainerBase.invoke方法,然后调用管道对象里面的基础阀门StandardHostValve.invoke方法;

2、StandardHostValve.invoke调用StandardHost.map(request, update)方法,由于StandardHost没有实现这个原型的map方法,因此调用了ContainerBase.map方法,在ContainerBase.map中根据协议类型(http)查找到对应的mapper对象(findMapper查找时,由于Standardhost中已经将StandardHostMapper作为默认mapper对象添加到Host中,因此findMapper会返回该mapper对象);

3、StandardHostMapper.map方法基本没做什么处理,获取到Request的URI信息后就到StandardHost中去查找对应的Context对象(findChild),StandardHost.children变量中存储了ContextName和Context对象的映射关系,而Context.name属性就是取的该Context.path属性,因此在StandardHost.map方法中直接拿路径到children中取查找对应的Context对象:

4、在StandardHost中查找到对应的Context后,直接调用Context.invoke方法交由Context对象去处理;

StandardEngine及UML类图:

1、Engine容器也就是tomcat的servlet引擎,StandardEngine类是Engine接口的默认实现;当部署tomcat时需要支持多个虚拟机的话,就需要使用engine容器,事实上,一般情况下,部署的tomcat都会使用一个Engine容器;

2、StandardEngineValve类作为StandardEngine类的基础阀门(Basic Valve),其invoke方法负责查找出对应的Host出来并交由host处理;

StandardEngine处理请求流程:

1、与上面的StandardHost的请求处理相同,客户端请求Request到达StandardEngine.invoke,再到达ContainerBase.invoke,最后到达StandardEngineValve阀门的invoke方法,在这里调用Engine.map方法,由于StandardEngine没有实现map方法,因此传递到了ContainerBase的map方法中,首先调用findMapper查找映射器,由于StandardEngine实现了addDefaultMapper方法添加默认的映射器StandardEngineMapper,因此findMapper会返回StandardEngineMapper映射器实例;

2、在StandardEngineMapper.map方法里面,首先根据请求Request获取到HostName,然后在根据HostName查找得到对应的Host对象;

可以看到在查找Host时,首先根据HostName在Children的哈希表中查找名称为HostName的Host对象,如果没有查找到,则判断遍历所有Host对象,如果有Host对象的别名与HostName相同,则返回该Host实例,如果这样还没找到,则直接返回默认Host对象处理;

3、得到Host对象后将请求直接转给Host.invoke处理;

tomcat源码阅读之StandardHost和StandardEngine的更多相关文章

  1. Tomcat源码阅读(二)初始化

    近来,我开始阅读tomcat的源码,感觉还挺清晰易懂:为了方便理解,我参考了网上的一些文章,把tomcat的组成归纳一下:整个tomcat的组成如下图所示: Tomcat在接收到用户请求时,将会通过以 ...

  2. tomcat源码阅读

    1      工具准备 需要SVN.Maven.JDK.Eclipse.Eclipse M2插件 2      下载源码及发布包 源码在这里:http://svn.apache.org/repos/a ...

  3. tomcat源码阅读之过滤器

    一.Servlet过滤器: 1.介绍: Servlet过滤器本身并不生成请求和响应对象,它只提供过滤作用. Servlet过滤器能够在Servlet被调用之前检查Request对象,修改Request ...

  4. tomcat源码阅读之SingleThreadModel

    一.接口简介: 实现了SingleThreadModel接口的servlet类只能保证在同一时刻,只有一个线程执行该servlet实例的service方法,在tomcat实现中会创建多个servlet ...

  5. tomcat源码阅读之载入器(Loader)

    一.Java类的载入器: 双亲委派模型: 1.JVM提供了三种类型的类加载器:引导类载入器(bootstrap class loader).扩展类载入器(extension class loader) ...

  6. tomcat源码阅读之BackupManager

    一. 配置: <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOpti ...

  7. tomcat源码阅读之部署器

    我们知道web应用是用Context实例表示的,而Context是部署到Host实例中的,因此tomcat的部署器是关联的Host实例.Context实例可以用WAR文件部署,也可以把整个web应用的 ...

  8. tomcat源码阅读之安全机制

    一.领域(Realm): 1.Principal接口代表角色信息,包含了三个成员:用户名.密码.role列表(以逗号分隔),对应了tomcat-users.xml文件中一行user信息: Generi ...

  9. tomcat源码阅读之集群

    一. 配置: 在tomcat目录下的conf/Server.xml配置文件中增加如下配置: <!-- Cluster(集群,族) 节点,如果你要配置tomcat集群,则需要使用此节点. clas ...

随机推荐

  1. NOJ-1581 筷子 (线性DP)

    题目大意:有n支筷子,已知长度,定义一双筷子的质量等于长度的平方差,问能否分成k双?若能,输出所有筷子的最小质量和. 题目分析:先将筷子按长度从小到大排序,定义状态dp(i,j)表示将前 i 支筷子分 ...

  2. mobilebone.js-mobile移动web APP单页切换骨架

    昨天看到张鑫旭前辈发了一条微博,便互动了下,是他的一个开源移动端框架,没事看看,这是效果

  3. Prism 4 文档 ---第11章 部署Prism应用程序

        要成功移动Prism应用到生产中,需要对部署计划为应用程序的设计过程的一部分.本章介绍了注意事项和你需要采取的准备以部署应用程序,以及你要在用户手中获得部署程序所需要采取的行动.     Si ...

  4. Python Django 之 Template 模板语言简介

    一.什么事模板语言 html+逻辑控制语句 二.模板语言的作用 帮助前端处理后端发来的数据,方便前端展示(杂糅渲染) 三.模板语言语法 1.{{变量}} 变量使用双大括号{{}} 2.万能的句点号. ...

  5. 面试题2:单例模式Singleton

    首先,单例模式使类在程序生命周期的任何时刻都只有一个实例, 然后,单例的构造函数是私有的,外部程序如果想要访问这个单例类的话, 必须通过 getInstance()来请求(注意是请求)得到这个单例类的 ...

  6. js解码编码decodeURI与decodeURIComponent区别

    ###decodeURI与decodeURIComponent区别 1. 概念: URI: Uniform ResourceIdentifiers,通用资源标识符 Global对象的encodeURI ...

  7. nested exception is java.sql.SQLException: Incorrect string value: '\xE7\x99\xBB\xE9\x99\x86...' for column 'image' at row 1

    HTTP Status 500 - Hibernate operation: could not insert: [cn.itcast.shop.product.vo.Product]; uncate ...

  8. 玩转X-CTR100 l STM32F4 l W25Q64 SPI串行FLASH存储

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器 板载FLA ...

  9. 玩转X-CTR100 l STM32F4 l 基础例程printf、LED、蜂鸣器、拨码开关、位带操作

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器基础板载资源 ...

  10. http指定状态码

    Http状态代码 1.指定状态码: setStatus HttpServletResponse的setStatus方法.如果响应的状态代码比较特殊,并且伴有相关的文档内容,那么一定要在用PrintWr ...