Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
Servlet生命周期可以被定义为从创建到毁灭的整个过程。下面是Servlet的过程:
- 加载Servlet
- Servlet通过调用init()方法进行初始化
- Servlet调用service()方法来处理客户端的请求
- Servlet调用destroy()方法来终止(结束)
最后Servlet是由jvm的垃圾回收器进行垃圾回收的
加载Servlet
Servlet容器加载所执行的操作:
- 加载Servlet类
- 创建Servlet并进行实例化
如果Servlet不在前一阶段,它可能会延迟加载过程,因为要知道web容器确定需要Servlet来请求提供服务。
init()方法
init()方法被设计只能调用一次。它在第一次创建Servlet时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化。
Servlet创建于用户第一次调用对应于该Servlet的URL时也可以指定 Servlet 在服务器第一次启动时被加载。
当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,也就是说,每个用户的请求都会导致service方法被调用执行,其执行过程分别运行在不同的线程当中,适当的时候移交给 doGet 或 doPost 方法。init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。
init方法的定义如下:
public void init() throws ServletException {
// 初始化代码...
}
service()方法
当servlet成功创建和初始化之后,调用service方法来处理用户的请求并返回响应。服务器将两个参数值传递给该方法。一个是HttpServletRequest类型的对象,该对象封装了用户的请求信息;另一个参数对象是HttpServletRespones类型的对象,该对象用来响应用户的请求。service方法可以被调用很多次,也就是说,当后续的用户请求该servlet时,服务器将启动一个新的线程,在该线程中servlet调用service方法响应用户的请求,即每个用户的请求都导致service方法被调用执行,调用过程运行在不同的线程当中,互不干扰。因此,不同线程的service方法中的局部变量互不干扰,一个线程改变了自己的service方法中局部变量的值不会影响其他进程的service方法中的局部变量。
每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
}
service 方法在适当的时候调用 doGet、doPost、doPut、doDelete,所以不用对service()方法做任何动作,只需要根据来自客户端的请求类型来重写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() {
// 终止化代码...
}