1. Tomcat 基础
1.1 web 概念
1.2 常见的web服务器
1.2.1 概念
1.2.2 常见web服务器软件
1.3 Tomcat 历史
1.4 Tomcat 安装
1.4.1 下载
tomcat下载地址
https://archive.apache.org/dist/tomcat/

1.4.2 安装
1.5 Tomcat 目录结构
目录
|
目录下文件
|
说明 |
bin
|
/ |
存放
Tomcat
的启动、停止等批处理脚本文件
|
startup.bat ,
startup.sh
|
用于在
windows
和
linux
下的启动脚本
|
|
shutdown.bat ,
shutdown.sh
|
用于在
windows
和
linux
下的停止脚本
|
|
con
|
/ |
用于存放
Tomcat
的相关配置文件
|
Catalina
|
用于存储针对每个虚拟机的
Context
配置
|
|
context.xml
|
用于定义所有
web
应用均需加载的
Context
配
置,如果
web
应用指定了自己的
context.xml
,该文件将被覆盖
|
|
catalina.properties
|
Tomcat
的环境变量配置
|
|
catalina.policy
|
Tomcat
运行的安全策略配置
|
|
logging.properties
|
Tomcat
的日志配置文件, 可以通过该文件修
改
Tomcat
的日志级别及日志路径等
|
|
server.xml
|
Tomcat
服务器的核心配置文件
|
|
tomcat-users.xml
|
定义
Tomcat
默认的用户及角色映射信息配置
|
|
web.xml
|
Tomcat
中所有应用默认的部署描述文件, 主
要定义了基础
Servlet
和
MIME
映射。
|
|
lib
|
/ |
Tomcat
服务器的依赖包
|
logs
|
/ |
Tomcat
默认的日志存放目录
|
webapps
|
/ |
Tomcat
默认的
Web
应用部署目录
|
work
|
/ |
Web
应用
JSP
代码生成和编译的临时目录
|
1.6 Tomcat 启动停止
启动
双击 bin/startup.bat 文件 ;

1.7 Tomcat源码
1.7.1 下载
地址: https://tomcat.apache.org/download-80.cgi
1.7.2 运行
<?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>Tomcat8.5</artifactId>
<name>Tomcat8.5</name>
<version>8.5</version>
<build>
<finalName>Tomcat8.5</finalName>
<sourceDirectory>java</sourceDirectory>
<testSourceDirectory>test</testSourceDirectory>
<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>2.4</version>
<configuration>
<encoding>UTF-8</encoding>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>ant</groupId>
<artifactId>ant</artifactId>
<version>1.7.0</version>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxrpc</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.eclipse.jdt.core.compiler</groupId>
<artifactId>ecj</artifactId>
<version>4.5.1</version>
</dependency>
</dependencies>
</project>

‐Dcatalina.home=D:/idea‐workspace/itcast_project_tomcat/apache‐tomcat‐
8.5.42‐src/home
‐Dcatalina.base=D:/idea‐workspace/itcast_project_tomcat/apache‐tomcat‐
8.5.42‐src/home
‐Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
‐Djava.util.logging.config.file=D:/idea‐
workspace/itcast_project_tomcat/apache‐tomcat‐8.5.42‐
src/home/conf/logging.properties

context.addServletContainerInitializer(new JasperInitializer(), null);
7) 重启tomcat就可以正常访问了。
2.Tomcat 架构
2.1 Http工作原理
HTTP协议是浏览器与服务器之间的数据传送协议。作为应用层协议,HTTP是基于TCP/IP 协议来传递数据的(HTML文件、图片、查询结果等),HTTP协议不涉及数据包 (Packet)传输,主要规定了客户端和服务器之间的通信格式。
从图上你可以看到,这个过程是:
2.2 Tomcat整体架构
2.2.1 Http服务器请求处理

2.2.2 Servlet容器工作流程
为了解耦,HTTP服务器不直接调用Servlet,而是把请求交给Servlet容器来处理,那Servlet容器又是怎么工作的呢?

2.2.3 Tomcat整体架

2.3 连接器 - Coyote
2.3.1 架构介绍
Coyote 是Tomcat的连接器框架的名称 , 是Tomcat服务器提供的供客户端访问的外部接 口。客户端通过Coyote与服务器建立连接、发送请求并接受响应 。
Coyote 封装了底层的网络通信(Socket 请求及响应处理),为Catalina 容器提供了统一 的接口,使Catalina 容器与具体的请求协议及IO操作方式完全解耦。Coyote 将Socket 输入转换封装为 Request 对象,交由Catalina 容器进行处理,处理请求完成后, Catalina 通过Coyote 提供的Response 对象将结果写入输出流 。
Coyote 作为独立的模块,只负责具体协议和IO的相关操作, 与Servlet 规范实现没有直接关系,因此即便是 Request 和 Response 对象也并未实现Servlet规范对应的接口, 而是在Catalina 中将他们进一步封装为ServletRequest 和 ServletResponse 。
2.3.2 IO模型与协议
IO
模
型
|
描述
|
NIO
|
非阻塞
I/O
,采用
Java NIO
类库实现。
|
NIO2
|
异步
I/O
,采用
JDK 7
最新的
NIO2
类库实现。
|
APR
|
采用
Apache
可移植运行库实现,是
C/C++
编写的本地库。如果选择该方案,需要单独安装APR
库。
|
应用层协议
|
描述
|
HTTP/1.
|
这是大部分
Web
应用采用的访问协议。
|
AJP
|
用于和
Web
服务器集成(如
Apache
),以实现对静态资源的优化以及集群部署,当前支持AJP/1.3
。
|
HTTP/2
|
HTTP 2.0
大幅度的提升了
Web
性能。下一代
HTTP
协议 , 自
8.5
以及
9.0
版本之后支持。
|
协议分层 :
2.3.3 连接器组件
2.3.4 源码解析
2.4 容器 - Catalina
2.4.1 Catalina 地位
Tomcat 的模块分层结构图, 如下:
2.4.2 Catalina 结构
Catalina 的主要组件结构如下:




<server>
<service>
<Connector/><Connector/>
<Engine>
<Host>
<Context></Context>
</Host>
</Engine>
</service>
</server>


2.5 Tomcat 启动流程
2.5.1 流程
步骤:
2.5.2 源码解析
2.5.2.1 Lifecycle
由于所有的组件均存在初始化、启动、停止等生命周期方法,拥有生命周期管理的特性, 所以Tomcat在设计的时候, 基于生命周期管理抽象成了一个接口 Lifecycle ,而组件 Server、Service、Container、Executor、Connector 组件 , 都实现了一个生命周期的接口,从而具有了以下生命周期中的核心方法:

2.5.2.2 各组件的默认实现


2.5.2.3 源码入口

2.5.3 总结
2.6 Tomcat 请求处理流程
2.6.1 请求流程

