## Servlet生命周期
Servlet生命周期可被定义为从创建直到毁灭的整个过程,一下是Servlet遵循的过程:
- Servlet初始化后调用init()方法
- Servlet调用service()方法来处理客服端的请求
- Servlet销毁前调用destroy()方法
- 最后,Servlet是由JVM的垃圾回收机制进行垃圾回收的
init()方法
init方法被设计成只调用一次,他在第一次创建Servlet时被调用,在后续每次用户请求时不在调用,因此,它是用于一次性初始化。
Servlet创建与用户第一次调用对应于该Servlet的URL时,但是也可以指定Servlet在服务器第一次启动时被加载当用户调用一个Servlet时,就会创建一个Servlet实例,每一个用户请求都会产生一个新的线程,适当的时候移交给doGet或者doPost方法,init方法简单的创建或加载一些数据,这些数据即将被用于Servlet的整个生命周期。
init方法的定义如下:
public void init() throws ServletException{
//初始化代码
}
Service()方法
service方法时执行实际任务的主要方法,Servlet容器(即Web服务器)调用service()方法处理来自客服端(浏览器)的请求,并把格式化的响应写回给客服端
每次服务器接收到一个Servlet请求时,服务器会产生一个新的线程并调用服务。service()方法检查HTTP请求类型(get、post、put、delete),并在适当的时候调用doGet()、doPost()、doPut()、doDelete()等方法
下面是该方法的特征:
public void service(ServletRequest request,ServletResponse response) throws ServletException,IOException{
}
service() 方法由容器调用,service 方法在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。所以,不用对 service() 方法做任何动作,只需要根据来自客户端的请求类型来重写 doGet() 或 doPost() 即可。
doGet() 和 doPost() 方法是每次服务请求中最常用的方法。下面是这两种方法的特征。
doGet()方法
Get请求来自于一个URL的正常请求,或者来自于一个未指定METHOD的HTML表单,它由doGet方法处理
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
//Servlet代码
}
doPost()方法
POST请求来自于一个特别指定了METHOD为POST的HTML表单,它由doPost()方法处理
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
//Servlet代码
}
destroy()方法
destroy()方法只会被调用一次,在Servlet生命周期结束时被调用,destroy()方法可以让您的Servlet关闭数据库连接、停止后台线程,把cookie列表或点击计数器写入到磁盘,并执行其他类似的清理活动
在调用destroy()方法之后,servlet对象被标记为垃圾回收,destroy()方法的定义如下:
public void destroy(){
//终止化代码……
}
架构图
下图显示了一个典型的 Servlet 生命周期方案。
- 第一个到达服务器的 HTTP 请求被委派到 Servlet 容器。
- Servlet 容器在调用 service() 方法之前加载 Servlet。
- 然后 Servlet 容器处理由多个线程产生的多个请求,每个线程执行一个单一的 Servlet 实例的 service() 方法