Servlet&JSP基础篇之Servlet的生命周期
首先介绍容器对Servlet的控制,流程如下:
点击一个指向某个Servlet的URL。
容器得知该URL指向一个Servlet,创建两个对象:HttpServletResponse,HttpServletRequest
容器根据根据URL找到相应的Servlet,并为其分配或者创建一个线程,调用其service()方法。
service()方法会根据客户发出的Http方法(GET,POST)调用Servlet的doGET()或者doPOST()并传入HttpServletResponse和HttpServletRequest。
Servlet使用响应对象将响应写至客户。响应由容器传回。
service()方法结束,所以线程要么撤回,要么返回到容器管理的一个线程池。请求和响应的对象引用已经出了作用域,所以这些对象已经没有意义。
客户得到响应。
问题一: Servlet何时产生?
在上述流程中,直接从Servlet中期切入,并未说明Servlet何时产生的。
首先,Servlet只有四个状态:
- 不存在
- 正在初始化
- 初始化(主要状态)
- 正在撤销
这四个状态正是Servlet的“一生”,下面将依次介绍:
1. 不存在状态
在Servlet类加载及之前都属于这个状态,没什么好说的。
2.正在初始化
运行构造函数和init()方法构成了这个状态的主要内容。需要注意的是,运行完构造函数,还不能称其为真正的Servlet,此时,该类还不能提供Servlet服务,init()方法之后才可以,不过之后也就进入了初始化状态。init()可复写,使你在处理客户请求之前有机会进行一些初始化代码,只可以调用一次。
3.初始化状态
该状态主要包含service()方法,Servlet大部分时间在此方法里,用于处理客户请求(GET,POST)。需要注意的是,每个请求都在不同的线程里运行,而Servlet只有一个实例。service()方法不需要覆盖,一般覆盖的是doGET或者doPOST。
4.正在撤销
该状态的主要方法是destroy(),此方法用于在Servlet实例在被垃圾回收之前清理资源,只可以调用一次。