一,什么是生命周期?
顾名思义,就是从出生到死亡这么一个周期,也就是创建Servlet到销毁Servlet的过程,那么为什么要介绍这么一个生命周期呢,因为Servlet不像我们之前接触的那样,是new一个对象,而是由Tomcat控制的(小命掌握在别人手里呐*~*)
所以我们必须要了解它的生命周期,这样才能更好的用它!
二:四个生命周期方法
我们先通过一个例子给大家演示一下:
package lm.practice; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * Created by Administrator on 2017/3/23. */ public class ServletLife extends HttpServlet { /** * 1.构造方法 */ public ServletLife(){ System.out.println("-----构造方法被调用了------"); } /** * 2.init方法 * @param config * @throws ServletException */ @Override public void init(ServletConfig config) throws ServletException { System.out.println("-----init方法被调用了----"); } /** * 3.service方法 * @param req * @param resp * @throws ServletException * @throws IOException */ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("------service方法被调用了-----"); } /** * 4.destory方法 */ @Override public void destroy() { System.out.println("------destroy被调用了------"); } }
配置ServletLife:
<servlet> <servlet-name>ServletLife</servlet-name> <servlet-class>lm.practice.ServletLife</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletLife</servlet-name> <url-pattern>/life</url-pattern> </servlet-mapping>
运行,在地址栏中输入:http://localhost:8080/20170323/life
仔细看Idea的控制台,会出现这样的信息:
刷新页面之后:
每刷新一次页面,就会输出-------service方法被调用了---------字符串,没有输出构造方法和init方法
关闭tomcat或者重新部署web应用程序,控制台输出:
看到这里,你是不是有什么想法呢?
这就是我要说的
在Servlet的生命周期里,有四个方法,构造方法、init方法、service方法和destory方法,其中构造方法和init方法分别是在运行Servlet的时候执行的,只执行一次,而service方法是每次执行servlet都会执行一次service方法,而destory就是销毁servlet的方法,是在结束服务的时候执行的。这就是servlet的生命周期。
而每次执行servlet方法时只执行一次构造方法和init方法,可见servlet是单实例的,而多次执行servcie方法不言而喻是多线程的,所以servlet是单实例多线程的技术哦,(这里会存在线程安全的问题,可以利用锁解决,不详述)。
为了让你能够更清晰的了解这个过程,借用前辈的一个时序图,很清晰形象的描述了我上述的文字: