一,前言

在开始看源码细节之前,首先要想好要看的问题。想好问题之后,我们该如何寻找要看的代码呢?

其实,这就好像去爬山的时候,突然想去上厕所,如果有一副地图,那么我们可以很快就找到厕所的位置。带着问题看源码也是同样的道理,如果我们知道源码每个部分的结构是做什么的,那么我们就可以很快定位代码。

这篇博客主要介绍 Tomcat 的整体设计、源码结构。

二,项目源码结构

我们先从源码结构开始。Tomcat 服务器相关的代码在 java 文件夹下面,后面我们在进入这个文件夹去分析。

modules 文件夹下面,有四个部分。

三,Tomcat 源码文件夹

Tomcat 源码位于 java 文件夹下面。这个 java 文件夹下面的每个东西是干什么事情的呢?下面简要说说。

1. Jakarta

位于 java/jakarta,这个文件夹下面保存的是新的 Java EE 规范,现在的 Java EE 也不这么叫了,要改名叫 Jakarta EE。详见这里

如果去看 tomcat 9,会发现这个文件夹是 javax,不是 jakarta。tomcat 10 的一个重大转变就是从 javax 命名空间转向 jakarta。

每个规范是做什么的呢?这里参考官网[2]的规范简要说说。

annotation

注解https://jakarta.ee/specifications/annotations/2.0/annotations-spec-2.0.html#goals

下面引用了网页中的说法,annotation 这个模块的作用是定义了一些公用的注解,避免在不同的规范中定义相同的注解。

It is hoped that this will help to avoid unnecessary redundancy or duplication between annotations defined in different Jakarta EE specifications

ejb

Enterprise Beanshttps://jakarta.ee/specifications/enterprise-beans/4.0/jakarta-enterprise-beans-spec-core-4.0.htm

EJB 是开发和部署基于组件的企业级应用的架构。EJB 是一个架构。我是第一次听说 EJB,所以只能是引用它的说法,看个定义了。

The Enterprise Beans architecture is an architecture for the development and deployment of component-based business applications.

el

Expression Languagehttps://jakarta.ee/specifications/expression-language/4.0/jakarta-expression-language-spec-4.0.html

这个用在 jsp 中,用于求解表达式的值。

mail

无需看规范,知道它是邮件相关的就行。

persistence

持久化相关。

security

安全相关。

servlet

这个是重头戏。从本质上说,tomcat 就是一个实现了 servlet 规范的一个容器。servlet 定义了服务端处理 Http 请求和响应的规范。

transaction

事务相关的接口。

websocket

定义了使用 websocket 协议的服务端和客户端 API

xml.ws

定义了基于 SOAP 协议的 xml 方式的 web 服务。

2. org.apache

org/apache 文件夹下面是关于上面规范的部分实现。Tomcat 本质上就是 Jakarta EE 某些规范实现的合集。

Catalina

tomcat 的核心代码,可以理解为一个 servlet 容器。

coyote

tomcat 的核心代码,负责将网络请求转化后和 Catalina 进行通信。

el

上面的 Jakarta EE 中 el 的实现。

jasper

负责将 jsp 转为 java 代码。

juli

日志相关的工具。

naming

命名空间相关。

tomcat

各种辅助工具,包括 websocket 的实现。

四,Tomcat 模块设计

图片来自于 Medium

简化

How Tomcat Works 一书中,把 Tomcat 简化为 Connector 和 Container。

Connector 负责接收 Http 请求,并将请求转发给 Container 去处理,Container 负责处理请求的内容,加载对应的 Servlet,将请求的结果返回给 Connector。

参考链接

[1] https://blogs.oracle.com/javamagazine/transition-from-java-ee-to-jakarta-ee

[2] https://jakarta.ee/specifications/

[3] https://medium.com/@nikhilmanikonda/tomcat-who-i-am-and-what-i-do-e91ff72fb2ea

