Servlet的生命周期的含义
Servlet容器如何去创建Servlet对象,如何给Servlet对象分配资源,如何调用Servlet对象的方法来处理请求,以及如何去销毁Servlet对象的整个过程。
Servlet生命周期的四个阶段
实例化、初始化、就绪、销毁。
实例化
1)指的是容器调用Servlet的构造器,创建Servlet对象。
2)何时实例化?
情况1:容器收到请求之后才创建Servlet对象。在默认情况下,容器只会为Servlet创建唯一的一个实例(多线程,有安全问题。每次请求创建一个线程,由线程去调用方法)。
情况2:容器事先(容器启动时)将某些Servlet(需要配置load-on-startup参数)对象创建好。load-on-startup参数值必须是>=0的整数,越小,优先级越高(即先被实例化)。参数加在web.xml配置文件里的某个<servlet>标签里,如<load-on-startup>1</load-on-startup>
注意事项:注意标签的先后顺序,是有要求的,要符合.xsd文档要求。
<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
初始化
1)指的是容器在创建好Servlet对象之后,会立即调用Servlet对象的init方法。
2)init方法:
①init方法只会执行一次。
②GenericServlet已经实现了init方法,该方法会将容器创建好的ServletConfig对象作为参数传递给init方法。
③ServletConfig对象提供了一个getInitParameter方法来访问Servlet的初始化参数。
- step1:在web.xml文件里,使用<init-param>来配置初始化参数,加在某个<servlet>标签里。
<servlet>
<init-param>
<param-name>name</param-name>
<param-value>jack</param-value>
</init-param>
</servlet>
- step2:使用String getInitParameter(String paraName)获取初始化参数。
④如果GenericServlet的init方法提供的初始化操作不满足需要,可以覆盖(override) init()方法,覆盖的是不带参数的,对有参数的无影响。有参数的init方法执行时,同时无参的也被执行(有参的init方法里调用了无参的init方法),叫钩子方法。
就绪
1)就绪指的是Servlet对象可以接受调用了,容器收到请求之后,会调用Servlet对象的service方法来处理,且可以被执行多次。
2)HttpServlet已经实现了service方法,该方法会依据请求类型(get/post)分别调用doGet或doPost方法。所以我们在写一个Servlet时,有两种选择:
选择一:覆盖 HttpServlet的doGet,doPost方法
选择二:覆盖 HttpServlet的service方法
销毁
销毁指的是Servlet容器在销毁Servlet对象之前,会调用destroy方法,且只会执行一次。
Servlet生命周期图

Servlet生命周期相关的几个接口与类
1)Servlet接口:
- ①init(ServletConfig config)//有参的init方法
- ②service(ServletRequest req,ServletResponse res)
- ③destroy()
2)GenericServlet抽象类:实现了Servlet接口中的init,destroy方法
3)HttpServlet抽象类:继承了GenericServlet抽象类,实现了service方法
4)ServletConfig接口:String getInitParameter(String paraName)
5)ServletRequest接口是HttpServletRequest的父接口
6)ServletResponse接口是HttpServletResponse的父接口
网友评论