Servlet的开发标准来说,Servlet是有自己的小框架的,一个标准的Servlet程序要有完整的生命周期,生命周期是什么东西呢?我们来看一下标准的Servlet开发是怎样的。

Servlet生命周期

    生命周期,是一个程序存在的周期,Servlet由于受到容器的管理,所以容器来决定生命周期。

    Servlet程序是运行在服务器端的一段Java程序,其生命周期将受到WEB容器的控制,生命周期包括: 加载程序、初始化、服务、销毁、卸载五个部分

Servlet开发【04】Servlet的生命周期_Servlet开发

生命周期就是如上图所示的,它是一个程序的一个周期。

1.  加载Servlet

      WEB容器负责加载Servlet,容器就是tomcat,当WEB容器启动时或者是在第一次使用这个Servlet时,容器负责创建Servlet实例,但是用户必须通过部署描述符(web.xml)指定Servlet的位置(Servlet所在的包.类名称),成功加载后,WEB容器会通过反射的方式对Servlet进行实例化。

 2.  初始化

   当一个Servlet被实例化后,容器将调用init()方法初始化这个对象,初始化的目的是为了让Servlet对象在处理客户端请求前完成一些初始化的工作,如果初始化失败,则Servlet将直接被下载掉

3.处理服务

   当有请求提交时,Servlet将调用service()方法(常用的是doGet()和doPost())进行处理。当service()方法中,Servlet可以通过ServletRequest接受客户的请求,也可以利用ServletResponse设置响应信息

4.销毁

当WEB容器关闭或者检测到一个Servlet要从容器中被删除时,会自动调用destroy()方法,以便让该实例释放掉所占用的资源

5.卸载

  当一个Servlet调用完destroy()方法后,此实例将等待被垃圾收回器所回收

关于Servlet的生命周期,就像一个人的一生一样,读者可以和人的一生一样理解,如下图所示

Servlet开发【04】Servlet的生命周期_Servlet开发_02

Servlet生命周期对应的方法:

Servlet开发【04】Servlet的生命周期_Servlet开发_03

一个实例来说明一下:

  1. package ServletDemo; 
  2. import java.io.*; 
  3. import javax.servlet.*; 
  4. import javax.servlet.http.*; 
  5. import javax.servlet.http.*; 
  6. public class Servletzhouqi extends HttpServlet{ 
  7.     public void init()throws ServletException{   
  8.         System.out.println("**Servlet初始化-->init()"); 
  9.     } 
  10.     public void doGet(HttpServletRequest req,HttpServletResponse resp) 
  11.                throws ServletException,IOException{  
  12.         System.out.println("**Servlet服务-->doGet()、doPost()"); 
  13.     } 
  14.     public void doPost(HttpServletRequest req,HttpServletResponse resp) 
  15.                throws ServletException,IOException{ //处理POST请求 
  16.         this.doGet(req, resp);   //调用doGet()方法       
  17.     } 
  18.    public void destroy(){    //Servlet销毁 
  19.        System.out.println("**Servlet销毁-->destroy");   
  20.    } 

一个基本的生命周期编写完成之后,下面就是编写web.xml文件了

  1. <servlet> 
  2.      <servlet-name>Servlet</servlet-name> 
  3.   <servlet-class>ServletDemo.Servletzhouqi</servlet-class> 
  4. </servlet> 
  5. <servlet-mapping> 
  6.      <servlet-name>Servlet</servlet-name> 
  7.   <url-pattern>/ServletLife</url-pattern> 
  8. </servlet-mapping> 

运行一下,在浏览器中输入: http://localhost:8080/test/ServletLife

浏览器只是一个空白页,但是我们看tomcat服务器,如下图

Servlet开发【04】Servlet的生命周期_servlet生命周期_04

在服务器中Servlet是初始化了,在正常情况下,一个Servlet程序是在第一次运行的时候才会初始化

这个时候反复刷新页面,可以发现只有服务器了,如下图所示:

Servlet开发【04】Servlet的生命周期_Servlet开发_05

关于销毁有两种情况:

  1.  容器关闭; 也就是tomcat容器关闭了。

   2. 一个Servlet长时间不使用;当一个Servlet长时间不使用的使用就会关闭了。就像一个人一样,让一个人失踪了50年,那么这个人的信息肯定被社会删除了,但是当这个人突然出现了,那怎么办,这个人的信息当然是重新编写,就想刚出生的孩子一样重新给这个人×××对吧。Servlet也是一样的。

   但是,需要特别强调的是,如果现在的程序覆写了services()方法的话,则doGetdoPost就没用了

  1. package ServletDemo; 
  2. import java.io.*; 
  3. import javax.servlet.*; 
  4. import javax.servlet.http.*; 
  5. import javax.servlet.http.*; 
  6. public class Servletzhouqi extends HttpServlet{ 
  7.     public void init()throws ServletException{   
  8.         System.out.println("**Servlet初始化-->init()"); 
  9.     } 
  10.     public void doGet(HttpServletRequest req,HttpServletResponse resp) 
  11.                throws ServletException,IOException{  
  12.         System.out.println("**Servlet服务-->doGet()、doPost()"); 
  13.     } 
  14.     public void doPost(HttpServletRequest req,HttpServletResponse resp) 
  15.                throws ServletException,IOException{ //处理POST请求 
  16.         this.doGet(req, resp);   //调用doGet()方法       
  17.     } 
  18.    public void destroy(){    //Servlet销毁 
  19.        System.out.println("**Servlet销毁-->destroy");   
  20.    } 
  21.    public void service(HttpServletRequest req,HttpServletResponse resp) 
  22.                        throws ServletException,IOException{  
  23.         System.out.println("***服务***"); 
  24.    } 

在浏览器中运行一下,看一下服务器,如下图所示:

Servlet开发【04】Servlet的生命周期_servlet生命周期_06

  可以发现,没有原来的doGet和doPost的了,只有服务这一项了,就是因为覆写了services()方法的话,则doGetdoPost就没用了

   实际上,这种做法更像是一种设计的模板操作,因为只需要按照他的要求将方法覆写完成了,那么就可以实现相应的功能

    当然,还有一点需要注意的是,在正常情况下初始化方法是servlet第一次使用的时候才调用的,如果现在希望容器启动的时候Servlet直接进行初始化操作的话,则可以在web.xml中增加一个相应的配置参数,表示的是容器启动的时候进行加载

  1. <servlet> 
  2.        <servlet-name>Servlet</servlet-name> 
  3.        <servlet-class>ServletDemo.Servletzhouqi</servlet-class> 
  4.        <load-on-startup>1</load-on-startup> 
  5.   </servlet> 
  6.   <servlet-mapping> 
  7.        <servlet-name>Servlet</servlet-name> 
  8.        <url-pattern>/ServletLife</url-pattern> 
  9.   </servlet-mapping> 

Servlet开发【04】Servlet的生命周期_Servlet开发_07

可以发现在启动中就初始化了。

注意: 有的同学说Tomcat到底是容器还是服务器。tomcat是JSP的服务器,又是Servlet和JavaBean的容器。