tomcat源码阅读之StandardHost和StandardEngine
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的更多相关文章
- Tomcat源码阅读(二)初始化
近来,我开始阅读tomcat的源码,感觉还挺清晰易懂:为了方便理解,我参考了网上的一些文章,把tomcat的组成归纳一下:整个tomcat的组成如下图所示: Tomcat在接收到用户请求时,将会通过以 ...
- tomcat源码阅读
1 工具准备 需要SVN.Maven.JDK.Eclipse.Eclipse M2插件 2 下载源码及发布包 源码在这里:http://svn.apache.org/repos/a ...
- tomcat源码阅读之过滤器
一.Servlet过滤器: 1.介绍: Servlet过滤器本身并不生成请求和响应对象,它只提供过滤作用. Servlet过滤器能够在Servlet被调用之前检查Request对象,修改Request ...
- tomcat源码阅读之SingleThreadModel
一.接口简介: 实现了SingleThreadModel接口的servlet类只能保证在同一时刻,只有一个线程执行该servlet实例的service方法,在tomcat实现中会创建多个servlet ...
- tomcat源码阅读之载入器(Loader)
一.Java类的载入器: 双亲委派模型: 1.JVM提供了三种类型的类加载器:引导类载入器(bootstrap class loader).扩展类载入器(extension class loader) ...
- tomcat源码阅读之BackupManager
一. 配置: <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOpti ...
- tomcat源码阅读之部署器
我们知道web应用是用Context实例表示的,而Context是部署到Host实例中的,因此tomcat的部署器是关联的Host实例.Context实例可以用WAR文件部署,也可以把整个web应用的 ...
- tomcat源码阅读之安全机制
一.领域(Realm): 1.Principal接口代表角色信息,包含了三个成员:用户名.密码.role列表(以逗号分隔),对应了tomcat-users.xml文件中一行user信息: Generi ...
- tomcat源码阅读之集群
一. 配置: 在tomcat目录下的conf/Server.xml配置文件中增加如下配置: <!-- Cluster(集群,族) 节点,如果你要配置tomcat集群,则需要使用此节点. clas ...
随机推荐
- HDU-1232 畅通工程 (并查集、判断图中树的棵数)
Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相 ...
- sgu101 欧拉路径 难度:1
101. Domino time limit per test: 0.25 sec. memory limit per test: 4096 KB Dominoes – game played wit ...
- POJ 3352 Road Construction 双联通分量 难度:1
http://poj.org/problem?id=3352 有重边的话重边就不被包含在双连通里了 割点不一定连着割边,因为这个图不一定是点连通,所以可能出现反而多增加了双连通分量数的可能 必须要用割 ...
- 51nod1210
题解: 二维树状数组,再矩阵推一下 代码: #include<bits/stdc++.h> using namespace std; typedef long long LL; ; int ...
- Python 数据类型--Bytes类型
一.Bytes类型 在Python3以后,字符串和bytes类型彻底分开了.字符串是以字符为单位进行处理的,bytes类型是以字节为单位处理的. bytes数据类型在所有的操作和使用甚至内置方法上和字 ...
- (转载)Java 自动装箱与拆箱、equals和==的比较
什么是自动装箱拆箱 基本数据类型的自动装箱(autoboxing).拆箱(unboxing)是自J2SE 5.0开始提供的功能. 一般我们要创建一个类的对象实例的时候,我们会这样: Class a = ...
- C#实现生产消费者模式
void test() { int count = 0; // 临界资源区 var queue = new BlockingCollection<string>(); // 生产者线程 T ...
- L1-010 比较大小
本题要求将输入的任意3个整数从小到大输出. 输入格式: 输入在一行中给出3个整数,其间以空格分隔. 输出格式: 在一行中将3个整数从小到大输出,其间以“->”相连. 输入样例: 4 2 8 输出 ...
- DevExpress v18.1新版亮点——WinForms篇(二)
用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress WinForms v18.1 的新功能,快来下载试用新版本! ...
- juery 安全加固 集合
来源 jquery升级坑 2 3 4 5 版本 相关源码分享 新建document jquery ajax使用说明 最近在iteye的新闻中看到jQuery已经更新到了1.6.1. 和 ...