Tomcat4.1.24源码分析导引

 

1 前言
Tomcat 是一个 servlet 容器,它是 Java Servlet JavaServer Pages 的官方参考 实现 Tomcat 是在 Apache Software License 开发 布的一个 放源 目。在本文做成 Tomcat 的主要版本是 Tomcat 5.0.2 Alpha 实现 Servlet2.4/JSP2.0 范和 Tomcat4.1.24 实现 Servlet2.3/JSP1.2 范。由于 Tomcat5.x 还处 开发阶 段没有正式 布。所以我 主要分析 Tomcat4.x 版。
Tomcat4.1.24 是最近的 release 版。 Tomcat4.1 是在 Tomcat4.0.x Tomcat3.x 后重写的核心称 Catalina )基 上重构的,在很多方面有 著的增
l 基于 JMX 的管理特性
l 基于 JSP Struts Web admin 管理
l 新的 Coyote 接器 , 支持 HTTP/1.1,AJP1.3 JNI
l 重新 写了 JSP page 编译 Jasper
l 性能表 和内存效率 著的提高
l manager 用程序支持和 开发 工具集成
l build.xml 脚本中自定 Ant 可以和 manger 用程序 生交互
了帮助大家更快地 阅读 和学 Tomcat 的源 ,本文 针对 Tomcat4.1.24 行一些介 ,包括它的基本 构、核心的 象、 简单 的启 求的流程。希望可以帮助大家更好的理解 Tomcat 入到 Tomcat 放源 的世界中。
2 server.xml 配置文件中的结构和概念 [2]
理解 Tomcat 首先要了解的是配置文件 server.xml Tomcat conf/server.xml 文件是最 重要的,通 它可以描述 Tomcat 构和配置 Tomcat 的行 。下面就 对该 文件 行介
server.xml 文件描述了整个 Tomcat 的基本 构, 文件中所有的元素 对应 Tomcat 中核心 象, 件分成下面的几 ,我 们进 简单 的介
l 最高 元素:
表示整个 Catalina Servlet 容器。它是 server.xml 中的根元素。
:表示一个或者多个 Connector 共享一个 Engine 理客 户请 求的 合。一个 server 元素可以包含多个 service 元素。
l 接元素 Connector :表示外部的客 和特定 Service 间发 求(或接受响 )的接口。 JTC Jakarta-Tomcat-Connectors 写。它包括两 不同 型的 Connector 。一 browser 直接 接到 Tomcat ,另一 是通 过连 到其他的 Web Server 实现 。如下的元素都是 接器:
  属于直接 接的 Connector 。是最新的 接器。不再推荐使用。
