tomcat看源码

article/2025/9/14 19:09:04

一.环境搭建
1.官网下载tomcat9
2.idea打开
新建pom文件

<!-- pom.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.apache.tomcat</groupId><artifactId>tomcat9</artifactId><name>tomcat-9.0.41</name><version>9.0.41</version><build><finalName>tomcat-9.0.41</finalName><sourceDirectory>java</sourceDirectory><!--<testSourceDirectory>test</testSourceDirectory>  test 下的有些文件报错,因此将test文件夹去掉了--><resources><resource><directory>java</directory></resource></resources><testResources><testResource><directory>test</directory></testResource></testResources><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.6.0</version><configuration><encoding>UTF-8</encoding><source>1.8</source><target>1.8</target></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.0.2</version></plugin></plugins></build><dependencies><dependency><groupId>org.apache.ant</groupId><artifactId>ant</artifactId><version>1.9.5</version></dependency><!-- https://mvnrepository.com/artifact/biz.aQute.bnd/annotation --><!-- https://mvnrepository.com/artifact/biz.aQute.bnd/biz.aQute.bndlib --><dependency><groupId>biz.aQute.bnd</groupId><artifactId>biz.aQute.bndlib</artifactId><version>5.2.0</version><scope>provided</scope></dependency><!-- https://mvnrepository.com/artifact/org.apache.jasper/org.apache.jasper --><!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-jasper --><dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-jasper</artifactId><version>9.0.41</version></dependency><dependency><groupId>org.apache.ant</groupId><artifactId>ant-apache-log4j</artifactId><version>1.9.5</version></dependency><dependency><groupId>org.apache.ant</groupId><artifactId>ant-commons-logging</artifactId><version>1.9.5</version></dependency><dependency><groupId>javax.xml.rpc</groupId><artifactId>javax.xml.rpc-api</artifactId><version>1.1</version></dependency><dependency><groupId>wsdl4j</groupId><artifactId>wsdl4j</artifactId><version>1.6.2</version></dependency><dependency><groupId>org.eclipse.jdt.core.compiler</groupId><artifactId>ecj</artifactId><version>4.6.1</version></dependency></dependencies>
</project>

3.乱码解决
idea20
在这里插入图片描述在这里插入图片描述

idea2018
在这里插入图片描述

-Duser.language=en
-Duser.region=US
-Dfile.encoding=UTF-8
-Dsun.jnu.encoding=UTF-8

4.webapps
目录下放自己项目 如建的icoding
在这里插入图片描述
在这里插入图片描述

5.conf下server.xml虚拟主机使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果把应用不放在webapps下 需要新建个虚拟主机

 <Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true"> </Host><Host name="v1.icoding.com"  appBase="iapps1"unpackWARs="true" autoDeploy="true"> </Host><Host name="v2.icoding.com"  appBase="iapps2"unpackWARs="true" autoDeploy="true"> </Host>

context对应一个应用 部署时还可以放在其他路径,自己配路径
在这里插入图片描述

二.架构
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Wrapper 里可以放servlet 一个servlet可以有多个请求

public interface Wrapper extends Container {/*** Container event for adding a wrapper.*/public static final String ADD_MAPPING_EVENT = "addMapping";/*** Container event for removing a wrapper.*/public static final String REMOVE_MAPPING_EVENT = "removeMapping";

请求流程
在这里插入图片描述

6)在这里插入图片描述

在这里插入图片描述
三.核心组件
在这里插入图片描述

  • Lifecycle 生命周期
  • Container:
  • Engine
  • Host
  • Context
  • Wrapper
  • Servlet
  • Pipeline
  • Vavle
  • Connector
  • LifecycleListener -》 HostConfig
    在这里插入图片描述
    都是模板模式
    在这里插入图片描述请求进来 容器执行阀门 阀门获取下个容器
    在这里插入图片描述

