servlet生命周期
Servlet生命周期分为三个阶段:
- 初始化阶段 调用init()方法
- 响应客户请求阶段 调用service()方法
- 终止阶段 调用destroy()方法
初始化阶段
servlet采用单例模式懒汉式调用init()方法,在Servlet的生命周期中,仅执行一次init()方法。
init()方法共有两种:
- 不带参数的构造器
@Override
public void init() throws ServletException {
super.init();
}
- 带参数的构造器
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
常用的为不带参数的构造器,带参数的构造器一般由网站后台管理人员使用,用于网站配置文件的更新。
通过xml改变初始化模式
可通过加入一段XML,来设置初始化使用饿汉式还是懒汉式(是在访问服务器的时候直接初始化,还是在执行操作时初始化)
<load-on-startup>1(内填入正整数,代表设置饿汉式,否则该代码无效)</load-on-startup>
响应客户请求阶段
它是Servlet的核心,负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。
Service()方法共有两种:
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
// TODO Auto-generated method stub
super.service(req, res);
}
只有void service(ServletRequest req,ServletResponse response)方法是由tomcat自动调用,它将接收的客户端请求转交给HttpServlet中的另一个protected void service(HttpServletRequest req,HttpServletResponse res)方法。
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.service(req, resp);
}
此保护类型的service方法再把将请求分发给doPost()、doGet()方法进行下一步处理。所以我们完全可以重写受保护的service()方法来代替doPost()和doGet()方法。
其中request(请求)和response(响应)会在下一篇博客讲解。
终止阶段
仅执行一次,在服务器端停止且卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资源。一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。
destroy()方法标志servlet生命周期的结束。当服务需要关闭时,它调用servlet的destroy()方法。此时,在init()方法中创建的任何资源都应该被清除和释放。如果有打开的数据库连接,应当在此处保存任何在下一次加载时需要用到的永久性信息。