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 ...
随机推荐
- jenkins+python+kubectl实现批量更新k8s镜像
一.jenkins使用官方镜像(官方镜像默认是jenkins用户,权限太低) 因此通过dockerfile重新改为root启动 FROM jenkins/jenkins:lts MAINTAINER ...
- 2-18,19 搭建MySQL主从服务器并并通过mysql-proxy实现读写分离
MySQL主从服务器 实现方式: MySQL REPLICATION Replication可以实现将数据从一台数据库服务器(master)复制到一台或多台数据库服务器(slave) 默认情况下这种 ...
- android webservice 成功版(帅哥)
package com.ts.xtweatherreport01;import java.io.UnsupportedEncodingException; import android.annotat ...
- Leetcode 73
class Solution { public: void setZeroes(vector<vector<int>>& matrix) { vector<vec ...
- dubbo provider如何对invoker进行export
如何把provider的invoker export出去:1)为原始对象加wrapper,生成invoker:2)给invoker加各种filter,启动监听服务:3)注册服务地址 以HelloSer ...
- redis写入数据被转义问题
1.phpredis扩展写入redis的数据发现“ \ 会被自动转义成\" \\. 如: 写入 dadaf"daf\dad 在redis命令行读出为 dadaf\"da ...
- Awk 从入门到放弃(5)– Awk模式(Pattern)之一
转:http://www.zsythink.net/archives/1426
- 工作中遇到的oracle分页查询问题及多表查询相关
在工作中,有时,我们会用到oracle分页查询.这时,就需要先了解oracle的rownum.rowmun是oracle的伪列,只能用符号(<.<=.!=),而不能用这些符号(>,& ...
- 大数据技术Hadoop面试题
1. 下面哪个程序负责 HDFS 数据存储.答案C datanode a)NameNodeb)Jobtrackerc)Datanode d)secondaryNameNodee)tasktracker ...
- 使用存储过程非常慢,但是直接执行SQL很快
使用存储过程非常慢,但是直接执行SQL很快. 了解基本情况后,初步判断是参数嗅探问题 在对应的SQL语句后面使用 OPTION(OPTIMIZE FOR UNKNOWN) 参考了 http://www ...