对于单个servlet来说,其生命周期相当简单:请求来临时,servlet容器根据请求路径匹配对应的servlet定义,调用构造函数实例化servlet。实例化之后,再调用servlet的init()方法进行初始化;如果初始化成功,就调用servlet的service()方法处理请求。请求处理完后,servlet的destroy()方法被调用。

根据API的说明,只有当servelt的init方法满足以下条件时,servlet才可以接受请求:

  •  不能抛出ServletException;
  •  必须在Web服务器定义的时间内返回;

由此可以看出,一个servlet是否准备就绪关键是看init方法是否执行成功。

调用init方法时会传递一个ServletConfig对象,把web.xml中配置的<init-param>等参数传给servelt。同时,ServletConfig也给出了servlet运行时的环境ServletContext。

在实例化的过程中,可能会出现UnavailableException(UnavailableException自带一些信息表示这个servlet是临时不能实例化还是永久不能实例化;如果是临时的,又需要等多久)。如果是临时不能实例化,则servlet容器必须要等待一段时间才能实例化这个servlet。在此期间被拒绝的任何请求都必须返回503错误。如果是永久不能实例化,则被拒绝的请求都必须返回404错误。

在实例化的过程中,如果出现的是ServletException,servelt容器可能会重新实例化一个新的servlet。

并发处理

当请求来临时,servlet容器会初始化对应的servlet。如果多个请求同时访问的是同一个servlet,Servlet容器会创建多个线程同时调用servlet的service()方法来处理这些请求,而不是多个servlet实例。

如果给service方法设置了synchronized关键字,servlet容器则是序列化请求依次通过service方法。

但如果servlet实现了SingleThreadModel接口(此时,这个servlet只能一次处理一个请求),那么servlet容器会根据请求的数量创建多个servlet的实例(每个servlet实例相当于一个线程),并调用servlet的service方法来处理请求。


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