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 ...
随机推荐
- from * import *(ImportError: No module named *)为什么报错没有这个目录
先说下from * import * 的原理:比如有路径D:\fanbingbing\ai\wo.py这么一个文件,而现在你在D:\fanbingbing\buai\ni.py(别介意这么比喻..(⊙ ...
- memcpy详解
头文件:#include<string.h>函数原型:void *memcpy(void str,const void *s,size_t n); 功能 c和c++使用的内存拷贝函数.从源 ...
- 弗洛伊德算法(Floyd算法)
原博来自http://www.cnblogs.com/skywang12345/ 弗洛伊德算法介绍 和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的 ...
- 第 6 章 —— 依赖项注入(DI)容器 —— Ninject
有些读者只想理解 MVC 框架所提供的特性,而不想介入开发理念与开发方法学.笔者不打算让你改变 —— 这属于个人取向,而且你知道交付优质项目需要的是什么. 建议你至少粗略第看一看本章的内容,以明白哪些 ...
- 最小生成树 - 普里姆 - 边稠密 - O(N ^ 2)
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #define N 1005 #def ...
- 最小生成树 - 克鲁斯卡尔 - 并查集 - 边稀疏 - O(E * logE)
#define _CRT_SECURE_NO_WARNINGS #include<cstdio> #include<cstring> #include<algorithm ...
- OC Copy基本使用(深拷贝和浅拷贝)
首先,什么是copy? Copy的字面意思是“复制”.“拷贝”,是一个产生副本的过程. 常见的复制有:文件复制,作用是利用一个源文件产生一个副本文件. 特点:1.修改源文件的内容,不会影响副本文件: ...
- ShardedJedis的使用
假定有2个 redis 服务实例(A和B)在运行,在客户端进行 set 操作: set a0 xxx set a1 xxx set a2 xxx set a3 xxx 我们希望a0, a1, a2, ...
- 最新版本Firefox表单css兼容性
场景描述: 为了在各浏览器上传控件保持统一的风格,用隐藏“浏览控件”的方式,在最新版本的Firefox下隐藏的“浏览”按钮漂移了. 问题分析: HTML代码: <form class=" ...
- PHP中输出本地时间
<?php header("Content-Type:text/html;charset=utf-8"); // 输出日 echo date("l") . ...