web在Servlet的一次完整的生命周期中(从容器加载Servlet)到服务器关闭,Servlet主要有三个阶段(也即是三个方法)
- init() 初始化阶段
- service() 处理客户端请求阶段
- destroy() 销毁阶段
一、初始化
首先我们从初始化阶段看起:
web容器在加载Servlet之后就会创建一个Servlet实例并调用init()方法。也即是说,当一个容器中,存在多个Servlet的时候,默认都是不加载的。当所需的Servlet加载的时候就会创建对象并初始化
例如,当我们在浏览器中访问我的一个Servlet的时候
容器就会加载该Servlet并调用默认的无参构造器创建对象和初始化
此外,我们还可以通过在web.xml配置文件添加<load-on-startup>
标签来使该Servlet类在容器初始化之后默认加载并自由调整顺序
下面,我们创建三个Servlet类分别为LifeCycleServlet1,LifeCycleServlet2,LifeCycleServlet3来实验,配置文件如下
<servlet>
<servlet-name>LifeCycleServlet</servlet-name>
<servlet-class>包名.LifeCycleServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>LifeCycleServlet</servlet-name>
<url-pattern>/lifeCycleServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>LifeCycleServlet2</servlet-name>
<servlet-class>包名.LifeCycleServlet2</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>LifeCycleServlet2</servlet-name>
<url-pattern>/lifeCycleServlet2</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>LifeCycleServlet3</servlet-name>
<servlet-class>包名.LifeCycleServlet3</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>LifeCycleServlet3</servlet-name>
<url-pattern>/lifeCycleServlet3</url-pattern>
</servlet-mapping>
结果如下
可以明显看到,当我们加入<load-on-startup>
标签之后Servlet类就会默认加载并且安装我们给出的顺序,从1开始,从小到大加载,当给出的值相同的时候,随机顺序加载
二、service()阶段
它是Servlet的核心,可以处理get/post方式的请求,如果servlet中有Service方法,会优先调用service方法对请求进行处理。
当在HttpServlet中已存在Service()方法的时候,默认的服务是调用和请求相同的do功能,即对于get方式的请求Service会将其分发给doGet()方法,对于post方式的请求Service会将其分发给doPost()方法,这一特点是调用HttpServlet中的Service方法实现的
不同于初始化和销毁阶段只执行一次的特点,服务阶段会多次执行,只要服务器被访问就会调用
三、destroy()阶段
该阶段仅执行一次,在服务器停止且销毁Servlet时执行
总结来谈,用以下一张图表示