Servlet的生命周期
servlet的生命周期顾名思义就是从servlet出现到消亡(销毁)的全过程。
主要分为以下几个阶段:
加载类—>实例化(为对象分配空间)—>初始化(为对象的属性赋值)—>请求响应(服务阶段)—>销毁
servlet生命周期三个方法:
init()初始化阶段
service()处理客户端请求阶段
destroy()终止阶段
容器(tomcat等)装载servlet
实例化阶段
1.1 当客户端首次发送第一次请求后,由Servlet容器去解析请求,根据请求找到是否有对应的servlet。
1.2 判断是否有Servlet实现类的对象存在?存在则直接使用,不存在则先创建一个servlet实现类的对象。
初始化阶段
Servlet 初始化是其生命周期的第一个阶段,也是其他阶段的基础。只有完成了初始化,Servlet 才能处理来自客户端的请求。
Servlet 初始化阶段分为 2 步:
- 加载和实例化 Servlet;
- 调用 init() 方法进行初始化
1.加载和实例化
Servlet 容器负责加载和实例化 Servlet。
当容器启动或首次请求某个 Servlet 时,容器会读取 web.xml (配置load-on-startup=1,默认为0)或 @WebServlet 中的配置信息,对指定的 Servlet 进行加载。加载成功后,容器会通过反射对 Servlet 进行实例化。
2.调用 init() 方法进行初始化
加载和实例化完成后,Servlet 容器会创建一个servlet对象并调用servlet的init方法(在servlet生命周期内只能调用一次init方法)去初始化 Servlet 实例。
请求响应阶段
初始化完成后调取service()方法,由service()判断客户端的请求方式。
3.1 如果是get请求,则执行doGet()方法。
3.2 如果是post请求,则执行doPost()。
3.3 处理方法完成后会作出相应的结果返回给客户端,单次请求处理完毕。
当用户发送第二次以后的请求时,会判断对象是否存在,但是不再执行init(),而直接执行service方法调取doGet() / doPost()方法。
服务终止阶段
当服务器关闭,重启或移除 Servlet 实例时Servlet调取destroy()方法进行销毁,宣告生命周期的结束。
public class EmpServlet extends HttpServlet{
//初始化servlet,调用init方法
public void init() throws ServletException {
System.out.println("初始化时调用");
}
//开启服务
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
System.out.println("开启服务时调用");
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
//销毁时调用destory
public void destroy() {
System.out.println("销毁时调用");
}
}