发布时间:2022-12-02 文章分类:编程知识 投稿人:李佳 字号: 默认 | | 超大 打印

javaweb三大组件

java web:Servlet,Filter,Listener

三大组件的各自功能:

tomcat架构

Tomcat功能

从最开始Tomcat的介绍来看,Tomcat有点像一个Servlet官方一点就是:Tomcat 是 Web 应用服务器,是一个 Servlet/JSP 容器,而 Servlet 容器从上到下分别是 Engine、Host、Context、Wrapper。

内存马基础知识

顶层架构

来一张顶层架构图

内存马基础知识

Service主要包含两个部分:Connector和Container。从上图中可以看出 Tomcat 的心脏就是这两个组件,他们的作用如下:

1、Connector用于处理连接相关的事情,并提供Socket与Request和Response相关的转化;
2、Container用于封装和管理Servlet,以及具体处理Request请求;

一个tomcat只能启动一个server但是可以有多个service,,一个Service只有一个Container,但是可以有多个Connectors,代表的就是一个service运行有多个连接

多个connector和一个Container行成一个service,service就可以向提供服务了,但是service是可以有多个的所以就需要有东西来控制service的生产周期,跟k8s的架构有些类似类似在k8s中的(Kubelet 负责维护容器的生命周期)

connecter

作为Tomcat的核心组件之一,它是用来接受客户端发送的请求然后把它一个 Request 和 Response 对象分别用于和请求端交换数据(这里转换的不是Servletrequest()和ServletResponse)

socket 通信
解析处理应用层协议,如将 socket 连接封装成 request 和 response 对象,后续交给 Container 来处理
将 Request 转换为 ServletRequest,将 Response 转换为 ServletResponse
Adapter 组件

由于协议的不同,Tomcat 定义了自己的 Request 类来存放请求信息,但是这个不是标准的 ServletRequest。于是需要使用 Adapter 将 Tomcat Request 对象转成 ServletRequest 对象,然后就能调用容器的 service 方法。
这个组件的作用就是把tomcat的特有的request转化成Servlet的Sservletreques。

Adapter 组件的结构图

内存马基础知识

Container组件

Container(又名Catalina)用于处理Connector发过来的servlet连接请求,它是容器的父接口,所有子容器都必须实现这个接口,Container 容器的设计用的是典型的责任链的设计模式,它有四个子容器组件构成,分别是:Engine、Host、Context、Wrapper,这四个组件不是平行的,而是父子关系,Engine 包含 Host,Host 包含 Context,Context 包含 Wrapper。

Tomcat 设计了 4 种容器: Engine、Host、Context、Wrapper ,这四种容器是父子关系

内存马基础知识

Tomcat的类加载机制

由于 Tomcat 中有多个 WebApp 同时要确保之间相互隔离,所以 Tomcat 的类加载机制也不是传统的双亲委派机制。

Tomcat 自定义的类加载器 WebAppClassloader 为了确保隔离多个 WebApp 之间相互隔离,所以打破了双亲委托机制。每个 WebApp 用一个独有的 ClassLoader 实例来优先处理加载。它首先尝试自己加载某个类,如果找不到再交给父类加载器,其目的是优先加载 WEB 应用自己定义的类。

同时为了防止 WEB 应用自己的类覆盖 JRE 的核心类,在本地 WEB 应用目录下查找之前,先使用 ExtClassLoader(使用双亲委托机制)去加载,这样既打破了双亲委托,同时也能安全加载类。

这一点在CommonsBeanutils1链中就有体现,就是它tomcat有自己的

小结

(1)Tomcat中只有一个Server,一个Server可以有多个Service,一个Service可以有多个Connector和一个Container;
(2) Server掌管着整个Tomcat的生死大权;
(4)Service 是对外提供服务的;
(5)Connector用于接受请求并将请求封装成Request和Response来具体处理;
(6)Container用于封装和管理Servlet,以及具体处理request请求;