![](https://csdnimg.cn/release/download_crawler_static/86347216/bg4.jpg)
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
协议,负责给客户端发送响应页面,比如在请求页面未发现时,connector 就会给客户
端浏览器发送标准的 Http 404 错误响应页面。
5. Resource 子模块:这个子模块包含一些资源文件,如 Server.xml 及 Web.xml 配置文件。
严格说来,这个子模块不包含 java 源代码,但是它还是 Tomcat 编译运行所必需的。
2.2 Tomcat 运行流程
图 2-2 tomcat 运行流程
假设来自客户的请求为:http://localhost:8080/test/index.jsp
1. 请求被发送到本机端口 8080,被在那里侦听的 Coyote HTTP/1.1 Connector 获得
2. Connector 把该请求交给它所在的 Service 的 Engine 来处理,并等待 Engine 的回应
3. Engine 获得请求 localhost:8080/test/index.jsp,匹配它所有虚拟主机 Host
4. Engine 匹配到名为 localhost 的 Host(即使匹配不到也把请求交给该 Host 处理,因为该
Host 被定义为该 Engine 的默认主机)
5. localhost Host 获得请求/test/index.jsp,匹配它所拥有的所有 Context