天天看点

深入理解Tomcat系列之六:Servlet工作原理

前言

servlet是web开发中的核心技术,作为一名合格的开发人员,就必须清楚servlet的工作原理。本章没有对servlet技术本身进行详细的说明,只是针对开发过程中一次servlet的请求的处理过程进行分析的。servlet实际上就是一个java类,只不过可以和浏览器进行一些数据的交换。有servlet类就有管理servlet的容器,种类有很多,这里主要针对tomcat对servlet的工作原理进行说明。为了说清楚servlet工作原理,需要知道servlet的工作过程大致可以分为以下几个阶段:

1. 启动tomcat容器

2. web应用初始化

3. 创建servlet实例

4. 初始化servlet

5. 执行servlet的service方法

tomcat的启动过程

这部分可以用下图进行简化:

深入理解Tomcat系列之六:Servlet工作原理

web应用初始化

下面分析web应用的初始化,初始化工作是由contextconfig类的configurestart方法完成的,该方法的主要任务是完成web.xml配置文件的解析。下面解析的关键代码:

代码清单5-1:

在代码已经清晰地说明了web应用的初始化过程,由于在tomcat7中增加了对注解(annotation)的支持,所以会对servlet中的注解进行解析。首先查找jar包中的web-fragment.xml,并对其进行解析,接下来将对/web-inf/classes目录下的class进行注解的解析。之后,把web-fragment.xml文件合并到web.xml中,被解析后的web.xml文件的配置项将保存到webxml对象中,然后把webxml对象中的属性设置到context容器中,这个过程是由configurecontext方法来完成的。下面是其部分源码——完成servlet的解析:

代码清单5-2:

这段代码说明了把servlet包装成standardwrapper的过程,并把这个wrapper实例设置到context容器中。之所以要把servlet封装成一个wrapper,主要为了解耦,因为wrapper是一个容器而servlet是一个具体的类。

到目前为止,已经完成了web应用的初始化,其中将web.xml进行了解析并完成了注解的解析,还把配置的servlet类封装成了一个wrapper容器,接下来就是根据这个wrapper创建servlet实例了。

创建servlet实例

创建servlet实例要回到我们分析wrapper容器中提到的loadservlet方法了,这个方法是由wrapper容器的标准实现类standardwrapper完成的,通过loadservlet方法获取servletclass,然后把这个servletclass交给实例管理器(instancemanager)完成servletclass.class的对象创建。

初始化servlet

初始化的工作是由standardwrapper的initservlet方法完成的,这个方法主要就是调用servlet的init方法,然后把包装了standardwrapper的standardwrapperfacade交给servlet。下面是这个方法的源码:

代码清单5-3:

这样就完成了servlet的初始化,下面就是执行servlet的service方法了。

执行service方法

在分析wrapper方法中提到,standardwrapper会调用allocate方法从实例池栈中弹出一个servlet处理请求,这个servlet实例在完成初始化后,并经过一系列过滤器的过滤后就到达servlet实例的service方法,这个过程就是过滤器执行的过程。这样servlet实例就顺利调用到了service方法,之后发生的过程就是我们熟悉的request获取参数并用response进行响应的过程了。

继续阅读