当前位置: 首页 > news >正文

Servlet-生命周期

Servlet的生命周期主要有三个阶段:初始化——服务——销毁

初始化

初始化:主要包括 加载、配置、创建实例 三部分。

加载:在客户端首次请求该Servlet时,或着随着web服务器启动而加载;

配置:为每个Servlet设置信息产生一个ServletConfig对象;

创建:调用Servlet接口的init()方法,并将产生的ServletConfig对象当作参数传入。在Servlet的生命周期中,仅执行一次init()方法。它在web服务器装入Servlet时执行,负责初始化Servlet对象。同一个类型的Servlet对象在web服务器中以单例的形式存在。

当Servlet被实例化后,Servlet容器将调用每个Servlet的init()方法来实例化每个实例,执行完init()方法之后,Servlet处于“已初始化”状态。所以说,一旦Servlet被实例化,那么必将调用init方法。

如果初始化失败,执行init()方法抛出ServletException异常,Servlet对象将会被垃圾回收器回收

当web.xml中不配置load-on-startup属性,或者配置该属性且值为负数时,servlet在有请求的时候才会初始化。
当load-on-startup属性值大于等于0的时候,servlet会在启动的时候就初始化。

备注:1. load-on-startup属性值只能为整数。
   2. load-on-startup属性值大于等于0时,数值越小,优先级越高。

服务

Servlet 被初始化以后,就处于能响应请求的就绪状态。每个对Servlet 的请求由一个Servlet Request 对象代表。Servlet 给客户端的响应由一个Servlet Response对象代表。对于到达客户机的请求,服务器创建特定于请求的一个“请求”对象和一个“响应”对象。调用service方法,这个方法可以调用其他方法来处理请求。

Service方法会在服务器被访问时调用,Servlet对象的生命周期中service方法可能被多次调用,由于web-server启动后,服务器中公开的部分资源将处于网络中,当网络中的不同主机(客户端)并发访问服务器中的同一资源,服务器将开设多个线程处理不同的请求,多线程同时处理同一对象时,有可能出现数据并发访问的错误。

Servlet容器调用Servlet的service()方法对请求进行处理。要注意的是,在service()方法调用之前,init()方法必须成功执行。在service()方法中,Servlet实例通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用ServletResponse对象的方法设置响应信息。

销毁

仅执行一次,在服务器端停止且卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资 源。一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。

当Web服务器认为Servlet实例没有存在的必要了,比如应用重新装载,或服务器关闭,以及Servlet很长时间都没有被访问过。服务器可以从内存中销毁(也叫卸载)该实例。Web服务器必须保证在卸载Servlet实例之前调用该实例的destroy()方法,以便回收Servlet申请的资源或进行其它的重要的处理。

当服务器不再需要Servlet实例或重新装入时,会调用destroy方法,使用这个方法,Servlet可以释放掉所有在init方法申请的资源。一个Servlet实例一旦终止,就不允许再次被调用,只能等待被卸载。

Servlet一旦终止,Servlet实例即可被垃圾回收,处于“卸载”状态,如果Servlet容器被关闭,Servlet也会被卸载,一个Servlet实例只能初始化一次,但可以创建多个相同的Servlet实例。如相同的Servlet可以在根据不同的配置参数连接不同的数据库时创建多个实例。

当容器检测到一个Servlet实例应该从服务中被移除的时候,容器就会调用实例的destroy()方法,以便让该实例可以释放它所使用的资源,保存数据到持久存储设备中。当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收。如果再次需要这个Servlet处理请求,Servlet容器会创建一个新的Servlet实例。
  

总结

在整个Servlet的生命周期过程中,创建Servlet实例、调用实例的init()和destroy()方法都只进行一次,当初始化完成后,Servlet容器会将该实例保存在内存中,通过调用它的service()方法,为接收到的请求服务。

相关文章:

  • CSS 文字太多用省略号表示
  • 互联网轻量级框架SSM-查缺补漏第四天
  • 无需Java代码通过JHipster生成有安全验证的微服务应用
  • BZOJ5341[Ctsc2018]暴力写挂——边分治+虚树+树形DP
  • JS变量作用域
  • android环境搭建
  • Windows10 VS2017 C++多线程传参和等待线程结束
  • ZooKeeper的安装与部署
  • Vue.js常用指令:v-on
  • 如何设计一个比特币钱包服务
  • JS 编译器都做了啥?
  • 如何判断/获取屏幕的状态(亮屏已解锁,亮屏未解锁,黑屏)
  • CSS3 animation 练习
  • 腾讯从百度挖来的AI Lab负责人张潼离职,要去阿里?
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • [case10]使用RSQL实现端到端的动态查询
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 08.Android之View事件问题
  • C# 免费离线人脸识别 2.0 Demo
  • gcc介绍及安装
  • HashMap ConcurrentHashMap
  • Java 最常见的 200+ 面试题:面试必备
  • js ES6 求数组的交集,并集,还有差集
  • js 实现textarea输入字数提示
  • node学习系列之简单文件上传
  • Vue组件定义
  • 阿里云购买磁盘后挂载
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 大型网站性能监测、分析与优化常见问题QA
  • 聊聊sentinel的DegradeSlot
  • 批量截取pdf文件
  • 树莓派 - 使用须知
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 一天一个设计模式之JS实现——适配器模式
  • 应用生命周期终极 DevOps 工具包
  • 智能合约开发环境搭建及Hello World合约
  • gunicorn工作原理
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 函数计算新功能-----支持C#函数
  • 如何用纯 CSS 创作一个货车 loader
  • # 飞书APP集成平台-数字化落地
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #QT(TCP网络编程-服务端)
  • #QT(一种朴素的计算器实现方法)
  • #QT(智能家居界面-界面切换)
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (附源码)计算机毕业设计高校学生选课系统
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (七)Java对象在Hibernate持久化层的状态
  • (五)IO流之ByteArrayInput/OutputStream
  • (五)MySQL的备份及恢复
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET CORE 第一节 创建基本的 asp.net core