【读过的书,留下的迹】深入剖析Tomcat

这本书是基于Tomcat4,Tomcat5作分析的,版本比较老,可作为对Tomcat的一个大致了解,有助于以后对新版Tomcat源码的阅读。

连接器

Tomcat中使用的连接器必须满足以下条件要求

  • 实现org.apache.catalina.Connector接口
  • 负责创建实现了org.apache.catalina.Request接口的request对象
  • 负责创建实现了org.apache.catalina.Response接口的response对象

(1)http1.1的新特性

  • 持久连接:connection: keep-alive
  • 块编码
  • 状态码100的使用

(2)Connector接口

重要方法:

  • getContainer:获取关联servlet容器
  • setContainer:设置关联servlet容器
  • createRequest:
  • createResponse:

(3)一般步骤

  • 连接器监听http请求
  • 生成request和response对象
  • 调用关联的container的invoke(request, response)

servlet容器

servlet容器是用来处理请求servlet资源,并为Web客户端填充response对象的模块。共有4种类型的容器:

  • Engine:表示整个Catalina servlet引擎
  • Host:表示包含一个或多个Context容器的虚拟主机
  • Context:表示一个Web应用程序,一个Context可以有多个Wrapper
  • Wrapper:表示一个独立的servlet

一个容器可以有0个或多个低层级的子容器

(1)管道任务

servlet调用invoke其实是调用servlet容器中的pipeline的invoke方法。

管道包含该servlet容器将要调用的任务,一个阀表示一个具体的执行任务,类似于过滤器链和过滤器。servlet容器会依次调用pipeline中的vavle。

(2)Wrapper接口

Wrapper接口的实现类负责管理其基础servlet类的servlet生命周期,即调用servlet的init(),service(),destroy()方法。

两个重要的接口

  • load:加载并初始化servlet类
  • allocate:分配一个已初始化的servlet实例

(3)一般步骤

  • container.invoke:容器包含一条管道,容器的invoke方法会调用管道的invoke方法
  • pipeline的invoke方法会调用所有添加到其容器中的vavle,然后再调用其basicVavle的invoke方法
  • Context容器的basicVavle使用Mapper查找一个子容器Wrapper,如果找到子容器Wrapper,则调用Wrapper的invoke,重复上述过程
  • Wrapper的basicVavle负责载入相关联的servlet类,并对请求进行响应

生命周期

Tomcat中的组件均实现了Lifecycle的接口,可以实现统一启动/停止组件的功能。

(1)Lifecycle接口

最重要的是start和stop方法,父组件会调用这两个方法,以对该组件启动/关闭

(2)LifecycleEvent类

生命周期事件

(3)LifecycleListener接口

事件监听器,有一个方法:lifecycleEvent(LifecycleEvent event),用来触发event事件

(4)LifecycleSupport辅助类

用来帮助Lifecycle接口管理LifecycleListener监听器

载入器

作用:加载所需的servlet类

为什么需要载入器

  • 安全:限定servlet只允许载入WEB-INF/classes目录及其子目录下的类,和从部署的库到WEB-INF/lib目录载入类
  • 提供自动重载:需要一个线程不断检查servlet类和其他类的文件的时间戳
  • 简单地说
    • 为了在载入类时指定规则
    • 为了缓存已经载入的类
    • 为了实现类的预载入,方便使用

载入器需实现Loader接口

(1)一般步骤

  • WebappLoader创建一个类载入器WebappClassLoader
  • 设置仓库
  • 设置类路径
  • 设置访问权限
  • 启动一个新线程来支持自动重载

Session管理

Tomcat中用Manager接口来管理Session接口

Session的键值对可以存在内存中的HashMap,或者文件,或者数据库中

StandardWrapper

StandardWrapper是Catalina对Wrapper接口的标准化实现

简化版的时序图

Created with Raphaël 2.1.0 Connector Connector StandardContext StandardContext StandardContextPipeline StandardContextPipeline StandardContextValve StandardContextValve StandardWrapper StandardWrapper StandardWrapperValve StandardWrapperValve Servlet Servlet invoke() invoke() invoke() invoke() invoke() allocate() load() init() service()

StandardWrapperValve要完成以下两件事:

  • 执行关联servlet的所有过滤器
  • 调用servlet实例的service方法

StandardContext

  • Context实例表示一个具体的Web应用程序,其中包含一个或多个Wrapper实例
  • Context容器还需其他组件支持,典型的如载入器和Session管理

主要任务:

  • 处理从Conncector中接收到的每个http请求
  • 通过映射器Mapper找到Wrapper
  • 通过Loader载入Servlet
  • 通过Manager对Session进行管理
  • 等等

Host和Engine

Server和Service

Server接口表示Catalina的整个servlet引擎,囊括了所有的组件

  • 启动/关闭整个系统

Server组件包含0个或多个Service组件,Service组件包含多个Connector(处理不同协议)和一个Servlet容器

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页