首页 > 其他分享 >如何阅读Tomcat源代码?

如何阅读Tomcat源代码?

时间:2023-04-21 21:14:02浏览次数:54  
标签:Engine 容器 Pipeline Tomcat Valve 阅读 源代码 Servlet


容器,简单理解就是用来装东西的工具。在Tomcat里面,容器被设计用来装载Servlet, 也就是我们平常写的普通的Servlet ,就会存放在容器里面。这也就是咱们平常念叨的Servlet容器,其实从广义上理解,Servlet容器是指Tomcat,从狭义上理解,Servlet容器,只是Tomcat里面的一个组件而已。

1. 容器概述

Tomcat采用分层结构设计了4种容器,这4种容器分别是: Engine 、Host 、Context 、Wrap 。它们钧继承 Container 容器接口。这样设计使得Tomcat在处理请求时,分工更加明确,也使得容器具有很好的灵活性。

如何阅读Tomcat源代码?_映射地址

其中从左到右: Engine 表示引擎,用来管理多个虚拟站点,一个Service最多只能有一个Engine。 Host代表虚拟主机,或者表示站点。其实就是我们配置出来的虚拟映射地址。Context表示一个Web应用,Wrap 名为包装,它其实就是内部包装着我们写的Servlet。

为了方便大家理解,我们可以从Tomcat里面的server.xml中看出来一些端倪。

如何阅读Tomcat源代码?_java_02

这四个容器呈现的是一个父子包含关系:

如何阅读Tomcat源代码?_tomcat_03

2. 定位Servlet

在Tomcat里面使用Mapper 映射器来实现Servlet的定位工作。在最初启动项目的时候,Tomcat就开始解析了项目的配置信息,然后使用Mapper来保存了具体的映射地址和Host、Context、Wrap的对应关系。当请求到来的时候,就会到Mapper里面去查找匹配的Wrap(Servlet),然后调用。当我们为了方便理解,我们可以浅显的认为Mapper其实就是一个类似Map键值对的容器。

2.1 全局概览

比如: 下面的图示,我们可以把瑞吉点餐项目的面向管理员后台项目和面向用户前端项目部署在同一个Tomcat上,为了隔离它们,我们通过配置虚拟域名,也就是两个Host。而用户系统,订单系统,产品系统,购物车系统又都是可以独立运行的应用,所以我们可以配备4个Context来对应它们。最后一排的Wrap,其实就是各自系统中的Servlet了。

如何阅读Tomcat源代码?_java_04

2.2 请求到来

此时用户使用  http://user.reggie.com:8080/cart/delete 来访问。

2.2.1 定位Service和Engine

由于来访的时候,使用的是8080端口,正好被Http连接器捕捉到。在Tomcat里面,Service里面包含着: 连接器和容器。找到了连接器,也就意味着找到了容器,这也就意味着Engine就确定了。

2.2.2 定位Host

Service和Engine确定了之后,就在Mapper中,通过路径地址,找到响应的Host容器。由于使用的是http://user.reggie.com 访问,所以这就确定了是Host2这个容器。

2.2.3 定位Context

Host确定了之后,继续在Mapper中查找。由于使用的/cart访问,所以这就定位到了Context4这个应用。

2.2.4 定位Wrap

Context确定了之后,后续也就能根据地址 /delete,轻而易举的找到 Wrap6 这个容器。最后也就定位到了Servlet。

2.3 请求传递

Tomcat 里面是如何把请求从最外层的容器Engine,一直往里传递到Wrap,然后执行Servlet的调用的呢?
答案是使用 Pipeline-Valve 管道。
Pipeline-Valve 是 责任链模式,责任链模式是指在一个请求处理的过程中有很多处理者依次对请求进行处理,每个处理者负责做自己相应的处理,处理完之后将再调用下一个处理者继续处理。

下面通过一个张简单的草图来描述:

每一个容器都有一个Pipeline对象,中间的每一个圆圈,其实表示的是一个Valve,它表示处理点。在Pipeline里面维护这Valve的链表。只要执行了第一个Pipeline的Valve,这个容器中的Pipeline就会被调用,直到最后末端的Basic的Valve,它负责去连接下一个子容器的第一个Valve处理点。这样不断的串联起来,最终就到达了Servlet。

如何阅读Tomcat源代码?_责任链模式_05

值得注意的是: 在Wrap的最后一个Basic的Valve的处理点里面,它会创建一个Filter过滤器链,然后在doFilter方法中最终调用Servlet的service方法。

3. 总结

