# 利刃出鞘_Tomcat 核心原理解析(一)
## 一、Tomcat 专题内容
### 1、Tomcat 专题 基础:
- Tomcat基础
- Tomcat架构
- Tomcat Jasper引擎
- Tomcat服务器设置
### 2、Tomcat 专题 进阶:
- Tomcat Web应用配置
- Tomcat 管理配置
- Tomcat JVM 配置
- Tomcat集群
- Tomcat安全
- Tomcat性能调优
- Tomcat 附件功能
- Tomcat WebSocket案例
## 二、Tomcat专题 - Tomcat基础 - Web相关概念
### 1、软件架构
1) C/S: 客户端/服务器端 ‐‐‐> 如: QQ , 360 ....。
2) B/S: 浏览器/服务器端 ‐‐‐> 如:京东, 网易 , 淘宝等。
### 2、资源分类
1)静态资源:
所有用户访问后,得到的结果都是一样的,称为静态资源。静态资源可以直接被浏览器解析。如: html,css,JavaScript,jpg。
2)动态资源:
每个用户访问相同资源后,得到的结果可能不一样 , 称为动态资源。动态资源被访问后,需要先转换为静态资源,再返回给浏览器,通过浏览器进行解析。如:servlet/jsp,php,asp....。
### 3、网络通信三要素
1)IP:电子设备(计算机)在网络中的唯一标识。
2)端口:应用程序在计算机中的唯一标识。 0~65536
3)传输协议:规定了数据传输的规则。
### 4、基础协议:
1)tcp : 安全协议,三次握手。 速度稍慢。
2)udp:不安全协议。 速度快。
## 三、Tomcat专题 - Tomcat基础 - 常见的Web服务器软件
### 1、服务器相关概念
1)服务器:安装了服务器软件的计算机。
2)服务器软件:接收用户的请求,处理请求,做出响应。
3)web服务器软件:接收用户的请求,处理请求,做出响应。在web服务器软件中,可以部署web项目,让用户通过浏览器来访问这些项目。
### 2、常见web服务器软件
1)webLogic:oracle 公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的,通常应用于金融领域。
2)webSphere:IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的,通常应用于金融领域。
3)JBOSS:JBOSS公司的,大型的JavaEE服务器,支持所有的JavaEE规范,收费的,通常应用于金融领域。
4)Tomcat:Apache基金组织,中小型的JavaEE服务器,仅仅支持少量的JavaEE规范
servlet/jsp。开源的,免费的,通常应用于互联网项目。
## 四、Tomcat专题 - Tomcat基础 - Tomcat安装及目录结构
### 1、Tomcat 历史
1) Tomcat 最初由Sun公司的软件架构师 James Duncan Davidson 开发,名称为
“JavaWebServer”。
2) 1999年 ,在 Davidson 的帮助下,该项目于1999年于apache 软件基金会旗下的
JServ 项目合并,并发布第一个版本(3.x), 即是现在的Tomcat,该版本实现了
Servlet2.2 和 JSP 1.1 规范 。
3) 2001年,Tomcat 发布了4.0版本, 作为里程碑式的版本,Tomcat 完全重新设计了其架构,并实现了 Servlet 2.3 和 JSP1.2规范。
4)2005 年成为 Apache 顶级项目。
### 2、Tomcat 下载安装
1)Tomcat下载
https://tomcat.apache.org/download-80.cgi
2)Tomcat 安装
将下载的 .zip 压缩包 , 解压到系统的目录(建议是没有中文不带空格的目录)下即可。
### 3、Tomcat 目录结构
目录 | 目录下文件 | 说明 |
-- | -- | -- |
bin | / | 存放Tomcat的启动、停止等批处理脚本文件 |
startup.bat , startup.sh | 用于在windows和linux下的启动脚本 | |
shutdown.bat , shutdown.sh | 用于在windows和linux下的停止脚本 | |
conf | / | 用于存放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代码生成和编译的临时目录 |
| 目录 | 目录下文件 | 说明 |
|--|--|--|
| bin | / | 存放Tomcat的启动、停止等批处理脚本文件 |
| | startup.bat , startup.sh | 用于在windows和linux下的启动脚本 |
| | shutdown.bat , shutdown.sh | 用于在windows和linux下的停止脚本 |
| conf | / | 用于存放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代码生成和编译的临时目录 |
| | | |
### 4、Tomcat 启动停止(必须安装 JDK,并配置好环境变量)
1)打开CMD窗口:输入 java -version 查询是否安装了JDK并配置了环境变量。
```java
Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。
C:\Users\Administrator>java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
C:\Users\Administrator>
```
2)Tomcat 启动:
- windows 系统:双击 bin/startup.bat 文件。
- linux 系统:bin/startup.sh
3)Tomcat 停止:
- windows 系统:双击 bin/shutdown.bat 文件(也可以直接关闭CMD窗口)。
- linux 系统:bin/shutdown.sh
4)Tomcat 访问:http://localhost:8080
## 五、Tomcat专题 - Tomcat基础 - Tomcat源码部署运行
### 1、下载 Tomcat 源码
地址:
https://tomcat.apache.org/download-80.cgi
apache-tomcat-8.5.42-src.zip
### 2、解压
apache-tomcat-8.5.42-src.zip 源码压缩包
apache-tomcat-8.5.42-src 目录。
### 3、进入解压目录,并创建一个目录,命名为 home , 并将 conf、webapps目录 移入home 目录中。
apache-tomcat-8.5.42-src
apache-tomcat-8.5.42-src\home
apache-tomcat-8.5.42-src\home\conf\
apache-tomcat-8.5.42-src\home\webapps\
### 4、在当前目录下创建一个 pom.xml 文件,引入 tomcat 的依赖包
apache-tomcat-8.5.42-src\pom.xml
```java
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">
```
### 5、打开 idea,创建一个空项目 project_tomcat,导入 tomcat 源码工程。
1)打开 idea,创建一个空项目 project_tomcat
```java
--> idea --> File
--> New --> Project
--> Empty Project
--> Next
--> Groupld : ( djh.it )
Artifactld : ( jedis )
Version : 1.0-SNAPSHOT
--> Project Name: ( project_tomcat )
Project Location: ( D:\java_test\Intesij_idea\project_tomcat )
--> Finish
```
2)把解压的 tomcat 源码目录,复制到 idea 空项目 project_tomcat 目录中。
如:D:\java_test\Intesij_idea\project_tomcat\ 目录中。
3)首先确认在你的 idea 中,配置好 maven 及 maven 仓库。
```java
--> idea --> File
-->Settings
--> Build,Execution,Deployment
--> Build Tools
--> Maven
Maven home diretory: (你的maven安装路径,如:
D:/Maven/apache-maven-3.3.9)
User settings file: ( 你的maven配置文件settings.xml路径,如:D:\Maven\apache-maven-3.3.9\conf\settings.xml )
Local repository: ( 你的maven本地仓库路径,如:D:\Maven\maven_repository )
```
4)导入 tomcat 源码工程 pom.xml 文件到 空项目 project_tomcat 中。
```java
--> idea
--> Project Structure
--> Modules
--> 点击 “+”
--> Import Modules
--> 找到 tomcat 源码下,新创建的 pom.xml 主配置文件。 (如:D:\java_test\Intesij_idea\project_tomcat\apache-tomcat-8.5.42-src\pom.xml 配置文件。)
--> 点击 OK。
--> Apply
--> 点击 OK。
# 或者也可以点击 idea 右边 Maven 执行同样操作。
```
### 6、配置 idea 的启动类, 配置 MainClass , 并配置 VM 参数。
1)找到 tomcat 启动类(入口类main()方法)
```java
apache-tomcat-8.5.42-src\java\org\apache\catalina\startup\Bootstrap.java
project_tomcat\apache-tomcat-8.5.42-src\java\org\apache\catalina\startup\Bootstrap.java
D:\java_test\Intesij_idea\project_tomcat\apache-tomcat-8.5.42-src\java\org\apache\catalina\startup\Bootstrap.java
```
2)配置 VM 参数
```java
‐Dcatalina.home=D:\java_test\Intesij_idea\project_tomcat\apache-tomcat-8.5.42-src\home
‐Dcatalina.base=D:\java_test\Intesij_idea\project_tomcat\apache-tomcat-8.5.42-src\home
‐Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
‐Djava.util.logging.config.file=D:\java_test\Intesij_idea\project_tomcat\apache-tomcat-8.5.42-src\home\conf\logging.properties
‐Dcatalina.home=D:/java_test/Intesij_idea/project_tomcat/apache-tomcat-8.5.42-src/home
‐Dcatalina.base=D:/java_test/Intesij_idea/project_tomcat/apache-tomcat-8.5.42-src/home
‐Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
‐Djava.util.logging.config.file=D:/java_test/Intesij_idea/project_tomcat/apache-tomcat-8.5.42-src/home/conf/logging.properties
```
3)配置 idea 的启动类
```java
idea --> Add Configuration...
--> 点击“+”
--> Application
Name: ( BootStrap )
Main class : ( org.apache.catalina.startup.Bootstrap )
(说明:点击后面 “...” 定位到 Project 项目中的 Bootstrap.java 类)
VM options : 复制上面配置 VM 参数,即:
( ‐Dcatalina.home=D:/java_test/Intesij_idea/project_tomcat/apache-tomcat-8.5.42-src/home
‐Dcatalina.base=D:/java_test/Intesij_idea/project_tomcat/apache-tomcat-8.5.42-src/home
‐Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
‐Djava.util.logging.config.file=D:/java_test/Intesij_idea/project_tomcat/apache-tomcat-8.5.42-src/home/conf/logging.properties )
--> Apply
--> 点击OK。
```
### 7、启动主方法,运行 Tomcat,访问 Tomcat 。
### 8、如果启动 tomcat 出现错误
出现上述异常的原因,是我们直接启动
org.apache.catalina.startup.Bootstrap 的时候没有加载 JasperInitializer,从而无法编译 JSP。
解决办法是:
1)在 tomcat 的源码 ContextConfig 中的 configureStart 函数中手动将 JSP 解析器初始化:
```java
# 搜索 ContextConfig.java 类,添加如下初始化:
webConfig();
context.addServletContainerInitializer(new JasperInitializer(), null);
```
2)重启 tomcat 就可以正常访问了。