生命周期是指容器如何创建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 方法会执行多次。