servlet生命周期

生命周期是指容器如何创建servlet实例、分配资源、调用其方法,销毁实例的过程 
阶段一: 实例化(就是创建 servlet 对象,调用构造器)
 在如下两种情况下会进行对象实例化。
 第一种情况:
  当请求到达容器时,容器查找该 servlet 对象是否存在,如果不存在,才会创建实例。
 第二种情况:
 容器在启动时,或者新部署了某个应用时,会检查 web.xml 当中,servlet 是否有load-on-starup 配置。如果有,则会创建该 servlet 实例。
 load-on-starup 参数值越小,优先级越高(最小值为 0,优先级最高)。
 
 实验1:设置构造器,观察多次访问的时候和service方法执行先后
 实验2:在配置文件中加入load-on-starup,观察实例化的时机

阶段二: 初始化
 为 servlet 分配资源,调用 init(ServletConfig config);
 方法config 对象可以用来访问 servlet 的初始化参数。
 初始化参数是使用 init-param 配置的参数。
 init 可以 override。
 实验1:override init方法,观察执行实际(和上边的实验配合)
 实验2:加入<init-param>,并通过取值config
  <init-param>
    <param-name>name</param-name>
  <param-value>zhangsan</param-value>   
 </init-param>


  
  ServletConfig config=getServletConfig();
  String add=config.getInitParameter("address");
、  ---------------------------------------------
  如果是有参的init那么不许要获取ServletConfig
  name=config.getInitParameter("name");

阶段三: 就绪/调用
 有请求到达容器,容器调用 servlet 对象的 service()方法。
 HttpServlet 的 service()方法,会依据请求方式来调用 doGet()或者 doPost()方法。
 但是,这两个 do 方法默认情况下,会抛出异常,需要子类去 override。

 

阶段四: 销毁
 容器依据自身的算法,将不再需要的 servlet 对象删除掉。
 在删除之前,会调用 servlet 对象的 destroy()方法。
 destroy()方法用于释放资源。
 在 servlet 的整个生命周期当中,init,destroy 只会执行一次,而 service 方法会执行多次。

原文地址:https://www.cnblogs.com/xiyangyang2hao/p/5686737.html