Servlet的声明周期
Servlet程序是运行在服务器端的Java程序,其生命受到Web容器的控制,包括:加载程序、初始化、服务、销毁和卸载5部分。
Servlet生命周期对应的方法:
- public void init()throws ServletException: Servlet初始化时调用
- public void init(ServletConfig config)throws ServletException: Servlet初始化时调用,可以通过ServletConfig读取配置信息
- public abstract void service(ServletRequest req,ServletResponse res)throws ServletException,IOException: Servlet服务,一般不会直接覆写此方法,而是使用doGet()或doPost()方法
- public void destroy(): Servlet销毁时调用
各个生命周期的作用:
1.加载Servlet:
Web容器负责加载Servlet,当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再次被使用,会重新调用init()方法初始化。
在正常情况下,Servlet只会初始化一次,而处理服务会调用多次,销毁也只会调用一次,但是如果一个Servlet长时间不使用,也会被容器自动销毁,如果需要再次被使用时,会重新初始化的操作,即在特殊情况下初始化可能会进行多次,销毁也可能进行多次。
实例:演示Servlet的声明周期
package com.qwy.servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Servlet声明周期演示
* @author qwy
* @create 2021-03-09 16:17
**/
public class ServletLife extends HttpServlet {
public ServletLife() {
System.out.println("1.构造方法---ServletLife.ServletLife");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("3.服务方法---ServletLife.service");
}
@Override
public void destroy() {
System.out.println("4.销毁方法---ServletLife.destroy");
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("2.初始化方法---ServletLife.init");
}
}
实例:web.xml中配置
<servlet>
<servlet-name>ServletLife</servlet-name>
<servlet-class>com.qwy.servlet.ServletLife</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletLife</servlet-name>
<url-pattern>/life</url-pattern>
</servlet-mapping>
浏览器访问:http://localhost:8080/servlet01/life
控制台输出:
1.构造方法—ServletLife.ServletLife
2.初始化方法—ServletLife.init
3.服务方法—ServletLife.service
浏览器重复访问:http://localhost:8080/servlet01/life
此时只有3.服务方法—ServletLife.service重复输出
正常关闭服务器输出:
4.销毁方法—ServletLife.destroy
Servlet初始化的时机
- 默认情况下,初始化方法是在第一次使用时调用
- 实际上也可以通过配置web.xml文件,在容器启动时就自动为Servlet初始化
实例:修改web.xml
<servlet>
<servlet-name>ServletLife</servlet-name>
<servlet-class>com.qwy.servlet.ServletLife</servlet-class>
<!--容器启动时,初始化该Servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServletLife</servlet-name>
<url-pattern>/life</url-pattern>
</servlet-mapping>
此时启动tomcat服务器,控制台输出:
1.构造方法—ServletLife.ServletLife
2.初始化方法—ServletLife.init