💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
### Container Servlet容器-Container Container 是容器的父接口,所有子容器都必须实现这个接口,Container 容器的设计用的是典型的责任链的设计模式,它有四个子容器组件构成,分别是:Engine、Host、Context、Wrapper,这四个组件不是平行的,而是父子关系,Engine 包含 Host,Host 包含 Context,Context 包含 Wrapper。通常一个 Servlet class 对应一个 Wrapper,如果有多个 Servlet 就可以定义多个 Wrapper,如果有多个 Wrapper 就要定义一个更高的 Container 了,如 Context,Context 通常就是对应下面这个配置: ~~~xml <Context path="/library" docBase="D:\projects\library\deploy\target\library.war" reloadable="true" /> ~~~ 要注意的是这 4 种容器不是平行关系,属于父子关系,如下图所示: ![](https://img.kancloud.cn/ca/99/ca9910f00f39cc43d2ea94867e791402_1172x718.png) ###### 容器的总体设计 Context 还可以定义在父容器 Host 中,Host 不是必须的,但是要运行 war 程序,就必须要 Host,因为 war 中必有 web.xml 文件,这个文件的解析就需要 Host 了,如果要有多个 Host 就要定义一个 top 容器 Engine 了。而 Engine 没有父容器了,一个 Engine 代表一个完整的 Servlet 引擎。 可通过 Tomcat 配置文件加深对其层次关系理解: ``` <Server port="8005" shutdown="SHUTDOWN"> // 顶层组件,可包含多个 Service,代表一个 Tomcat 实例 <Service name="Catalina"> // 顶层组件,包含一个 Engine ,多个连接器 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <!-- Define an AJP 1.3 Connector on port 8009 --> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> // 连接器 // 容器组件:一个 Engine 处理 Service 所有请求,包含多个 Host <Engine name="Catalina" defaultHost="localhost"> // 容器组件:处理指定Host下的客户端请求, 可包含多个 Context <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> // 容器组件:处理特定 Context Web应用的所有客户端请求 <Context></Context> </Host> </Engine> </Service> </Server> ``` 当 Connector 接受到一个连接请求时,将请求交给 Container,Container 是如何处理这个请求的?这四个组件是怎么分工的,怎么把请求传给特定的子容器的呢?又是如何将最终的请求交给 Servlet 处理。下面是这个过程的时序图: ![](https://img.kancloud.cn/76/4a/764a2ee14a746869b1e9ecd1fcf55064_572x520.png)