Servlet的生命周期可被定义为从创建直到毁灭的整个过程。因为Servlet是运行在Servlet容器中的,其生命周期由Servlet容器管理,Servlet的生命周期通过javax.servlet.Servlet接口中的init()、service()和destroy()方法来表示。方法如下:
- 构造方法: 创建servlet对象的时候调用。
- init ():Servlet 通过调用 init () 方法进行初始化。
- service():Servlet 调用 service() 方法来处理客户端的请求。
- destroy() :Servlet 通过调用 destroy() 方法终止(结束)。
现在我正式讲一下Servlet的生命周期
- 加载和实例化
默认情况下Servlet的加载是Servlet容器负责加载和实例化Servlet的,当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一个请求时,创建Servlet实例。当Servlet容器启动后,它必须要知道所需的Servlet类在什么位置,Servlet容器可以从本地文件系统、远程文件系统或者其他的网络服务中通过类加载器加载Servlet类,成功加载后,容器创建Servlet的实例。因为容器是通过Java的反射API来创建Servlet实例,调用的是Servlet的默认构造方法(即不带参数的构造方法),所以我们在编写Servlet类的时候,不应该提供带参数的构造方法。但是使用默认的加载方式会出现一个问题,如果servlet的构造方法或init方法中执行了比较多的逻辑代码,那么将会导致用户第一次访问sevrlet的时候比较慢。解决办法将Servlet创建对象的时机提到加载Web项目的时候。方法如下代码:
<servlet>
<servlet-name>Test01</servlet-name>
<servlet-class>test.Test01</servlet-class>
<load-on-startup>1</load-on-startup> <!-- 数字必须是大于0的整数,数值越大创建的优先级越低 -->
</servlet>
- 初始化Servlet
在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象。初始化的目的是为了让Servlet对象在处理客户端请求前完成一些初始化的工作,如建立数据库的连接,获取配置信息等。对于每一个Servlet实例,init()方法只被调用一次。在初始化期间,Servlet实例可以使用容器为它准备的ServletConfig对象从Web应用程序的配置信息(在web.xml中配置)中获取初始化的参数信息。在初始化期间,如果发生错误,Servlet实例可以抛出ServletException异常或者UnavailableException异常来通知容器。
- 配置Servlet的初始化参数?
<!-- 设置参数 -->
<init-param>
<param-name>猴子</param-name>
<param-value>500岁</param-value>
</init-param>
<init-param>
<param-name>八戒</param-name>
<param-value>800岁</param-value>
</init-param>
<init-param>
<param-name>和尚</param-name>
<param-value>1200岁</param-value>
</init-param>
- 获取Servlet的初始化参数?
String name = getInitParameter("猴子"); //通过param-name值获取param-value
System.out.println(name); //在控制台输出得到的value
Enumeration<String> ems = getInitParameterNames(); //获取所有的参数名
while(ems.hasMoreElements()){
String str = ems.nextElement();
System.out.println(str+"========醒目作用==============");
System.out.println(getInitParameter(str)+"==========醒目作用===============");
}
在Servlet的生命周期中,init()方法只执行一次。证明servlet对象在tomcat是单实例的。
3.