**1.结构图**
![](https://img.kancloud.cn/77/9b/779b44e701edf01dcff7230f6ea1eb38_532x356.png)
tomcat主要组件
服务器Server,服务Service,连接器Connector,容器Container
**2.Connector**
一个Connecter将在某个指定的端口上侦听客户请求,接收浏览器的发过来的 tcp 连接请求,创建一个 Request 和 Response 对象分别用于和请求端交换数据,然后会产生一个线程来处理这个请求并把产生的 Request 和 Response 对象传给处理Engine(Container中的一部分),从Engine出获得响应并返回客户。
Tomcat中有两个经典的Connector,一个直接侦听来自Browser的HTTP请求,另外一个来自其他的WebServer请求。HTTP/1.1 Connector在端口8080处侦听来自客户Browser的HTTP请求,AJP/1.3 Connector在端口8009处侦听其他Web Server(其他的HTTP服务器)的Servlet/JSP请求。
Connector 最重要的功能就是接收连接请求然后分配线程让 Container 来处理这个请求,所以这必然是多线程的,多线程的处理是 Connector 设计的核心。
![](https://img.kancloud.cn/61/ee/61ee441b613ccfc2a29f0ca9b94f0b09_432x315.png)
**3.Container**
Container是容器的父接口,该容器的设计用的是典型的责任链的设计模式,它由四个自容器组件构成,分别是Engine、Host、Context、Wrapper。这四个组件是负责关系,存在包含关系。通常一个Servlet class对应一个Wrapper,如果有多个Servlet定义多个Wrapper,如果有多个Wrapper就要定义一个更高的Container,如Context。
Context 还可以定义在父容器 Host 中,Host 不是必须的,但是要运行 war 程序,就必须要 Host,因为 war 中必有 web.xml 文件,这个文件的解析就需要 Host 了,如果要有多个 Host 就要定义一个 top 容器 Engine 了。而 Engine 没有父容器了,一个 Engine 代表一个完整的 Servlet 引擎。
Engine 容器
Engine 容器比较简单,它只定义了一些基本的关联关系
Host 容器
Host 是 Engine 的子容器,一个 Host 在 Engine 中代表一个虚拟主机,这个虚拟主机的作用就是运行多个应用,它负责安装和展开这些应用,并且标识这个应用以便能够区分它们。它的子容器通常是 Context,它除了关联子容器外,还有就是保存一个主机应该有的信息。
Context 容器
Context 代表 Servlet 的 Context,它具备了 Servlet 运行的基本环境,理论上只要有 Context 就能运行 Servlet 了。简单的 Tomcat 可以没有 Engine 和 Host。Context 最重要的功能就是管理它里面的 Servlet 实例,Servlet 实例在 Context 中是以 Wrapper 出现的,还有一点就是 Context 如何才能找到正确的 Servlet 来执行它呢? Tomcat5 以前是通过一个 Mapper 类来管理的,Tomcat5 以后这个功能被移到了 request 中,在前面的时序图中就可以发现获取子容器都是通过 request 来分配的。
Wrapper 容器
Wrapper 代表一个 Servlet,它负责管理一个 Servlet,包括的 Servlet 的装载、初始化、执行以及资源回收。Wrapper 是最底层的容器,它没有子容器了,所以调用它的 addChild 将会报错。
Wrapper 的实现类是 StandardWrapper,StandardWrapper 还实现了拥有一个 Servlet 初始化信息的 ServletConfig,由此看出 StandardWrapper 将直接和 Servlet 的各种信息打交道。
**4.其他组件**
Tomcat 还有其它重要的组件,如安全组件 security、logger 日志组件、session、mbeans、naming 等其它组件。这些组件共同为 Connector 和 Container 提供必要的服务。
**5.http请求过程**
![](https://img.kancloud.cn/27/f2/27f2ddabc821806e16d540b3149c517d_751x392.png)
1、用户点击网页内容,请求被发送到本机端口8080,被在那里监听的Coyote HTTP/1.1 Connector获得。
2、Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应。
3、Engine获得请求localhost/test/index.jsp,匹配所有的虚拟主机Host。
4、Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机),名为localhost的Host获得请求/test/index.jsp,匹配它所拥有的所有的Context。Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为“ ”的Context去处理)。
5、path=“/test”的Context获得请求/index.jsp,在它的mapping table中寻找出对应的Servlet。Context匹配到URL PATTERN为*.jsp的Servlet,对应于JspServlet类。
6、构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet()或doPost().执行业务逻辑、数据存储等程序。
7、Context把执行完之后的HttpServletResponse对象返回给Host。
8、Host把HttpServletResponse对象返回给Engine。
9、Engine把HttpServletResponse对象返回Connector。
10、Connector把HttpServletResponse对象返回给客户Browser。
- mybatis
- 基础
- maven依赖
- 主配置文件
- 实体映射表
- Mapper接口
- xxxMapper.xml
- 代码测试
- CURD
- 查询操作
- 新增操作
- 修改操作
- 删除操作
- 生命周期&作用域
- 实体类型配置别名
- 进阶查询
- 列名与属性名不对应
- 多条件sql查询
- 模糊查询
- 获取保存后的主键
- 动态sql
- where配合If
- where配合choose
- where配合foreach
- Sql片段
- 关联查询
- 表结构设计及实体类
- 多对一&一对一
- 一对多
- 多对多
- 嵌套查询(多条sql)
- 多对一&一对一
- 一对多
- 多对多
- 加载策略
- 缓存
- 一级缓存
- 二级缓存
- 配置进阶
- properties
- mapper注册
- 连接池
- 注解开发
- spring
- 基础
- maven依赖
- bean创建
- 基础配置
- 测试代码
- 简单原理
- 构造方法创建对象
- 静态工厂创建对象
- 动态工厂创建对象
- 作用域
- 初始化&销毁方法
- 单例和原型作用域
- 依赖注入
- 构造方法注入
- set方法注入
- 集合&数组属性注入
- 配置文件模块化
- 注解配置
- 配置相关
- 注解释义
- 纯注解配置
- 小结
- Spring整合junit
- 依赖管理
- 使用
- Aop
- 依赖管理
- 配置相关
- aopDemo(非环绕通知)
- 名词解释
- 环绕通知
- xml混合注解Aop开发
- 纯注解Aop
- Aop事务
- 代理相关
- 动态代理观光代码
- cglib代理观光代码
- SpringMVC
- 基础
- 依赖管理
- 配置web.xml
- spring-mvc.xml
- idea tomcat配置
- Hello Controller
- Api解析
- @Controller
- @RequestMapping
- 编码问题解决
- 获取请求头信息
- 获取Cookie的值
- json相关
- 依赖管理
- 接收json请求参数
- 以json形式返回给客户端
- restful风格
- 转发
- 重定向
- 页面传值
- Request域
- Session域
- Aop异常处理
- 拦截器
- 番外篇
- Tomcat
- Servlet
- 创建
- 线程安全问题
- 生命周期相关
- Filter
- Listener
- ssm整合
- mybatis基础篇
- mybatis依赖
- mybatis实体
- Mapper接口
- mybatis配置
- 测试代码
- spring基础篇
- 依赖
- AccountService接口
- AccountServiceImpl
- 测试代码
- springmvc
- 依赖
- web.xml
- spring-mvc.xml
- AccountController
- spring整合mybatis
- 依赖
- 配置
- spring整合springmvc
- web.xml
- SpringBoot
- maven配置
- 引入SpringBoot技术
- 入口及测试控制器
- 打包插件
- 配置相关
- 配置实践
- 配置自动适配
- 配置校验
- 配置文件制定
- SpringBoot整合Junit
- 整合mybatis
- 依赖管理
- 配置相关
- @Mapper
- 整合freemarker
- 依赖管理
- 配置相关
- 测试控制器
- 目录相关
- 验证器
- maven依赖
- 验证器定义
- 控制器接收参数
- 全局异常通知
- filter跨域解决方案
- 模板相关问题
- 上传解决方案
- redis相关
- maven依赖管理
- 配置相关
- cache简单封装
- json处理
- SpringCloud
- 简介
- 版本号
- eureka
- 简介
- 组件
- eureka服务依赖
- eureka配置
- 项目启动
- 父类依赖库
- eureka_cli
- eureka客户端依赖
- 配置项
- 启动项
- eureka集群原理
- ribbon
- maven
- 配置
- 微服务实战
- 项目架构
- 基类依赖
- eureka注册中心
- 1依赖相关
- 2.配置相关
- 3.启动项
- 业务service
- supergo-manager-service
- 依赖
- 配置
- 数据源监控
- 启动项
- feign调用
- supergo-manager-feign
- 依赖
- 调用代码
- 接口层
- supergo-manager-web
- 依赖
- 配置项
- 启动项
- 通用mapper
- 逆向工程
- 数据库连接配置
- 逆向工程配置
- 操作
- base-service
- 简介
- 跨域
- 网关层
- zuul
- 依赖项
- 配置
- 启动项