、、 属于 接其他 Web Server Connector 。是最新的 接器。
l 容器元素 Containers :表示具有 求和 生相 的功能 件。如下的元素都属于容器元素
:表示了在特定的 Catalina Service 中整个 理的机制。它从 Connector 接受 求, 理,然后返回响 Connector 。它可以包含多个 Host 元素。
:表示特定的运行 Tomcat 的网 主机。可以包含多个 Context 元素。
:表示一个具体的 Web 用。运行在指定的虚 主机中。
l 嵌入元素:所有可以嵌入在容器元素中的元素。如下的元素都属于嵌入元素
:表示在 Server 中定 的全局 JNDI
:表示 web 用加 Java 源的特定的 class loader
:表示容器元素 log 信息、 debug 信息和 错误 信息的
:表示 web 建和管理 HTTPsession
:表示容器中 于用 名、密 和角色的数据 信息的 实现
:表示 web 用中的静 态资 源。 源可以被 class HTML JSP 等使用
:表示在容器的 Pipeline 中被 用的 件(有 Pipeline valve 设计 概念下面会有 详细
一是 Catalina 简图 希望可以帮助大家理解
catalina 简图
l 注意:所有在 server.xml 中描述的元素在 Tomcat 实现 中都会有相 java 接口定 和相 实现 ,例如元素在程序中的 实现 包括接口 Server.java 实现 StandardServer.java 。了解 一点 阅读 和理解 Tomcat 的源 非常有帮助。
Catalina 源码分析
3 1 Catalina 核心源码的目录结构
Tomcat4.1.24 包后在 catalina/src/share/org/apache/catalina/ 下包含了 catalina 的源 。( Java 的包名和路径名是 对应 的, 了便于找到源文件我直接使用路径名) 个子目 从命名上就可以猜出它的基本含 ,并且在目 中基本上都有一个 package.html 文件描述了 个目 录对应 的包所完成的主要功能。 刚开 阅读 候,我 可以从 /startup 子目 始。 个包中包含了如何启 Tomcat 。然后可以 始看 /core 包中的文件, 个包 实现 Catalina 的核心 象。 可以 始看在核心 使用的相 功能的具体 实现 些功能都 对应 有相 的包。下面一个小 会介 Catalina 设计 是所使用的一个主要的模式,了解了 个模式 对阅读 和理解 Tomcat 的源 非常的重要。
3 2 Catalina 的主要设计模式
Catalina 设计 中所有的容器元素都派生于抽象的 Container 接口。在 Container 实现 中都会使用一个 Pipeline 象。 Pipeline 象被 Container 用于 实现对 接收到的 理的机制。利用的是 (Chain of Responsibility) 设计 模式 [5][6] Container 把自己的 理功能封装到 Valve 象中,并且把 Valve 象配置到自己的 Pipeline 中。下面具体解 一下。
个模式中主要的使用的是以下的接口: Pipeline Valve ValveContext
Pipeline 接口:定 了当 invoke() 方法被容器 ,一 Valve 序的 用,并且要求在 Pipeline 中的必 存在一个 Valve (通常是最后一个) 对请 理并 生响 ,而不能将 求跳
一个容器都包含一个 Pipeline 例,通 setBasic() 方法,容器自身的 程被封装成容器特定的 Valve ,并且被放在 Pipeline 的最后 行。在自身特定 逻辑 Valve 行前,另外加入的其他功能 Valve 被按照加入的 行。( 个是通 server.xml 文件中配置容器元素中的嵌入元素 实现 的。)
Valve 接口:定 了容器的 件。在 invoke() 方法中 实现 具体的 逻辑
ValveConext 接口:提供了一 机制,使得一个 Valve 可以触 Pipeline 中下一个 Valve 业务处 理,而 这种 机制的 Valve 本身来 是透明的。 ValveContext 例在 Valve invoke() 是作 参数 传递 。( 这种 机制本身 实现 起来是比 较简单 的, ValveContext 实现类 可以通 Pipeline.getValves() 访问 得到所有的 Valve 象,在 invoke() 用后 记录 当前 用的 Valve 象的位置并向下 传递 即可。)
个模式 穿了 Catalina 中所有容器 象的 实现 当中, 二是 个模式中主要接口的 设计 正确的理解 个模式的 实现 设计 可以帮助我 更好的 阅读 Catalina 的源
Catalina Pipeline Valve 的静 态图
Catalina 大量的使用了 Java Event 模型,包括生存期事件、属性 更事件等多 事件。 Java Event 模型 里不多介 了,有 趣的参考下面的文献 [4]
Catalina 中另一个比 需要注意的地方是大量使用了 apache 目中的子 目尤其是 Jakarta Commons 目,例如 Digester,logger 等等。所以了解 Tomcat 中使用的 Commons 关项 目的内容和使用方法是十分有必要的。有 的信息参考下面的文献 [3]
3 3 Catalina 的核心对象
Catalina 的核心 象就是 对应 server.xml 文件的 实现 ,有 的源 catalina/src/share/org/apache/catalina catalina/src/share/org/apache/catalina/core 下。 Server.xml 中的元素都 对应 有相 的接口定 实现 个元素的功能通 过这 java 象得到 实现
Server.xml 中没有描述的一个核心 象是 Wrapper 象,它是与 conf/web.xml 配置文件相 的。 Wrapper 表示通 web.xml 文件定 的独立的 servlet 象。通 Wrapper 的封装,使得我 可以完成 的具体 servlet 象的各 管理的抽象 一接口。 Wrapper 是最小的 件不能再有子容器,它的上 容器可以是 Context 。通 conf/web.xml 文件的配置把 求按照 对应 到特定的 Wrapper 封装的 servlet 实现 理。由于 Wrapper ,所以它不再是前面意 上的容器 象。也没有出 server.xml 配置文件中。
所有的 Container 元素都从 Container 接口派生,嵌入的具体 Valve 功能 件都从 Contained Valve 接口派生。他 构和行 都是相同的,所不同只是在具体的 逻辑处 理上的不同。所以 Catalina 的核心 象在 设计 上有着高度的抽象 一,非常便于分析和理解。 Catalina 核心的主要 象的一个 简单 uml 态图 。从 的方向上看,描述的是接口、 实现 该对 象的 逻辑处 理的 Valve 象以及用于帮助容器 选择 合适的子容器 步处 理的 Mapper 。具体的 实现 可以参考 阅读
Catalina 的核心


3 4 Catalina 的启动
Tomcat 器启 的方式比 较简单 及的 象也比 少。有 的源 catalina/src/share/org/apache/catalina/startup 下。我 可以参考 阅读
Catalina 的启 动对
Tomcat 的启 是通 过创 建一个 Digester 象,解析 server.xml 文件完成有 Tomcat 功能 象加 的, Digester 具体的使用 参考 [5] 。在 些有 关对 象被加 建之后, Catalina Start() 消息, Tomcat 的核心 件启 动进 入服 五是一个 Tomcat 简单时 。在表示用于 理多个 求的工作者 线 程方面有些 化。可以参照 中的 步骤 分析 Tomcat 的源


Tomcat 简单时


3 5 Catalina 的对客户请求的响应
上一小 Tomcat 的基本 程。 一小 Tomcat 如何 理客 端的 求。在 Tomcat 理客 户请 时涉 及到的 象比 多,包括有 户连 接建立的 理、服 务线 程的管理和 求内容的 理。有 关连 接的建立和服 务线 程的管理可以我的文章参考 [7] 有相 的介 里主要介 户请 求的 理。 Tomcat 内部是按照逐 分解的方式 理的。例如: StandardEnigeValve 根据 求所携 server name 信息来 用相 StandardHostValve 步处 理, StandardHostValve 根据 求的 url 中的 context 信息 选择 合适的 StandardContextValve 理,如此 继续 分解,直到最后通 Wrapper 象根据具体的 型和内容 选择 合适的 servlet 提供相 的服 里主要 及的是 Valve Pipeline Mapper Wrapper 个容器在使用 Pipeline,Valve Mapper 流程都是一 的。了解到 一点 的分析大有好 六是一个客 户请 求的 。可以按照它的 步骤 分析 Tomcat 的源


一个客 户请 求的
写在最后
本文主要介 Tomcat 的核心 象的 构和 组织 方式,以及 化的启 理的流程。目的是 给阅读 Tomcat 提供一个起点和思路,所以全文比 较简单 。在 Tomcat 中有很多 java 最新技 的体 用,如 JMX JNDI CLUSTER 和采用 MVC 架构 实现 的管理 用程序等等都 得我 和借 。通 过对 Tomcat 阅读 和研究可以使我 的学 和工作受益良多。
参考文献
[1] Tomcat 目主 http://jakarta.apache.org/tomcat/
[3]Jakarta Commons 目主 http://jakarta.apache.org/commons/
[5] 链设计 模式 http://www.yesky.com/20020415/1606944.shtml
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值