1. servlet体系结构

servelt我们可以理解为一个实现了可以接受请求并响应请求的java类。servlet类的体系结构如下图
  
GenericServlet抽象类-----实现了Servlet接口和ServletConfig接口和Serializable接口
HttpServlet抽象类继-----承于GenericServlet抽象类

2.servlet生命周期

init()方法和destory()方法都只调用一次,service()方法每接受一个请求,都会调用一次service()方法。
 

2.1 Servlet容器实例化某个Servlet对象

web.xml里面可以配置一个标签,让某个servlet类在Servlet容器启动的时候就创建这个servlet 类的一个对象。如果不配置servlet容器启动创建servlet对象,则当某个servlet接收到客户端的请求时,才创建这个servlet对象
 

2.2 某个Servlet对象初始化

Servlet实例化后,会调用servletinit()方法,这个方法就是用来初始化的。你可以重写这个方法,根据自己的需求去初始化这个servlet实例。
如果你在web.xml为这个Servlet实例配置了初始化参数,如下
  <servlet>
    <servlet-name>LoginDispatcher</servlet-name>   
    <servlet-class>requestdispatcher.LoginDispatcher</servlet-class>   
<init-param>   
<param-name>name</param-name>   
<param-value>zhangsan</param-value>   
</init-param>
  </servlet>
你可以调用ServletConfig接口的getInitParameter()方法去获得这些初始化参数。由上面类图我们可以知道GenericServlet抽象类实现了ServletConfig接口。
这里有两个异常要介绍:
ServletException:一般用来指明某个servlet初始化失败,例如找不到初始化参数
UnavailbleException:用于通知servlet容器该servlet实例不可用,例如当这个servlet在初始化的时候调用数据库连接失败,那么这个Servlet就不可用了,于是必须通知Servlet容器,告诉它这个Servlet对象不可用
 

2.3 Servlet处理请求

当客户端发送请求给某个servlet的时候,servlet会调用该servletservice()方法去处理请求。在处理请求期间发生错误会抛出ServletExceptionUnavialbleException
UnavialbleException标志该servlet为永久不可用的servlet时,servlet容器就会调用该servletdestory()方法销毁该servlet,并返回给客户端HTTP404错误(请求的资源不可用或不存在)。
UnavialbleException标志该servlet为暂时不可用的servlet时,servlet容器将返回给客户端HTTP503错误(服务器忙,不能处理请求)
 

2.4 Servlet的销毁

servlet容器要销毁某个servlet之前,servlet容器会调用该servletdestory()方法,去释放一些资源,例如:数据库连接等等
 

3. servlet生命周期时序图



Server创建一个Servlet的实例
 Server调用Servlet的init()方法
 一个客户端的请求到达Server
 Server创建一个请求对象
 Server创建一个响应对象
 Server激活Servlet的service()方法,传递请求和响应对象作为参数
 Service()方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息,service()方法使用响应对象的方法,将响应传回 Server,最终到达客户端。service()方法可能激活其它方法以处理请求,如doGet()或doPost()或程序员自己开发的新的方法
 最后自动调用Destroy()方法来销毁对象。