Servlet的生命周期与并发处理
对于单个servlet来说,其生命周期相当简单:请求来临时,servlet容器根据请求路径匹配对应的servlet定义,调用构造函数实例化servlet。实例化之后,再调用servlet的init()方法进行初始化;如果初始化成功,就调用servlet的service()方法处理请求。请求处理完后,servlet的destroy()方法被调用。根据API的说明,只有当servelt的init方
对于单个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方法来处理请求。
更多推荐
所有评论(0)