1.基础设计
在这里插入图片描述Tomcat要实现两个核心功能:
1) 处理Socket连接,负责网络字节流与Request和Response对象的转化。
2) 加载和管理Servlet,以及具体处理Request请求。
因此Tomcat设计了两个核心组件连接器(Connector)和容器(Container)来分别做这两件事情。连接器负责对外交流,容器负责内部处理逻辑
在这里插入图片描述2.协议处理器与适配器
接上文,连接器并不能直接处理数据。利用协议处理器与适配器完成工作
在这里插入图片描述Tomcat 支持的IO模型(自8.5/9.0 版本起,Tomcat 移除了 对 BIO 的支持):

IO模型(传输层) 描述
NIO : 非阻塞I/O,采用Java NIO类库实现。
NIO2 : 异步I/O,采用JDK 7最新的NIO2类库实现。
APR : 采用Apache可移植运行库实现,是C/C++编写的本地库。如果选择该方 案,需要单独安装APR库。

应用层协议 描述
HTTP/1.1 : 这是大部分Web应用采用的访问协议。
AJP : 用于和Web服务器集成(如Apache),以实现对静态资源的优化以及 集群部署,当前支持AJP/1.3。
HTTP/2 : HTTP 2.0大幅度的提升了Web性能。下一代HTTP协议 , 自8.5以及9.0 版本之后支持。

3、连接器组件
连接器中的各个组件的作用如下:
在这里插入图片描述1、EndPoint

1) EndPoint : Coyote 通信端点,即通信监听的接口,是具体Socket接收和发送处理器,是对传输层的抽象,因此EndPoint用来实现TCP/IP协议的。
2) Tomcat 并没有EndPoint 接口,而是提供了一个抽象类AbstractEndpoint ,里面定义了两个内部类:Acceptor和SocketProcessor。Acceptor用于监听Socket连接请求。SocketProcessor用于处理接收到的Socket请求,它实现Runnable接口,在Run方法里调用协议处理组件Processor进行处理。为了提高处理能力,SocketProcessor被提交到
线程池来执行。而这个线程池叫作执行器(Executor)。

2、Processor

Processor : Coyote 协议处理接口 ,如果说EndPoint是用来实现TCP/IP协议的,那么Processor用来实现HTTP协议,Processor接收来自EndPoint的Socket,读取字节流解析成Tomcat Request和Response对象,并通过Adapter将其提交到容器处理,Processor是对应用层协议的抽象。

3、ProtocolHandler

ProtocolHandler: Coyote 协议接口, 通过Endpoint 和 Processor , 实现针对具体协议的处理能力。Tomcat 按照协议和I/O 提供了6个实现类 : AjpNioProtocol ,AjpAprProtocol, AjpNio2Protocol , Http11NioProtocol ,Http11Nio2Protocol ,Http11AprProtocol。我们在配置tomcat/conf/server.xml 时 , 至少要指定具体的ProtocolHandler , 当然也可以指定协议名称 , 如 : HTTP/1.1 ,如果安装了APR,那么
将使用Http11AprProtocol , 否则使用 Http11NioProtocol 。

4、Adapter

由于协议不同,客户端发过来的请求信息也不尽相同,Tomcat定义了自己的Request类来“存放”这些请求信息。ProtocolHandler接口负责解析请求并生成Tomcat Request类。但是这个Request对象不是标准的ServletRequest,也就意味着,不能用TomcatRequest作为参数来调用容器。Tomcat设计者的解决方案是引入CoyoteAdapter,这是适配器模式的经典运用,连接器调用CoyoteAdapter的Sevice方法,传入的是TomcatRequest对象,CoyoteAdapter负责将Tomcat Request转成ServletRequest,再调用容器的Service方法。

Http11NIOProtocol表示非阻塞模式Http协议的通信,它主要包含NioEndpoint组件和Http11NioProcessor组件。一个连接到来时,将被注册到NioChannel队列中,由Poller负责检测通道的读写事件,并在创建任务后扔进线程池中。
在这里插入图片描述4、Catalina

