9.14JavaWeb之Servlet生命周期
2021/9/14 20:35:16
本文主要是介绍9.14JavaWeb之Servlet生命周期,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
9.14JavaWeb之Servlet生命周期
什么是Servlet生命周期
Servlet生命周期是指: Servlet 从创建到销毁的过程
主要阶段:
-
初始化阶段--->init()
-
运行时阶段--->service()
-
销毁阶段--->destory()
Servlet接口定义了三个方法:init()、service()、destory(),分别在Servlet生命周期的不同阶段被Servlet容器调用
初始化阶段--->init()
特点:
只有完成了初始化,Servlet 才能处理来自客户端的请求
Servlet初始化阶段步骤:
-
加载和实例化 Servlet--->new一个对象;
-
调用 init() 方法进行初始化。
加载和实例化Servlet
过程:
-
Servlet 容器负责加载和实例化 Servlet。
-
容器启动或首次请求某个 Servlet 时,容器会读取 web.xml 或 @WebServlet 中的配置信息,对指定的 Servlet 进行加载。
-
加载成功后,容器会通过反射对 Servlet 进行实例化--->加载失败会在前端界面上报错。
注意:
**Servlet 容器是通过 Java 的反射 API 来创建 Servlet 实例的,需要调用 Servlet 的默认构造方法(default constructor,即不带参数的构造方法),所以在编写 Servlet 类时,不能只提供一个带参数的构造方法。**
调用init()方法进行初始化
特点:
-
由Servlet容器调用init()方法对初始化Servlet实例
-
在 Servlet 的整个生命周期内,init() 方法只能被调用一次。
-
Servlet 实例通过 ServletConfig 对象获取在 web.xml 或者 @WebServlet 中配置的初始化参数。
目的:
让 Servlet 实例在处理请求之前完成一些初始化工作,例如建立数据库连接,获取配置信息等。
运行时阶段
过程:
-
Servlet 容器接收到来自客户端请求时,容器会针对该请求分别创建一个 ServletRequst 对象和 ServletResponse 对象
-
将它们以参数的形式传入 service() 方法内
-
调用该方法对请求进行处理
注意:
执行 service() 方法前,init() 方法必须已成功执行。
Service方法调用的特点:
-
ServletRequest
对象获取客户端的相关信息和请求信息 -
处理请求对象的请求信息
-
ServletResponse
对象将响应信息进行包装,返回给客户端 -
响应信息返回给客户端后,ServletRequst 对象与 ServletResponse 对象就会被销毁。
需要注意的特点:
Servlet 的每一次请求,Servlet 容器都会调用一次 service() 方法,并创建新的 ServletRequest 和 ServletResponse 对象。service() 方法在 Servlet 的整个生命周期中会被调用多次。
销毁阶段
对象销毁过程:
当 Servlet 容器关闭、重启或移除 Servlet 实例时,容器就会调用 destory() 方法,释放该实例使用的资源,例如:关闭数据库连接,关闭文件的输入流和输出流等,随后该实例被 Java 的垃圾收集器所回收。
Servlet生命周期执行流程
注意:
当初始化完成后,Servlet 容器会将该实例保存在内存中--->当实例过多的时候会对内存造成压力
根据Servlet请求执行流程图创建一个实例Demo
需求:
-
初始化
-
运行时--->Service--->get和post方法
-
销毁对象--->destory方法
package ServletPractice; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; /** * 使用注解控制 * 完成Servlet容器的初始化、实例化、运行时方法调用、对象销毁等过程 * @since JDk 1.8 * @date 2021/09/14 * @author Lucifer */ @WebServlet("/MyServlet") public class MyServletDemoNo5 extends HttpServlet { //定义一些属性方便再浏览器观察 private final static long serialVersionUID = 1L; private int initCount = 0; private int httpCount = 0; private int destroyCounty = 0; //初始化方法 @Override public void init() throws ServletException { //计数器增加,并且向控制台输出 initCount++; super.init(); System.out.println("init方法调用次数:" + initCount); } //创建运行时的get和post方法 @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //http次数增加 httpCount++; //向控制台输出 System.out.println("Get方法调用次数:" + httpCount); //设置字符集 response.setContentType("text/html;charset=UTF-8"); //创建PrintWriter的引用向控制台写内容 PrintWriter writer = response.getWriter(); //向页面输出 writer.write("初始化次数:" + initCount + "<br/>" + "处理请求次数:" + httpCount + "<br/>" + "销毁次数:" + destroyCounty); writer.close(); } //post @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } //创建destory方法 @Override public void destroy(){ destroyCounty++; System.out.println("**********************************destroy方法:" + destroyCounty + "*******************************"); } }
这篇关于9.14JavaWeb之Servlet生命周期的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-0601-电商商品中心解密:仅凭SKU真的足够吗?
- 2024-05-01为什么公共事业机构会偏爱 TiDB :TiDB 数据库在某省妇幼健康管理系统的应用
- 2024-04-26敏捷开发:想要快速交付就必须舍弃产品质量?
- 2024-04-26静态代码分析的这些好处,我竟然都不知道?
- 2024-04-26你在测试金字塔的哪一层?(下)
- 2024-04-26快刀斩乱麻,DevOps让代码评审也自动起来
- 2024-04-262024年最好用的10款ER图神器!
- 2024-04-2203-为啥大模型LLM还没能完全替代你?
- 2024-04-2101-大语言模型发展
- 2024-04-17基于SpringWeb MultipartFile文件上传、下载功能