【Tomcat 源码系列】Tomcat 整体结构的更多相关文章

  1. 【Tomcat 源码系列】源码构建 Tomcat

    一,前言 这篇博客写于 12 月 12 日,从 github[1] 上 fork 了一份 tomcat 的源代码,clone 到了本地.最近想把 tomcat 的源代码分析一下,寒假的时候有完整的时间 ...

  2. 【Tomcat 源码系列】认识 Tomcat

    一,前言 说一句大实话,"平时一直在用 Tomcat,但是我从来没有用过 Tomcat". "平时一直在用 Tomcat",是因为搬砖用的 SpringBoot ...

  3. Tomcat源码分析 -- Tomcat整体架构

    引用链接:https://blog.csdn.net/w1992wishes/article/details/79242797

  4. [Tomcat 源码分析系列] (二) : Tomcat 启动脚本-catalina.bat

    概述 Tomcat 的三个最重要的启动脚本: startup.bat catalina.bat setclasspath.bat 上一篇咱们分析了 startup.bat 脚本 这一篇咱们来分析 ca ...

  5. 详解Tomcat系列(一)-从源码分析Tomcat的启动

    在整个Tomcat系列文章讲解之前, 我想说的是虽然整个Tomcat体系比较复杂, 但是Tomcat中的代码并不难读, 只要认真花点功夫, 一定能啃下来. 由于篇幅的原因, 很难把Tomcat所有的知 ...

  6. tomcat 源码分析

    Tomcat源码分析——Session管理分析(下)    Tomcat源码分析——Session管理分析(上)     Tomcat源码分析——请求原理分析(下)     Tomcat源码分析——请 ...

  7. Servlet在启动时加载的tomcat源码(原创)

    tomcat 8.0.36 知识点: 通过配置loadOnStartup可以设置Servlet是否在Tomcat启动时加载,以及按值大小进行有序加载,其最小有效值为0,最大有效值为Integer.MA ...

  8. svn工具安装下载Tomcat源码以及导入eclipse

    安装 1.svn下载地址 https://tortoisesvn.net/downloads.html 2.语言包下载 3.先安装svn,在直接安装语言包 4.桌面右键可以看到相关svn信息 下载To ...

  9. Tomcat源码导入eclipse的步骤

    Tomcat源码导入eclipse 一.下载源码 1.  进入Apache 官网:http://tomcat.apache.org/ 2.  在左边侧选择要下载的源码的版本. 3.  或者直接通过Ar ...

随机推荐

  1. Android10_原理机制系列_Activity窗口添加到WMS过程

    前言 首先看一个Android界面的布局层次结构,最直观的看一下: 我们能清晰看到,这个界面分成了3部分:顶部状态栏(statusbar).底部导航栏(navigationbar).应用界面. 题外话 ...

  2. thinkPHP命令执行漏洞

    thinkPHP中反斜杠的作用是类库\命名空间 命令执行的姿势 通过反射invokefunction调用call_user_func_array方法,call_user_func_array函数接受两 ...

  3. jQuery 第三章 CSS操作

    .css() .attr() .prop() .css() 参数填法:如下所示 ↓  可填px 可不填,注意点:background-color  这类属性,需要填成 小驼峰式  background ...

  4. Eclipse中get/set方法自动生成

    代码中点击右键(快捷键Ctrl+Alt+S) ->Source ->Generate Getters and Setters... ->全选(或选择需要生成的字段/方法) 动图: 静 ...

  5. 经典算法—BF算法(字符串匹配)

    前言 字符串的匹配算法也是很经典的一个算法,在面试的时候常常会遇到,而BF算法是字符串模式匹配中的一个简单的算法 1,什么是BF算法 BF算法,即暴力(Brute Force)算法,是普通的模式匹配算 ...

  6. VM15 Ubuntu18.04 安装c/c++

    输入"su"再输入密码即进入根用户,(gcc是默认安装的,但刚安装完成的系统中的gcc并不能用来开发,还缺少常用的头文件和库文件,还组要安装build-essential 软件包) ...

  7. python应用(6):函数

    在流程很简单的时候,或者流程不简单但我们不需要考虑开发维护成本的时候,平面地组织你的代码就够了,不用费脑子,不需要考虑层次或重用的东西.当事情变得越来越复杂时,当同行对代码质量要求越来越高时,有一些重 ...

  8. 在Mac下配置JDK

    1.下载JDK,例JDK8U144 下载地址https://pan.baidu.com/s/1upjecBzTIMnyz0JmdkYprQ 2.安装 安装后配置JDK环境变量 cd ~ open .b ...

  9. Spring Boot 内置定时任务

    启用定时任务 @SpringBootApplication @EnableScheduling // 启动类添加 @EnableScheduling 注解 public class ScheduleD ...

  10. paddleocr安装笔记

    下载解压安装 wget http://npm.taobao.org/mirrors/python/3.7.6/Python-3.7.6.tgztar xvf Python-3.7.6.tgzcd Py ...