Catalina负责管理Server,而Server表示着整个服务器。Server下面有多个服务Service,每个服务都包含着多个连接器组件Connector(Coyote 实现)和一个容器组件Container。在Tomcat 启动的时候,会初始化一个Catalina的实例。
在这里插入图片描述 组件 职责
Catalina : 负责解析Tomcat的配置文件 , 以此来创建服务器Server组件,并根据 命令来对其进行管理
Server : 服务器表示整个Catalina Servlet容器以及其它组件,负责组装并启动 Servlet引擎,Tomcat连接器。Server通过实现Lifecycle接口,提供了 一种优雅的启动和关闭整个系统的方式
Service : 服务是Server内部的组件,一个Server包含多个Service。它将若干个 Connector组件绑定到一个Container(Engine)上
Connector : 连接器,处理与客户端的通信,它负责接收客户请求,然后转给相关 的容器处理,最后向客户返回响应结果
Container : 容器,负责处理用户的servlet请求,并返回对象给web用户的模块

在这里插入图片描述

四.运行原理
1.启动原理图

Bootstrap.main()

—>Catalina.load()

—>parseServerXml(true);

—>逐行解析文件

—>创建Lifecycle对象

—>对象创建结束

在这里插入图片描述Bootstrap 里main方法 init初始化 会

2.Tomcat里面的模板模式

Lifecycle(Server、Service、Engine、Host、Context、Wrapper)

  • abstract LifecycleBase
    【init()-abstract void initInternal()】
    【start()-abstract void startInternal()】
    【stop()-abstract void stopInternal()】
    【destroy()-abstract void destroyInternal()】
    以下的所有组件都会实现真正的生命周期方法而被调用
    • StandardServer
    • StandardService
    • StandardEngine
    • StandardHost
    • StandardContext
    • StandardWrapper

3、请求处理流程

  1. Connector组件Endpoint中的Acceptor监听客户端套接字连接并接收Socket。
  2. 将连接交给线程池Executor处理,开始执行请求响应任务。
  3. Processor组件读取消息报文,解析请求行、请求体、请求头,封装成Request对象。
  4. Mapper组件根据请求行的URL值和请求头的Host值匹配由哪个Host容器、Context容器、Wrapper容器处理请求。
  5. CoyoteAdaptor组件负责将Connector组件和Engine容器关联起来,把生成的Request对象和响应对象Response传递到Engine容器中,调用 Pipeline。
  6. Engine容器的管道开始处理,管道中包含若干个Valve、每个Valve负责部分处理逻辑。执行完Valve后会执行基础的 Valve–StandardEngineValve,负责调用Host容器的Pipeline。
  7. Host容器的管道开始处理,流程类似,最后执行 Context容器的Pipeline。
  8. Context容器的管道开始处理,流程类似,最后执行 Wrapper容器的Pipeline。
  9. Wrapper容器的管道开始处理,流程类似,最后执行 Wrapper容器对应的Servlet对象的处理方法

1、请求被Acceptor(socket.accept())接受到数据

2、Acceptor把请求封装成 SocketWrapperBase,直接发给线程池

3、SocketWrapperBase的run开始执行。使用 poller 拿到通道东西进行处理。

4、拿到协议处理器【ProtocolHandler】》AbstractProtocol里面有 Http11NioProtocol。处理HTTP1.1的

5、ProtocolHandler 创建出 Processor来处理请求

6、Http11Processor 里面有 CoyoteAdapter

7、Http11Processor 调用 service 方法

  • 1、准备CoyoteRequest对象,并且分配buffer空间准备来读取Channel里面的数据
  • 2、解析请求头、请求行等信息
  • 3、准备请求prepareRequest();校验之前解析的请求数据是否合法
  • 4、Http11Processor 调用 getAdapter().service(request, response);
    • 1、拿到适配器 CoyoteAdapter,调用service()。主要就是CoyoteRequest和HttpRequest的互转
      • 1、没有转换过,connector创建一个新的HttpServletRequest对象,保存CoyoteRequest的内容

      • 装饰模式 HttpServletRequest.getMethod–》CoyoteRequest.getMethod。不用挨个属性搬家

      • 在这里插入图片描述

      • 调用容器;CoyoteAdapter 的 343 行请求开始流转。拿到每个容器里面的管道的阀门,开始执行请求处理

