当tomcat的Conector保存着StandardService实例,而StandardService保存着Container的实例

当Http11NioProcessor.process()方法内调用getAdapter.service(request,response)时会调用CoyoteAdapter.service()

上面会调用请求对应的container的方法。

在这之前有必要说下Container的初始化。

在StandardService的initInternal()中会执行Container.init方法。这个开始的container表示StandardEngine,从Catalina.createDigester方法详细理解可以知道

先调用构造方法

/**
* Create a new StandardEngine component with the default basic Valve.
*/
public StandardEngine() { super();
pipeline.setBasic(new StandardEngineValve());
/* Set the jmvRoute using the system property jvmRoute */
try {
setJvmRoute(System.getProperty("jvmRoute"));
} catch(Exception ex) {
log.warn(sm.getString("standardEngine.jvmRouteFail"));
}
// By default, the engine will hold the reloading thread
backgroundProcessorDelay = ; }

创建一个StandardEngine组件,为管道StandardPipeLine对象设置Basic,Basic即Vlave阀门对象,用于处理请求的对象。设置为StandardEngineValve()

同样的,StandardEngine的Valve对象为StandardEngineValve

在源码中也可以看到StandardHost的为:StandardHostValve,StandardContext的为:StandardContextValve,StandardWrapper的为:StandardWrapperValve

connector.getService().getContainer().getPipeline().getFirst().invoke(request, response)

Pipeline管道,getFirst()获得的是Pipeline存放的第一个Valve对象。Valve阀门。---------这些类的名字取得很形象

管道连通着所有阀门,当水从供水局(有这个部门吗?)到我们的房子时候,首先要从水源处被抽水机抽到水处理厂,然后水处理厂收到请求信息(要将水放到城市里的哪个位置,这里即Host),水处理厂就会通过放水进入管道,而接受方就是城市的某个区,这时流到区的水经过区阀门处理转发到特定的村,村里又通过村子的阀门将水转发到特定的房子中,房子中就开始可以任意处置水了。

上面水到具体房子过程,跟请求处理转发过程相似。

Http11NioProcessor类对请求进行包装处理。通过CoyoteAdapter通过管道请求转发到第一个阀门中,然后又找到其下属StandardHost,StandardHostValve阀门又将请求转发到StandardContextValve上下文对象的阀门中进行对应的处理后继续转发到StandardWrapperValve阀门。StandardWrapperValve类对应的是一个Servlet类,这里就会对请求进行具体处理了。

到这里就告一段落了,发现源码里还有很多我不认识的它,深究我就输了,再见!

最新文章

  1. T4模版生成多个实体文件时,提示找不到 Host
  2. 在.bashrc文件中定义函数
  3. Spring IoC — 基于注解的配置
  4. Get-ChildItem参数之 -Exclude,Filter,Recurse应用
  5. Ruby简介,附带示例程序
  6. Hierarchy Viewr 配合 adb 命令 查看窗口属性
  7. servlet中访问mysql无法包含中文的解决
  8. 执行CMD命令
  9. Mysql int(11) 和 int(1)
  10. PyconChina2015丁来强Pydata Ecosystem
  11. 添加xml文件编辑语法提示
  12. 一个完整的PHP类包含的七种语法说明
  13. python之面向对象2
  14. Xcode7.3.1中通过最新的CocoaPod安装pop动画引擎
  15. Perl进程间通信
  16. C语言检测指定文件是否存在的代码
  17. 【BZOJ】3022: [Balkan2012]The Best Teams
  18. 『TensorFlow』从磁盘读取数据
  19. memset()函数
  20. BZOJ 4767 两双手

热门文章

  1. MySQL Yum存储库 安装、升级、集群
  2. Robotframework-Appium 之常用API(二)
  3. 20155339 2016-2017-2 《Java程序设计》第9周学习总结
  4. MyEclipse2014中Java类右键Run as没有JUnit Test
  5. AbpZero之企业微信---登录(拓展第三方auth授权登录)---第一步:查看AbpZero的auth第三方登录的底层机制
  6. Wpf 导出CSV文件
  7. From Alpha to Gamma (I)
  8. 批处理系列(18) - 基于BitLocker的开锁上锁
  9. Eclipse (JavaEE版)中修改web项目的访问路径
  10. Day 25 多态.