一,概要知识

1.Servlet容器有两个作用:
  • 处理request servlet资源
  • 为web客户端填充response
2.Tomcat中有四种类型的容器:
  • Engine:表示整个Catalina servlet引擎;
  • Host:表示包含有一个或多个Context容器的虚拟主机;
  • Context:表示一个web应用程序。一个Context可以有多个Wrapper;
  • Wrapper:表示一个独立的servlet
注意,上述四种容器都是接口,它们在Tomcat中有标准实现类:StandardEngine、StandardHost、StandardContext、StandardWrapper

3.Tomcat中的servlet容器必须要实现Container接口

4.Container类图


注意:部署Catalina的时候,不须要把所有的四种容器都包括在内,而且使用的实现类也不必要是标准实现类。

5.Container可以包含一些支持的组件:载入器、记录器、管理器、领域和资源等。通过Container接口里面的get、set方法关联。这些组件构成了独立的模块,每个模块设计都很复杂,这里不加讨论。



二,Pipeline和Valve机制

在容器初始化或者创建的时候,制定一个管道,并给管道加上一些阀。每个管道都有一个基础阀,在最后执行。

至于怎么实现的,看代码演示。

总结:连接器invoke一个容器,比如是一个Engine对象,这个Engine对象invoke它的Pipeline,Pipeline再invoke一个个的阀,在基础阀一般会用一个映射器确定是哪个Host对象,然后invoke这个Host对象……以此类推,直到invoke一个Wrapper对象的基础阀。这个基础阀调用加载器,实例化或者引用对应的servlet,并把强制转换后的HttpServletRequest和HttpServletResponse对象传给这个servlet处理。



从连接器开始,看看信息是怎么流转的:

客户端把HTTP信息包装成Socket发送给Tomcat,Tomcat的连接器把这个Socket分配给不同的处理器同时处理,处理器把Socket里面的信息包装成Tomcat的Request和Response对象,并交给容器,容器经过管道和阀,把Tomcat的Request和Response强制转换成Servlet API对象,并交给Servlet处理。