connector.getService().getContainer().getPipeline().getFirst().invoke(request, response);
//得到Service?里面的容器也就是Engine?

在这里插入图片描述


http://chatgpt.dhexx.cn/article/6DrNj8SQ.shtml

相关文章

centos 6.2 mysql和tomcat的配置_基于CentOS 6.8平台的Tomcat+MySQL+JDK环境搭建

部署环境 Server&#xff1a;CentOS 6.8 x86_64 Tomcat&#xff1a;9.0.0.M9 MySQL&#xff1a;5.7.14 JDK&#xff1a;8u102 部署准备 使用浏览器访问Apache Tomcat官网 http://tomcat.apache.org/ 下载目前最新9版本 9.0.0.M9版本tar.gz安装包 下载Apache Commons Daemon&…

Windows下配置Tomcat集群

为什么要用Tomcat集群 可以提高整体web服务器性能&#xff0c;将动态页面交给tomcat处理&#xff0c;将静态文件交给apache处理&#xff0c;可以大大提高服务器的静态文件处理性能。 可以实现web服务器的负载均衡&#xff0c;服务器可采用集群的方式来响应客户端请求。Apache的…

tomcat连接mysql及JDBC详解

一、Tomcat简介 1、Tomcat简介 Tomcat 是 Apache 软件基金会&#xff08;Apache Software Foundation&#xff09;的 Jakarta 项目中的一个核心项目&#xff0c;由 Apache、Sun 和其他一些公司及个人共同开发而成。由于有了 Sun 的参与和支持&#xff0c;最新的 Servlet 和JS…

tomcat配置url跳转_web和tomcat的区别

在Web2.0的浪潮中&#xff0c;各种页面技术和框架不断涌现&#xff0c;为服务器端的基础架构提出了更高的稳定性和可扩展性的要求。近年来&#xff0c;作为开源中间件的全球领导者&#xff0c;JBoss在J2EE应用服务器领域已成为发展最为迅速的应用服务器。在市场占有率和服务满意…

Windows下安装配置Tomcat

Windows下安装配置Tomcat 下载 到官网下载目标Tomcat版本&#xff1a;https://tomcat.apache.org/ 下载完成后&#xff0c;进入目标目录下 解压到安装目录 配置 配置环境变量&#xff1a; 变量名为&#xff1a;CATALINA_HOME 变量值为&#xff1a;D:\software\tapache-t…

Linux系统安装配置tomcat详细教程

准备工作 在Xshell控制台依次安装&#xff1a; Linux服务器和window互传文件工具 yum install lrzsz解压命令 yum install unzip安装jdk1.8 yum install -y java-1.8.0-openjdk-devel.x86_64安装 下载tomcat的压缩文件&#xff0c;我以apache-tomcat-8.5.87.zip为例。 将…

Tomcat 环境搭建和管理

Tomcat 概念 Tomcat 是 Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目&#xff0c;由 Apache、Sun 和其他一些公司及个人共同开发而成&#xff0c;由于有了 Sun的参与和支持&#xff0c;最新的 Servlet 和 JSP规范总是能在Tomcat 中得到体现&a…

如何将mpg格式转换为mp4格式?

如何将mpg格式转换为mp4格式&#xff1f;mpg是什么格式文件呢&#xff1f;mpg全称MPEG&#xff0c;即动态图像专家组&#xff0c;是运动图像压缩算法的国际标准&#xff0c;这种专业的解释可能很多人看不懂&#xff0c;简单的说mpg就是一种视频文件格式。属于不常用的视频文件格…

mpg格式转换为mp4格式

如何将mpg格式转换为mp4格式&#xff1f;mpg的全称是Moving Pictures Experts Group&#xff0c;也被称为mpeg&#xff0c;是运动图像压缩算法的国际标准&#xff0c;简单的说mpg就是一种视频格式&#xff0c;mpg格式说过经过编码处理的图像文件越小&#xff0c;所占用的存储空…

