最近在开发一个项目,用到了servlet底层的原理,又重新复习下,在这里和大家共享下,希望对大家有所帮助。主要介绍了下,servlet的体系结构、生命周期、servlet的实例,servlet请求以及servlet的销毁。

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实例化后,会调用servlet的init()方法,这个方法就是用来初始化的。你可以重写这个方法,根据自己的需求去初始化这个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会调用该servlet的service()方法去处理请求。在处理请求期间发生错误会抛出ServletException和UnavialbleException。

当UnavialbleException标志该servlet为永久不可用的servlet时,servlet容器就会调用该servlet的destory()方法销毁该servlet,并返回给客户端HTTP404错误(请求的资源不可用或不存在)。

当UnavialbleException标志该servlet为暂时不可用的servlet时,servlet容器将返回给客户端HTTP503错误(服务器忙,不能处理请求)

 

2.4 Servlet的销毁

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

 

3. servlet生命周期时序图