1.Servlet生命周期详解
Servlet的生命周期包括即Servlet从创建到销毁的这一个过程,可以将Servlet的生命周期分为初始化阶段、服务阶段、销毁阶段这三个阶段。下面通过一张图来描述Servlet的生命周期,如图1-1所示:
图1-1 Servlet生命周期
通过对图1-1Servlet生命周期的理解,下面对Servlet的生命周期的三个阶段进行详细介绍:
服务器会在客户端第一次访问Servlet,或服务器启动的时候为该Servlet创建实例。要想在服务器启动的时候就为Servlet创建实例,需要在web.xml中进行配置。当服务器为Servlet创建实例后,会在第一时间调用init()方法,完成Servlet的初始化操作。注意这个init()方法在Servlet的一生中,只会被服务器调用一次。
当服务器接收到请求时,会去调用Servlet的service()方法来处理请求,而且每次请求的时候,服务器都会调用service()方法,并且创建新的ServletRequest和ServletResponse对象,所以该方法在Servlet的一生中会被调用多次。
当服务器关闭或者当前web应用被移出服务器时,Servlet会被销毁,在销毁之前,服务器会调用destroy()方法,可以把Servlet的“临终遗言“放在该方法中,例如把对某些资源的释放等代码放在destroy()方法中。
2.验证Servlet生命周期
通过上面对Servlet生命周期的学习,下面我们通过一个案例更深入地理解Servlet的生命周期,详情请参考
Servlet生命周期案例详解,点击此处
下载源代码。
(1)创建一个web应用,取名为Example09,在该应用中创建一个类ServletTwo,实现Servlet接口,创建步骤请见
Servlet接口及应用。ServletTwo的具体代码如例1-1所示:
例 1-1 ServletTwo.java
(2)在浏览器端访问一个资源,我们是通过http://localhost:8080/Example/index.jsp来访问,现在要访问Servlet就要为该Servlet指定访问路径。下面通过一张图来了解浏览器是如何访问Servlet。如图1-2所示:
图1-1 浏览器访问Servlet
如图1-1所示,当浏览器给服务器发送请求访问Servlet,服务器要做很多工作,下面我们来分析,服务器如何根据请求路径找到对应的Servlet。
对于一个Servlet类,我们要在web.xml中进行配置,配置信息如例1-2所示:
例1-2 web.xml
在上面的配置信息中,元素<servlet >用于注册Servlet,它的两个子元素<servlet-name>和<servlet-class>分别是用来指定Servlet名称及完整类名。元素<servlet-mapping>用于映射Servlet对外访问的虚拟路径。
例1-2中对Servlet的配置要注意以下两点:
- <servlet-mapping >标签中的<url-pattern>标签的内容是Servlet的访问路径,一定要以“/”开头。
- <servlet>标签中的<servlet-name>标签的内容要与<servlet-mapping>标签中的<servlet-name>标签的内容保持一致。
(3)将Example09应用发布到Tomcat中,启动Tomcat服务器,在浏览器端地址栏上输入http://localhost:8080/Example09/ServletTwo,浏览器显示结果如图1-2所示:
图1-2 浏览器显示结果
(4)由图1-2可知,浏览器访问成功,下面我们来看控制台的打印结果,如图1-3所示:
图1-3控制台打印结果
(5)暂时不清理控制台打印的信息,继续在浏览器端访问该Servlet,控制台打印结果如图1-4所示:
图1-4 控制台打印结果
由此可见,init()方法只是在浏览器第一次访问Servlet的时候才被调用,而service()方法是浏览器每访问一次就被调用一次。
(6)在视图中选择【Servers】,选择【Tomcat 7.x】,然后点击右键,在选项中选择【Stop Server】选项,关闭服务器,如图1-5所示:
图1-5 关闭服务器
(7)图1-5服务器关闭之后,控制台打印信息如图1-6所示:
图1-6 控制台打印结果
由图1-6可知,destroy()方法在服务器关闭的时候执行了,这里需要注意的是关闭服务器的方式,建议大家采用图1-5的关闭方式,否则destory()方法可能会不执行。
由以上案例的学习可知:
- Servlet只会被创建一次,所以是单例的,一个Servlet类只有一个Servlet对象,当然一个web应用中可以存在多个Servlet类;
- Servlet实例默认是在第一次访问该Servlet时被服务器创建;
- 服务器正常关闭,Servlet实例被销毁;
- Servlet是线程不安全的,所以效率比较高。
本文版权归传智播客Java培训学院所有,欢迎转载,转载请注明作者出处。谢谢!
作者:传智播客Java培训学院
首发:http://www.itcast.cn/javaee