
任务二 Servlet生命周期
任务描述
覆盖Servlet类生命周期的基本方法,观察Servlet从建立到销毁的行为,学会在生命周期各调用方法中编写合适的代码。
必备知识
一个Servlet的完整生命周期由创建、执行、销毁3个阶段组成。当用户的应用加载并使用Servlet时,从初始化到销毁这个Servlet期间会发生一系列事件,这些事件称为Servlet的生命周期事件(或方法),如图2-10所示。Servlet从初始化到销毁有许多方法可以被执行,其中,有3个核心方法分别是init()、service()和destroy(),Servlet可以选择实现这些方法,并且在特定的运行时间调用它们。

图2-10 Servlet的生命周期图示
1.创建阶段
init()方法。在Servlet生命周期的初始化阶段,Web容器通过调用init()方法来初始化Servlet实例,并且可以传递一个实现javax.servlet.ServletConfig接口的对象给它。这个配置对象(configuration object)使Servlet能够读取在Web应用的web.xml文件里定义的名值(name-value)初始参数。这个方法在Servlet实例的生命周期里只调用一次,初始化对象后,该对象将常驻服务器内存,以多线程的方式接受客户端的并发访问。
2.执行阶段
service()方法。初始化后,Servlet实例即可处理客户端请求。Web容器调用Servlet的service()方法来处理每一个请求,但通常,用户不需要重写(override)这个方法,因为在HttpServlet中已经对service()方法有了很好的实现,它会根据请求的方式,调用doGet()方法或doPost()方法。一般来说,推荐覆盖HttpServlet的doGet()方法或doPost()方法,等待service()方法的调用。
3.销毁阶段
destroy()方法。最后,Web容器调用destroy()方法来终结Servlet。如果用户想在Servlet的生命周期内关闭或者销毁一些文件系统或者网络资源,用户可以调用这个方法来实现。destroy()方法和init()方法一样,在Servlet的生命周期里只能调用一次。当Tomcat服务器程序被正常停止时,destroy()方法被调用。
任务透析
建立一个Servlet,覆盖生命周期的各个方法,在控制台输出每个方法的调用情况。
步骤1:编写LifeCircleServlet继承HttpServlet,并覆盖其父类HttpServlet和GenericServlet类的doGet、destroy、init、service等方法,如图2-11所示,代码如下:

图2-11 覆盖父类的生命周期中的方法

步骤2:在web.xml中配置Servlet。代码如下:

步骤3:发布工程,在浏览器中多次访问Servlet,url如下:

观察输出的结果,如图2-12所示。

图2-12 访问Servlet输出结果
步骤4:停止服务器,观察destroy()方法被调用的情况。
课堂提问
1.简述Servlet的生命周期。
2.Servlet的doGet()或doPost()方法分别被哪个方法调用?
3.init()方法和destroy()方法何时被调用,调用次数有什么特点?
4.一般在init()方法或destroy()方法中会编写什么样的功能代码?