首先来了解一下

Tomcat的容器架构

223556348.png

----Server(服务器)是Tomcat顶级构成元素,所有一切均包含在Server中,Server的实现类StandardServer可以包含一个到多个Services;

----次顶级元素Service的实现类为StandardService调用了容器(Container)接口,其实是调用了Servlet Engine(引擎),而且StandardService类中也指明了该Service归属的Server;

----接下来次级的构成元素就是容器(Container),主机(Host)、上下文(Context)和引擎(Engine)均继承自Container接口,所以它们都是容器。但是,它们是有父子关系的,在主机(Host)、上下文(Context)和引擎(Engine)这三类容器中,引擎是顶级容器,直接包含是主机容器,而主机容器又包含上下文容器,所以引擎、主机和上下文从大小上来说又构成父子关系,虽然它们都继承自Container接口。

---连接器(Connector)将Service和Container连接起来,首先它需要注册到一个Service,它的作用就是把来自客户端的请求转发到Container(容器),这就是它为什么称作连接器的原因。


Tomcat运行流程:

231924976.png


Servlet有关知识

   上面讲到context容器context容器是直接管理servlet的运行,也就是说他是servlet运行时所在的容器,servlet会被其给包装成一个Wrapper类去运行,一个context对应一个工程(配置),一个web应用对应一个Context容器,添加一个web应用会创建一个standardContext容器,并且会给这个容器设置必要的参数url和path,其中最重要的一个配置是contextConfig,这个类将负责web应用配置的解析工作(主要是解析web.xml文件,这个文件描述的是一个web应用的关键信息,也是一个web应用的入口),最后将这个context容器加入到host容器中。

   前面说道servlet被其所在的容器包装成一个StandardWrapper类,为什么tomcat要这样去做呢?为什么不把他直接包装成一个servelt对象呢?据我猜测,因为这里StandardWrapper是tomcat的一部分,就是说它具有容器的特征,而servlet作为一个独立的开发标准,他不应该被创建成servlet对象耦合在tomcat中运行,而是应该尽量的和tomcat解耦。servlet被包装后,也被加入到context容器中。

serlvet体系结构

 

   233546485.png



serlvet是基于这几个类运转的(待续)