Servlet系列:生命周期(init、 service、destroy)详解
2024/1/22 1:02:44
本文主要是介绍Servlet系列:生命周期(init、 service、destroy)详解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Servlet的生命周期是由Web容器(如Tomcat)管理的,包括以下三个阶段:
- 加载和实例化:当Web应用程序启动时,Web容器会加载和实例化Servlet。加载和实例化过程可以在应用程序启动时自动完成,也可以通过Servlet的名称手动加载。在实例化Servlet后,Web容器会调用其init()方法进行初始化。
- 处理请求:当客户端发送请求时,Web容器会调用Servlet的service()方法处理请求。service()方法会根据请求的类型(GET、POST等)调用doGet()或doPost()方法。除了service()方法外,还可以覆盖doGet()、doPost()、doPut()、doDelete()等方法来处理不同类型的请求。
- 销毁:当Web应用程序停止或重新部署时,Web容器会调用Servlet的destroy()方法进行清理。此后,Servlet实例将被回收并释放资源。
在Servlet的生命周期中,init()、service()和destroy()方法是必须实现的。而doGet()、doPost()等其他方法则根据需要实现。需要注意的是,在多个线程同时访问Servlet时,Web容器会对Servlet实例进行同步处理,以保证线程安全。
Servlet没有 main()方法,不能独立运行,它的运行完全由 Servlet 引擎来控制和调度。 所谓生命周期,指的是 servlet 容器何时创建 servlet 实例、何时调用其方法进行请求的处理、 何时并销毁其实例的整个过程。
- 实例和初始化时机
当请求到达容器时,容器查找该 servlet 对象是否存在,如果不存在,则会创建实例并进行初始化。
- 就绪/调用/服务阶段
有请求到达容器,容器调用 servlet 对象的 service()方法,处理请求的方法在整个生命周期中可以被多次调用; HttpServlet 的 service()方法,会依据请求方式来调用 doGet()或者 doPost()方法。但是, 这两个 do 方法默认情况下,会抛出异常,需要子类去 override。
- 销毁时机
当容器关闭时(应用程序停止时),会将程序中的 Servlet 实例进行销毁。
上述的生命周期可以通过 Servlet 中的生命周期方法来观察。在 Servlet 中有三个生命周 期方法,不由用户手动调用,而是在特定的时机有容器自动调用,观察这三个生命周期方法 即可观察到Servlet 的生命周期。
init 方法,在 Servlet 实例创建之后执行(证明该 Servlet 有实例创建了)
@Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("2.初始化"); }
service 方法,每次有请求到达某个 Servlet 方法时执行,用来处理请求(证明该Servlet 进行服务了)
@Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("3.处理请求"); }
destroy 方法,Servlet 实例销毁时执行(证明该 Servlet 的实例被销毁了)
@Override public void destroy() { System.out.println("4.销毁了"); }
Servlet 的生命周期,简单的概括这就分为四步:servlet 类加载-->实例化-->服务-->销毁。
package com.mcode; import javax.servlet.*; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import java.io.IOException; /** * ClassName: LifeServlet * Package: com.mcode * Description: * * @Author: robin * @Version: v1.0 */ @WebServlet("/life") public class LifeServlet implements Servlet { public LifeServlet() { System.out.println("1.实例化"); } @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("2.初始化"); } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("3.处理请求"); } @Override public String getServletInfo() { return null; } @Override public void destroy() { System.out.println("4.销毁了"); } }
整体流程
-
Web Client 向 Servlet 容器(Tomcat)发出 Http 请求
-
Servlet 容器接收 Web Client 的请求
-
Servlet 容器创建一个 HttpServletRequest 对象,将 Web Client 请求的信息封装到这个对象 中
-
Servlet 容器创建一个 HttpServletResponse 对象
-
Servlet 容器调HttpServlet 对象service 方法,把 Request 与 Response 作为参数,传给
HttpServlet
-
HttpServlet 调用 HttpServletRequest 对象的有关方法,获取 Http 请求信息
-
HttpServlet 调用 HttpServletResponse 对象的有关方法,生成响应数据
-
Servlet 容器把 HttpServlet 的响应结果传给 Web Client
这篇关于Servlet系列:生命周期(init、 service、destroy)详解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享
- 2024-11-22ansible 的archive 参数是什么意思?-icode9专业技术文章分享
- 2024-11-22ansible 中怎么只用archive 排除某个目录?-icode9专业技术文章分享
- 2024-11-22exclude_path参数是什么作用?-icode9专业技术文章分享
- 2024-11-22微信开放平台第三方平台什么时候调用数据预拉取和数据周期性更新接口?-icode9专业技术文章分享
- 2024-11-22uniapp 实现聊天消息会话的列表功能怎么实现?-icode9专业技术文章分享
- 2024-11-22在Mac系统上将图片中的文字提取出来有哪些方法?-icode9专业技术文章分享
- 2024-11-22excel 表格中怎么固定一行显示不滚动?-icode9专业技术文章分享
- 2024-11-22怎么将 -rwxr-xr-x 修改为 drwxr-xr-x?-icode9专业技术文章分享
- 2024-11-22在Excel中怎么将小数向上取整到最接近的整数?-icode9专业技术文章分享