Java使用mpxj导入.mpp格式的Project文件(甘特图)

最近换工作了&#xff0c;主要的项目都是企业内部为支撑的管理平台&#xff0c;刚入入职没多久&#xff0c;遇到了一个需求&#xff0c;就是导入微软的Project文件&#xff0c;踩过不少坑&#xff0c;所以记录一下&#xff0c;后续还有从数据库导出Project引导文件&#xff0c;…

引用型变量的赋值

内存分类 栈内存&#xff1a;空间较小&#xff0c;用来存储变量在堆内存的地址。 堆内存&#xff1a;空间大&#xff0c;用来存储变量的真实数据。 引用型变量数据引用&#xff1a;首先根据变量访问栈内存&#xff0c;再根据栈内存中的地址指向找到在堆内存中的变量数据。 当…

java对象与对象引用变量

Java对象及其引用 先搞清楚什么是堆&#xff0c;什么是栈。 Java开辟了两类存储区域&#xff0c;对比二者的特点 存储区域存储内容优点缺点回收栈基本类型的变量和对象的引用变量存取速度比堆要快&#xff0c;仅次于寄存器&#xff0c;栈数据可以共享存在栈中的数据大小与生…

变量的引用_概念

理解了变量的引用之后, 对于我们理解在python 中的函数的参数传递和以及函数的返回值都是非常由帮助的. 当一个python 程序运行的时候, 变量和数据都是保存在内存中的. 变量的引用这个概念, 就是介绍一下当一个python 程序运行时, 变量和数据是怎样保存的, 并且保存的是什么内…

C++中引用变量详解

目录 一、什么是引用&#xff1f; 二、引用的注意事项 三、引用的本质 四、常量引用 五、引用的使用场景​​​​​​​ 六、引用和指针的区别 一、什么是引用&#xff1f; 引用实际上是给一个变量起别名&#xff0c;编译器不会为引用变量开辟一个新的内存空间&#xff…

C++变量引用

本篇介绍的变量引用与之前介绍的指针不是同一概念&#xff0c;它们有本质的区分&#xff1a; 1&#xff09;不存在空引用。引用必须连接到一块合法的内存。 2&#xff09;一旦引用被初始化为一个对象&#xff0c;就不能被指向到另一个对象。指针可以在任何时候指向到另一个对…

Java_引用变量

目录 1.认识 null ​编辑 2.数组的应用 3.数组作为函数的参数 4.数组作为函数的返回值 5.数组练习 数组转字符串 6.数组拷贝 (1)通过函数Arrays.copyOf()进行拷贝&#xff1a; (2)通过函数System.arraycopy()进行拷贝&#xff1a; (3)拷贝范围Arrays.copyOfRange() (4)比…

C++中的引用变量详解

文章目录 声明及定义代码引用变量的特点图片解释引用变量的本质引用变量的用途int & 和 const int & 的区别引用变量和宏定义&#xff08;#define&#xff09;的区别 声明及定义 [const] int& 变量名 右值 注意&#xff1a;[]内的是可选的。即这里的const限定词是…

引用变量及其作用

首先&#xff0c;先来明白一下什么是引用变量。 一个变量可以声明为一个引用&#xff0c;它起着该变量的别名的作用。对引用进行操作&#xff0c;实际上就是对被引用的变量进行操作。 引用运算符&#xff1a;&&#xff1b; 定义的一般形式&#xff1a;数据类型 &引用变…

变量的引用

引用是C对C的一个重要扩充。 1、引用的概念&#xff1a;变量的引用就是变量的别名。引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。 从上面图中就可以看出&a…

引用变量

引用就是一个变量的别名&#xff0c;声明&#xff1a; int a 0; int &b a; b就是a的引用&#xff0c;a和b指向的内存时同一个地址&#xff0c;b可以修改变量的值 一。主要的用途是将引用变量作为函数的参数传递&#xff0c;为什么呢&#xff1f; &#xff08;1&…