Servlet的生命周期共有四个阶段:
1.实例化
实例化实例化阶段是Servlet生命周期中的第一步,由Servlet容器调用Servlet的构造器创建一个具体的Servlet对象的过程。而这个创建的时机可以是在容器收到针对这个组件的请求之后,即用了才创建;也可以在容器启动之后立刻创建实例,而不管此时Servlet是否使用的上;
2.初始化
Servlet在被加载实例化之后,必须要初始化它。在初始化阶段,init()方法会被调用。这个方法在javax.servlet.Servlet接口中定义;其中,方法以一个ServletConfig类型的对象作为参数。ServletConfig对象由Servlet引擎负责创建,从中可以读取到事先在web.xml文件中通过<init-param>节点配置的多个name-value名值对;ServletConfig对象还可以让Servlet接受一个ServletContext对象;一般情况下,init方法不需要编写,因GenericServlet类已经提供了init()方法的实现,并且提供了getServletConfig()方法来获ServletConfig对象;
注:init方法只被执行一次;
3.提供服务
Servlet被初始化以后就处于能够响应请求的就绪状态。每个对Servlet的请求由一个ServletRequest对象代表,Servlet给客户端的响应由一个ServletResponse对象代表;当客户端有一个请求时,容器就会将请求与响应对象转给Servlet,以参数的形式传给service()方法。service()方法由javax.servlet.Servlet定义,由具体的Servlet实现;
4.销毁
Servlet容器在销毁Servlet对象时会调用destroy()方法来释放资源。通常情况下Servlet容器停止或者重新启动都会引起销毁Servlet对象的动作,但除此之外,Servlet容器也有自身管理Servlet对象的准则,整个生命周期并不需要人为进行干预;
例程如下:
@WebServlet("/LifeServlet") public class LifeServlet extends HttpServlet { private static final long serialVersionUID = 1L; public LifeServlet() { super(); System.out.println("1、完成了实例化"); } @Override public void init() throws ServletException { super.init(); System.out.println("2、完成了初始化"); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("3、就绪中"); response.getWriter().append("Served at: ").append(request.getContextPath()); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } @Override public void destroy() { super.destroy(); System.out.println("4、销毁了"); } }
当访问/LifeServlet这个接口时,打印如下:
1、完成了实例化 2、完成了初始化 3、就绪中
当关闭服务器,打印:
4、销毁了