
Tomcat 汤姆猫大家应该都不陌生,是我们Javaer都应该知道的内容,它是一个Web容器,是Java Web的基础,所以我们都应该了解了解其原理相关内容。
我们先从Servlet讲起:
Servlet
在编写Servlet应用时,必须遵守Servlet规范,即Servlet接口和Servlet容器的一整套规范被称作Servlet规范,来看下图:

Servlet通俗将就是一个接口,实现了Servlet的接口的类即我们的业务类,Servlet接口很简单:
public interface Servlet {void init(ServletConfig config) throws ServletException;ServletConfig getServletConfig();void service(ServletRequest req, ServletResponse res)throws ServletException, IOExcString getServletInfo();void destroy();}
其中Service是最重要的方法,是实现业务类的方法,参数是ServletRequest,ServletResponse,其中将请求的所有信息封装成ServletRequest,比如cookie,请求头,ServletResponse则是返回的对象
init和destory是声明周期方法,在servlet创建时调用init方法,在销毁时调用destory方法,可以初始化资源和释放资源
ServetConfig是一个配置对象,封装初始化参数。
Servlet容器:
Servlet容器是用来管理Servlet的,Tomcat将请求交给Servlet容器处理,Servlet容器会转发到具体的Servlet,如果还没有创建,则需要先加载并实例化这个Servlet并调用Servlet的Service方法;
Servlet容器请求流程:
当客户请求某个资源时,HTTP 服务器会用一个 ServletRequest 对象把客户的请求信息封装起来,
然后调用 Servlet 容器的 service 方法,Servlet 容器拿到请求后,根据请求的URL 和 Servlet 的映射关系,找到相应的 Servlet,如果 Servlet 还没有被加载,就用反射机制创建这个 Servlet,
并调用 Servlet 的 init 方法来完成初始化,接着调用 Servlet 的service 方法来处理请求,
把 ServletResponse 对象返回给 HTTP 服务器,HTTP 服务器会把响应发送给客户端
ServletContext
每一个ServletContext对应一个Web应用,Servlet容器在启动时,为每一个Web应用创建一个ServletContext对象,一个Web容器中有可能有多个Servlet,我们就可以将ServletContext看做是一个全局对象,用来共享数据(Web应用的初始化参数、Web应用目录下的文件资源等数据)
Filter
Filter是过滤器,这个接口允许对请求和响应做一些统一的处理,比如你可以根据请求的频率来限制访问,或者过滤不合法字符。
过滤器的工作原理是这样的:
Web 应用部署完成后,Servlet 容器需要实例化 Filter 并把 Filter 链接成一个FilterChain。当请求进来时,获取第一个 Filter 并调用 doFilter 方法,doFilter 方法负责调用这个 FilterChain 中的下一个 Filter。
Listener
Listener是监听器。当 Web 应用在 Servlet 容器中运行时,Servlet容器内部会不断的发生各种事件,如Web应用的启动和停止、用户请求到达等。Servlet容器提供了一些默认的监听器来监听这些事件,当事件发生时,Servlet 容器会负责调用监听器的方法 。
Servlet和Spring的关联
先来一个简单的关联:
Tomcat在启动时给每一个Web应用创建一个全局的上下文环境ServletContext,为Spring提供宿主;
Tomcat在启动过程中触发容器初始化条件,Spring的ContextLoaderListener监听到后触发contextInitialized方法,在这个方法中,初始化全局Spring容器即IoC容器,IoC初始化完后,Spring将其存储到ServletContext中,以便后来获取使用。
一张图足以说明:

本文到此结束,下一篇Tomcat系统架构已更新!