本文主要给大家描述了Tomcat了里面的容器结构,以及请求到来的时候,是如何识别到底执行了哪个Servlet。请求的链式调用是基于 Pipeline-Valve 责任链来完成的,这样的设计使得系统具有良好的可扩展性,如果需要扩展容器本身的功能,只需要增加相应的 Valve 即可。

标签:Engine,容器,Pipeline,Tomcat,Valve,阅读,源代码,Servlet
From: https://blog.51cto.com/u_8238263/6214164

相关文章

  • 阿里云ECS linux操作系统 tomcat域名配置SSL
    阿里云ECS linux操作系统 tomcat域名配置SSL启用域名https1、解压已保存到本地的Tomcat证书文件。解压后您将看到文件夹中有以下文件:证书文件(domain_name.pfx)密码文件(pfx-password.txt) 说明本文中证书名称以domain_name为示例。每次下载证书都会产生新的密码。......
  • tomcat提示静态文件缓存超限,造成日志爆满的问题
    日志片段:21-Apr-202311:20:47.215警告[http-nio-80-exec-5308]org.apache.catalina.webresources.Cache.getResourceUnabletoaddtheresourceat[/FileUploads/www/site/2022/11/30/ZZVRQAHD08ZX4GOW47.jpg]tothecacheforwebapplication[]becausetherewasin......
  • 阅读《第五项修炼 知行学校④》
    作者:彼得圣吉  阅读时间:2023.04所写内容仅代表本人所感所想。如若指正,欢迎留言讨论。无论你是一名教师,还是学校管理人员,或者是家长,乃至学生,这本书对你都会有所助益,让你在自己的学习里也能取的同样的成就。......
  • Tomcat报错严重: Unable to process Jar entry [module-info.class] from Jar
    Tomcat运行时出现UnabletoprocessJarentry[module-info.class]fromJar分析报错可知无法从Jar包中处理Jar条目[module-info.class]报错内容严重:UnabletoprocessJarentry[module-info.class]fromJar[jar:file:/D:/STS/Workspaces/Cloudview/.metadata/.plugins/......
  • 程序员修炼之道阅读笔记
    第16节强力编辑器1、我们认为你最好是精通一种编辑器,并将其用于所有编辑任务:代码、文档、备忘录、系统管理等等。进行编辑活动时,你不必停下来思考怎样完成文本操作,编辑器将成为你双手的延伸,键会在滑过文本和思想时歌唱起来。这就是我们的目标。2、好的编辑器应该具有这些特性......
  • idea配置tomcat
    ​许多小伙伴原来都使用的eclipse进行Java代码的编写,在改用IDEA以后不会进行原来的一些配置,今天我来交给大家如何在IDEA上进行tomcat的配置1.添加tomcat按照上述图片所述顺序对tomcat进行添加.2.对tomcat进行配置在完成这些简单的配置以后点击OK,这时页面上出现了t......
  • tomcat启动时,加载类
    有时候在开发Web应用的时候,需要tomcat启动后自动加载一个用户的类,执行一些初始化方法,如从数据库中加载业务字典到内存中,因此需要在tomcat启动时就自动加载一个类,或运行一个类的方法。可以采用在WEB-INF/web.xml中添加一个监听程序(ServletContextListener配置......
  • tomcat多域名配置
    评:TOMCAT的域名配置现在很多的公司的网站都是用tomcat作为应用服务区的,可是对于初学者,8080端口号是如何去掉的,这些网站是如何和域名绑定到一起的呢?一个tomcat是如何绑定多域名?并且这些域名是如何对应不同的项目呢?而且我的服务器没放在机房,放在我的本地,我应该如何把我的服务器......
  • ThreadLocal在Tomcat环境应用问题
    评:ThreadLocal的使用在Tomcat的服务环境下要注意,并非每次web请求时候程序运行的ThreadLocal都是唯一的..ThreadLocal的绳命周期不等于一次Request的绳命周期..ThreadLocal与线程对象紧密绑定的,由于Tomcat使用了线程池,线程是可能存在复用情况...1.ThreadLocal可以用于存放与......
  • tomcat6启动报错java.lang.ClassNotFoundException: 1catalina.org.apache.juli.FileH
    评:tomcat6启动报错在apache-tomcat-6.0.26/logs/catalina.out日志里面报错:java.lang.ClassNotFoundException:1catalina.org.apache.juli.FileHandler这个是由于apache-tomcat-6.0.26/bin/catalina.sh文件被修改过了,应该把下面的一行放在-Djava.util.logging.manager的前......