在上篇文章中,我们已经成功将Tomcat6.0的源
代码导入到Eclipse
IDE中。现在我们就开始学习Tomcat源码。Tomcat源代码共有1000多个java类,代码行数大约28万到30万行左右。从项目规模上说,可
算得上是一个中型项目。要学习理解Tomcat源代码,我们有多种办法可行。最原始的一种办法就是,打开Debugger,逐行跟踪,看看Tomcat如
何启动,如何处理客户端请求,如何编译动态jsp页面。第二种办法是利用逆向工程,把Tomcat的总体类图先描绘出来,然后再结合sequence
diagram,来学习理解它。我们在这里采取从顶到底的阅读方法,先了解整体架构,然后逐步细化。所谓“纲举目张”,说的就是这个道理。首先,我们可以从功能的角度将Tomcat源代码分成5个子模块,它们分别是:
1) Jsper子模块
这个子模块负责jsp页面的解析,jsp属性的验证,同时也负责将jsp页面动态转换为java代码并编译成class文件。在Tomcat源代码中,凡是属于org.apache.jasper包及其子包中的源代码都属于这个子模块;
2) Servlet和Jsp规范的实现模块
这个子模块的源代码属于javax.servlet包及其子包,如我们非常熟悉的javax.servlet.Servlet接口、javax.servet.http.HttpServlet虚类及javax.servlet.jsp.HttpJspPage就位于这个子模块中;
3) Catalina子模块
这个子模块包含了所有以org.apache.catalina开头的java源代码。该子模块的任务是规范Tomcat的总体架构,定义了Server、Service、Host、Connector、Context、Session及Cluster等关键组件及这些组件的实现,这个子模块大量运用了Composite设计模式。同时也规范了Catalina的启动及停止等事件的执行流程。从代码阅读的角度看,这个子模块是我们阅读和学习的重点。
4) Connectors子模块
如果说上面三个子模块实现了Tomcat应用服务器的话,那么这个子模块就是Web服务器的实现。所谓连接器(Connector)就是一个连接客户和应用服务器的桥梁,它接收用户的请求,并把用户请求包装成标准的Http请求(包含协议名称,请求头Head,请求方法是Get还是Post等等)。同时,这个子模块还按照标准的Http协议,负责给客户端发送响应页面,比如在文件没有发现时,服务器给客户端浏览器发送标准的Http 404错误响应页面。
Tomcat实现了两类连接器,除了上述实现了Http1.1协议的Coyote连接器外,还有一种JK连接器,这种连接器是将Tomcat和第三方Web服务器(如Apache或IIS Web服务器)连接起来, Tomcat此时充当应用服务器的角色,负责处理和解释Jsp及Servlet请求。
Coyote连接器的源代码位于以org.apache.coyote开头的包中,JK连接器的代码位于以org.apache.jk开头的包中。
另外,Tomcat虽然实现了Web服务器的功能,但是其实现不是非常完美,效率不高,所以在生产环境中,我们通常要将Tomcat和Apache Web Server配合使用,尽量利用它们各自的优势。
5) Resource子模块
这个子模块包含一些资源文件,如Server.xml及Web.xml配置文件。严格说来,这个子模块不包含java源代码,但是它还是Tomcat编译运行所必需的。
上面我们从模块组件的角度,简单介绍了Tomcat的子模块划分及其相应的功能。下面我们简单以图示意之。
从上面的Tomcat子模块示意图中,我们可以看到,来自客户端的请求首先由Connector子模块进行处理,然后根据情况或者发送到第三方的Web服务器,或者转发到Jsper模块进行处理,或者转发到Jsp/Servlet子模块处理。总体说来,Tomcat通过下面三种方式处理来自客户端的请求:
(1) 如果客户端发出静态页面请求,如果没有配置第三方Web服务器,此时客户端的请求直接交由Coyote Connector子模块处理,然后返回结果;如果配有第三方应用服务器,那么客户的请求直接由第三方应用服务器响应,然后返回静态记过页面。客户端请求的执行过程如图中绿线所示。
(2) 如果客户端请求Jsp页面,该请求首先转发到发送Coyote连接器(在没有配置第三方Web服务器的情况下),或者经过第三方Web服务器将客户请求转发到JK连接器;然后该Jsp请求将交给Jsper子模块处理,Jsper将根据情况验证编译该Jsp页面,最后由Jsp/Servlet模块对客户请求进行处理。Jsp请求处理完毕,服务器首先把响应结果发送给连接器子模块,连接器子模块根据情况或将响应结果页面发送到第三方Web服务器,或者直接发送响应结果页面到客户端。
(3) 如果客户请求Servlet,Tomcat的处理流程和Jsp页面的请求执行流程基本类似,只不过少了一个Jsper子模块处理罢了。
分享到:
相关推荐
整体架构图 Service接口 Server接口 生命周期接口Lifecycle
Tomcat源码剖析 : 整体架构 层层分析 源码解析 架构分析 (Http服务器功能:Socket通信(TCP/IP)、解析Http报文 Servlet容器功能:有很多Servlet(自带系统级Servlet+自定义Servlet),Servlet处理具体的业务逻辑...
详细介绍Tomcat的内存架构,Servlet容器的开发。tomcat是一个很大的系统,有复杂的结构,想要了解它,就应该顺着开发者设计之初的思路来,先了解整体的结构,对整体有了一定的掌控后,再逐个分析,了解感兴趣的细节...
相同点: 1. Tomcat和Jetty都是一种Servlet引擎,他们都支持标准的servlet规范和JavaEE的规范。 ...Tomcat的架构是基于容器设计的,进行扩展是需要了解Tomcat的整体设计结构,不易扩展。
详细的介绍了Tomcat 服务器的整体架构,是份好东西。
该资料讲述了五大方面: 1. Web应用服务器 2. tomcat整体架构 3. 源码解读 4. 性能优化 5. 常见问题排查方法
文档为tomcat8.5的学习笔记,从宏观的整体架构,到各个组件的介绍,以及组件之间的关联。
掌握核心架构课程,课程由一线大厂的工程师带领同学们总览设计模式,然后进阶到核心的Spring源码级分析课程。课程还包括了创建型模式讲解,结构型模式介绍,行为模式与Spring框架的整体流程。同时可贵的是没有进行...
3.2.2服务器(Tomcat端)整体框架 15 3.2.3商家后台(网页版)买卖整体框架 16 3.3架构讲解 17 3.3.1客户端(android手机端) 17 3.3.2服务器端(Tomcat) 18 3.3.3商家后台(网页版) 18 3.4数据库表视图 18 3.5所需的开发...
4.1整体架构 6 4.2系统结构设计 6 4.3功能模块设计 7 4.4系统安全设计 8 4.5表单字段校验处理设计 8 4.6系统维护设计 8 4.7数据库设计 8 4.7.1数据库设计概述 8 4.7.2概念设计 9 4.7.3逻辑设计 9 4.7.3物理设计 9 第...
AscotShop商城系统
4.1整体架构 4.2系统建模 4.3 数据仓库设计 第5章 系统实现 5.1基本论述 5.2主页面的实现 5.3登录分块的实现 5.4管理员管理分块的实现 5.5藏品管理分块的实现 5.6类别管理分块的实现 5.7藏品保管管理分块的实现 5.8...
这个是本人做的毕业设计,题目叫做基于SSH框架的论坛的设计与实现,集成了Struts2.3.4 Spring3.2 Hibernate4.1.9 Junit4 ,服务器用的是tomcat7.0 开发工具用的是MyEclipse10 数据库用的是MySQL5.5 整体架构为三层...
一、功能描述 ... 后端:商品列表、用户列表(用户信息修改)。 二、开发环境 Web服务器:Tomcat 8.0以上。 Java开发包:JDK 8。...校园二手交易平台采用的是JavaWeb+MySQL+JQuery+Apache-Tomcat作为系统整体的架构。
该课题旨在设计并开发一个基于B/S结构的图书管理系统,通过Java开发Web应用程序,给出了图书管理系统的整体架构,弥补了基于网络的图书管理系统功能不全的问题。 本课题首先介绍了图书管理系统的目的、意义以及国...
17.2 整体架构 349 17.3 一些架构思路和总结 350 17.3.1 两种读服务架构模式 351 17.3.2 本地缓存 352 17.3.3 多级缓存 353 17.3.4 统一入口/服务闭环 354 17.4 引入Nginx接入层 354 17.4.1 数据校验/过滤逻辑前置 ...
⑨ 服务平台:Tomcat 8.0/9.0 ⑩ 数据库工具:SQLyog/Navicat ⑪ 开发软件:eclipse/myeclipse/idea ⑫ 浏览器:谷歌浏览器/微软edge/火狐 ⑬ 技术栈:Java、Mysql、Maven、Springboot、Mybatis、Ajax、Vue等 2、...
在介绍架构之前,为了避免部分读者对架构设计中的一些概念不了解,下面对几个最基础的概念进行介绍:1:分布式系统中的多个模块在不同的服务器上部署,即可称为分布式系统,如Tomcat和数据库分别部署在不同的服务器...