[关闭]
@lzb1096101803 2016-03-05T15:51:12.000000Z 字数 1397 阅读 411

Servlet生命周期

电话面试


Servlet 加载实例化--->初始化 --->服务--->销毁

Servlet的生命周期定义了一个Servlet如何被加载、初始化,以及它怎样接收请求、响应请求、提供服务

当启动Servlet容器时,容器首先去查找一个配置文件web.xml,这个文件中记录了可心提供服务的Servlet。每个Servlet被指定一个 Servlet名,也就是这个Servlet实际对应的Java的完整class文件名。Servlet容器会为每个自动装入选项的Servlet创建一 个实例。所以,每个Servlet类必须有一个公共的无参数的构造器

当Servlet被实例化后,Servlet容器将调用每个Servlet的init方法来实例化每个实例,执行完init方法之后,Servlet处于 “已初始化”状态。一旦Servlet被实例化,那么必将调用init方法。通过Servlet在启动后不立即初始化,而是收到请求后进行。

当服务器不再需要Servlet实例或重新装入时,会调用destroy方法,使用这个方法,Servlet可以释放掉所有在init方法申请的资源。一个Servlet实例一旦终止,就不允许再次被调用,只能等待被卸载。

Servlet一旦终止,Servlet实例即可被垃圾回收,处于“卸载”状态,如果Servlet容器被关闭,Servlet也会被卸载,一个 Servlet实例只能初始化一次,

1)init()方法
在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init()
2)service()方法
它是Servlet的核心。 每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求” (ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在 Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。
3)destroy()方法
仅执行一次,在服务器端停止且卸载Servlet时执行该方法,有点类似于C++的delete方法。一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。
那么现在开始谈Servlet的生命周期,它始于装入Web服务器的内存时,并在终止或重新装入Servlet时结束。

首先简单解释一下Servlet接收和响应客户请求的过程,跳过init过程,客户发送一个请求,Servlet是调用service()方法对请求进行响应的,通过源代码可见,service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。在Servlet接口和GenericServlet中是没有doGet,doPost等等这些方法的,HttpServlet中定义了这些方法,但是都是返回error信息,所以,我们每次定义一个Servlet的时候,都必须实现doGet或doPost等这些方法。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注