servlet的生命周期即从Servlet出现到消亡(销毁)的全过程
加载类——>实例化(为对象分配空间)——>初始化(为对象的属性赋值)——>请求响应(服务阶段)——>销毁
生命周期:
1.加载和实例化
默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象
2.初始化
在Servlet实例化之后,容器将调用Servlet的int()方法初始化这个对象,完成一些如加载配置文件,创建连接等初始化的工作。该方法只调用一次
3.请求处理
每次请求Servlet时,Servlet容器都会调用Servlet()方法对请求进行处理
4.服务终止
当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destory()方法完成资源的释放。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收
@WebServlet(urlPatterns="/demo",loadOnStartup=1)
- 负整数:第一次被访问时创建Servlet对象
- 0或正整数:服务器启动时创建Servlet对象,数字越小优先级越高
方法介绍
- 初始化方法,在Servlet被创建时执行,只执行一次
void init(ServletConfig config)
- 提高服务方法,每次Servlet被访问,都会调用该方法
void service(ServletRequest req,ServletResponse res)
- 销毁方法,当Servlet被销毁时,调用该方法。在内存释放或服务器关闭时销毁Servlet
void destroy()
- 获取ServletConfig对象
ServletConfig getServletConfig()
- 获取Servlet信息
String getServletlnfo()
生命周期的三个方法
- init()初始化阶段
- service()处理客户端请求阶段
- destory()终止阶段
- 容器(Tomcat)装载Servlet
实例化阶段
- 当客户端首次发送第一次请求后,由Servlet容器去解析请求,根据请求找到是否有对应的Servlet
- 判断是否有Servlet实现类的对象存在?存在则直接使用,不存在则先创建一个Servlet实现类的对象
初始化阶段
Servlet初始化是其生命周期的第一个阶段,也是其他阶段的基础,只有完成了初始化,Servlet才能处理来自客户端的请求。
- 加载和实例化Servlet
- 调用init()方法进行初始化
1.加载实例化
Servlet容器负责加载和实例化Servlet
当容器启动或者首次请求某个Servlet时,容器会读取web.xml或@WebServlet中的配置信息,对指定的Servlet进行加载。加载成功后,容器会通过反射对Servlet进行实例化
2.调用init()方法进行初始化
加载和实例化完成后,Servlet容器会创建一个Servlet对象并调用Servlet的init方法(在Servlet生命周期内只能调用一次init方法)去初始化Servlet实例
请求响应阶段
初始化完成后调取service()方法,由service()判断客户端的请求方式
- 如果是get请求,则执行doGet()方法
- 如果是post请求,则执行doPost()方法
- 处理方法完成后会作出相应的结果返回给客户端,单词请求处理完毕
- 当用户发送第二次以后的请求时,会判断对象是否存在,但是不再执行init(),而直接执行service方法进行销毁,宣告生命周期的结束
服务终止阶段
当服务器关闭,重启或移除 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("销毁时调用");
}
}