“Tomcat是一个Servlet容器”,这句话2019年的程序员应该不会陌生,简单的想一下这句话,我们可以抽象出这么一段代码:如果Tomcat长这个样子,那肯定行不通,所以Tomcat其实是这样的:我们这里不考虑Connector的底层实现,我们只需要知道Connector负责处理请求即可。仍然考虑容器。Context顾名思义,Servlet容器就是用来加载和存储Servlet的。一个Servlet代表一个运行在服务器端的程序(servlet=server+applet)。用户要使用这个程序需要向程序发送请求,得到程序的响应,即Servlet规范中的ServletRequest和ServletResponse。所以Servlet其实是Java中处理请求的一种规范,所以我们的项目中通常会有一个或多个Servlet,Servlet负责接收请求或者将请求转发给其他业务逻辑。所以我们的SpringMVC和SpringBoot都有一个DispatcherServlet(功能类似的Servlet,负责接收请求)。因此,通常Servlets属于一个应用程序(项目)。也就是说,我们的一个应用中包含了多个Servlet,那么这个就是第二层的Servlet容器-应用,也就是Tomcat中的Context(应用上下文)。那么第一层Servlet容器呢?WrapperWrapper是Servlet容器的第一层,Wrapper代表Servlet的包装器,所以它是最接近Servlet的,那为什么还需要Wrapper呢?我们通常会这样想Wrapper:一个Wrapper对应一个Servlet,如果这样想的话,Wrapper确实是不需要的,但是我们还需要考虑一些其他的情况:比如Filter,一个Filter可以对应一个Servlet.比如ServletPool,通常的Servlet是所有请求线程通用的,但是Servlet中支持每个请求线程使用独立的Servlet实例。所以在Wrapper中,不仅包括一个Servlet,还包括过滤器和Servlet池,所以Wrapper是Servlet容器的第一层。Host在我们现实生活中,一个应用程序部署在一个主机上,所以一个主机可以包含多个应用程序,一个应用程序可以包含多个Servlet,所以Host是一个三层容器。在Tomcat中,Host代表一个虚拟主机。Tomcat在处理请求时,可以根据请求的域名进入相应的Host进行处理。EngineHost管理Context,Context管理Wrapper,Wrapper管理Servlet,Engine用来管理Host。所以Engine是第四层容器。最后肯定有人会有疑问,那么Engine上是不是不需要容器呢?不再?比如:我们的钱(Servlet)要放在钱包(Wrapper)里,钱包要放在书包里(Context),而书包要放在行李箱(Host)里,行李箱要放在在飞机上(引擎)。所以,如果你问我“引擎在哪里?”相当于问我“飞机在哪里?”答案是不需要更高级别的容器,因为没有必要。总结在Tomcat中,容器分为:WrapperContextHostEngine
