一、前言
恰巧发现一本猛书《How tomcat works》 。此书的特点是,以一个程序示例贯穿全书,该示例从最简单的http server开始,根据Tomcat的组成结构,一章一章长大,逐步羽翼丰满,最终变成一个强大的Servlet容器。因此,如果把全书读下来,对Tomcat的组成结构和运行机理,乃至设计原理,应该会有一个不错的了解。
二、Servlet 容器是如何工作的
Servlet容器是一个挺复杂的系统。但是,基本上,针对一个servel的request请求,servlet需要做以下三件事情:
- 创建一个实现了javax.servlet.ServletRequest 接口或javax.servlet.http.ServletRequest 接口的Request对象,并且用请求参数、请求头(headers)、cookies、查询字符串、URI等信息填充该Request对象;
- 创建一个实现了javax.servlet.ServletResponse 接口或javax.servlet.http.ServletResponse 接口的Response对象;
- 调用相应的servlet的服务方法,将先前创建的request对象和response对象作为参数传入。接收请求的servlet从request对象中读取信息,并且将返回值写入到response对象中。
三、Catalina结构图
Catalina本身是一个成熟的软件,设计开发结构十分的优雅,功能结构模块化。从servlet容器的功能角度上看,catalina可以划分为两大模块:connector模块和container模块。
这里connector的功能是将用户请求与container连接。connector的任务是为每个接收到的HTTP请求建立request对象和response对象。然后,将处理过程交给container模块。container 模块从connector中接收到request对象和response对象,并且负责调用相应的servlet的服务方法。
当然,上面只是对这个处理过程简化描述。在处理过程中,container还要做很多其他的事情。例如,在调用servlet的服务方法前,它必须载入改sevlet,对用户身份进行认证(需要的话),更新该用户的session对象等。