百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

# 利刃出鞘_Tomcat 核心原理解析(一)

csdh11 2025-03-03 18:11 11 浏览

# 利刃出鞘_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">

4.0.0

org.apache.tomcat

apache‐tomcat‐8.5.42‐src

Tomcat8.5

8.5

Tomcat8.5

java

java

org.apache.maven.plugins

maven-compiler-plugin

2.3

UTF‐8

1.8

1.8

junit

junit

4.12

test

org.easymock

easymock

3.4

ant

ant

1.7.0

wsdl4j

wsdl4j

1.6.2

javax.xml

jaxrpc

1.1

org.eclipse.jdt.core.compiler

ecj

4.5.1

```

### 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 就可以正常访问了。

相关推荐

探索Java项目中日志系统最佳实践:从入门到精通

探索Java项目中日志系统最佳实践:从入门到精通在现代软件开发中,日志系统如同一位默默无闻却至关重要的管家,它记录了程序运行中的各种事件,为我们排查问题、监控性能和优化系统提供了宝贵的依据。在Java...

用了这么多年的java日志框架,你真的弄懂了吗?

在项目开发过程中,有一个必不可少的环节就是记录日志,相信只要是个程序员都用过,可是咱们自问下,用了这么多年的日志框架,你确定自己真弄懂了日志框架的来龙去脉嘛?下面笔者就详细聊聊java中常用日志框架的...

物理老师教你学Java语言(中篇)(物理专业学编程)

第四章物质的基本结构——类与对象...

一文搞定!Spring Boot3 定时任务操作全攻略

各位互联网大厂的后端开发小伙伴们,在使用SpringBoot3开发项目时,你是否遇到过定时任务实现的难题呢?比如任务调度时间不准确,代码报错却找不到方向,是不是特别头疼?如今,随着互联网业务规模...

你还不懂java的日志系统吗 ?(java的日志类)

一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...

谈谈枚举的新用法--java(java枚举的作用与好处)

问题的由来前段时间改游戏buff功能,干了一件愚蠢的事情,那就是把枚举和运算集合在一起,然后运行一段时间后buff就出现各种问题,我当时懵逼了!事情是这样的,做过游戏的都知道,buff,需要分类型,且...

你还不懂java的日志系统吗(javaw 日志)

一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...

Java 8之后的那些新特性(三):Java System Logger

去年12月份log4j日志框架的一个漏洞,给Java整个行业造成了非常大的影响。这个事情也顺带把log4j这个日志框架推到了争议的最前线。在Java领域,log4j可能相对比较流行。而在log4j之外...

Java开发中的日志管理:让程序“开口说话”

Java开发中的日志管理:让程序“开口说话”日志是程序员的朋友,也是程序的“嘴巴”。它能让程序在运行过程中“开口说话”,告诉我们它的状态、行为以及遇到的问题。在Java开发中,良好的日志管理不仅能帮助...

吊打面试官(十二)--Java语言中ArrayList类一文全掌握

导读...

OS X 效率启动器 Alfred 详解与使用技巧

问:为什么要在Mac上使用效率启动器类应用?答:在非特殊专业用户的环境下,(每天)用户一般可以在系统中进行上百次操作,可以是点击,也可以是拖拽,但这些只是过程,而我们的真正目的是想获得结果,也就是...

Java中 高级的异常处理(java中异常处理的两种方式)

介绍异常处理是软件开发的一个关键方面,尤其是在Java中,这种语言以其稳健性和平台独立性而闻名。正确的异常处理不仅可以防止应用程序崩溃,还有助于调试并向用户提供有意义的反馈。...

【性能调优】全方位教你定位慢SQL,方法介绍下!

1.使用数据库自带工具...

全面了解mysql锁机制(InnoDB)与问题排查

MySQL/InnoDB的加锁,一直是一个常见的话题。例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?下面是不同锁等级的区别表级锁:开销小,加锁快;不会出现死锁;锁定粒度...

看懂这篇文章,你就懂了数据库死锁产生的场景和解决方法

一、什么是死锁加锁(Locking)是数据库在并发访问时保证数据一致性和完整性的主要机制。任何事务都需要获得相应对象上的锁才能访问数据,读取数据的事务通常只需要获得读锁(共享锁),修改数据的事务需要获...