servlet学习(二):servlet的生命周期
Servlet 生命周期指的是,Servlet 对象的创建、Servlet 对象的初始化、Servlet 对象服
务的执行,及最终 Servlet 对象被销毁的整个过程。
servlet生命周期图:
Servlet 的整个生命周期过程的执行,均由 Web 服务器(我们这里的是tomcat)负责管理,程序员无法控制其
执行流程。但程序员可以获取到 Servlet 的生命周期时间点,并可以指定让 Servlet 做一些业务相关的事情。
示例代码:
package com.wdy;
import javax.servlet.*;
import java.io.IOException;
public class LifeServletimplements Servlet {
public LifeServlet(){
System.out.println("无参构造方法执行");
}
@Override
public void init(ServletConfig servletConfig)throws ServletException {
System.out.println("init");
}
@Override
public ServletConfiggetServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse)throws ServletException, IOException {
System.out.println("service");
}
@Override
public StringgetServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("destroy");
}
}
并在web.xml里配置这个servlet:
1.我们启动tomcat服务 :没有打印任何日志
2.我们执行life这个url请求:
3.手动关闭tomcat:
4.刷新一下浏览器:
servlet的特征
1、Servlet是单实例(不管是刷新浏览器多少次,只调用一次init方法)、多线程(每刷新一次浏览器就执行一次service方法)的,只创建一个servlet对象,但是每次请求都会起一个线程并在自己线程栈内存中执行service方法。
2、一个 Servlet 实例只会执行一次无参构造器与 init()方法,并且是在第一次访问时执行。
3、用户每提交一次对当前 Servlet 的请求,就会执行一次 service()方法。
4、一个 Servlet 实例只会执行一次 destroy()方法,在应用停止时执行。
5、由于 Servlet 是单例多线程的,所以为了保证其线程安全性,一般情况下是不建议在 Servlet类中定义可修改的成员变量,因为每个线程均可修改这个成员变量,会出现线程安全问题。
6、默认情况下,Servlet 在 Web 容器(tomcat)时是不会被实例化的。