ServletContextListener使用详解

RAGFlow 系列教程 第三课:后端服务入口与请求生命周期 本文深入解析RAGFlow v0.25.0后端核心机制,重点介绍了Quart框架选型原因和服务启动流程。RAGFlow选择Quart作为Web框架,主要基于其异步能力对LLM调用的支持、Flask生态兼容性以及长响应超时处理优势。文章详细拆解了服务启动的8个关键步骤,从日志初始化到HTTP服务启动,并分析了配置加载、数据库初始化等核心环节。通过源码分析揭示了RAGFlow如何实现动态API注册、双重认证体系等关键技术点,为深入理解该系统的请求处理生命周期提供了基础。 阅读详情

在Servlet API中有一个ServletContextListener接口,它能够监听ServletContext对象的生命周期,实际上就是监听Web应用的生命周期。

当Servlet容器启动或终止Web应用时,会触发ServletContextEvent事件,该事件由ServletContextListener 来处理。在 ServletContextListener 接口中定义了处理ServletContextEvent事件的两个方法。

Java代码  收藏代码


  1. /** 
  2.  * 当Servlet 容器启动Web 应用时调用该方法。在调用完该方法之后,容器再对Filter 初始化, 
  3.  * 并且对那些在Web 应用启动时就需要被初始化的Servlet 进行初始化。 
  4.  */  
  5. contextInitialized(ServletContextEvent sce)   
  6.   
  7.   
  8. /** 
  9.  * 当Servlet 容器终止Web 应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet 和Filter 过滤器。 
  10.  */  
  11. contextDestroyed(ServletContextEvent sce) 


 

 下面通过两个具体的例子来介绍ServletContextListener的用法。

 

例一:在服务启动时,将数据库中的数据加载进内存,并将其赋值给一个属性名,其它的Servlet就可以通过getAttribute进行属性值的访问。

 

有如下两个步骤:

 

1:ServletContext对象是一个为整个web应用提供共享的内存,任何请求都可以访问里面的内容 

 

2:如何实现在服务启动的时候就动态的加入到里面的内容:我们需要做的有: 

1)实现servletContextListerner接口 并将要共享的通过setAttribute(name,data)方法提交到内存中去 ;

2)应用项目通过getAttribute(name)将数据取到。

 

Java代码  收藏代码
  1. public class ServletContextLTest implements ServletContextListener{   
  2.   
  3.     // 实现其中的销毁函数  
  4.       
  5.     public void contextDestroyed(ServletContextEvent sce) {   
  6.   
  7.         System.out.println("this is last destroyeed");      
  8.   
  9.     }   
  10.   
  11.     // 实现其中的初始化函数,当有事件发生时即触发  
  12.   
  13.     public void contextInitialized(ServletContextEvent sce) {   
  14.   
  15.         ServletContext sct=sce.getServletContext();   
  16.   
  17.         Map<Integer,String> depts=new HashMap<Integer,String>();   
  18.   
  19.         Connection connection=null;   
  20.   
  21.         PreparedStatement pstm=null;   
  22.   
  23.         ResultSet rs=null;   
  24.   
  25.            
  26.   
  27.         try{   
  28.   
  29.             connection=ConnectTool.getConnection();   
  30.   
  31.             String sql="select deptNo,dname from dept";   
  32.   
  33.             pstm=connection.prepareStatement(sql);   
  34.   
  35.             rs=pstm.executeQuery();   
  36.   
  37.             while(rs.next()){   
  38.   
  39.                 depts.put(rs.getInt(1), rs.getString(2));   
  40.   
  41.             }   
  42.   
  43.             // 将所取到的值存放到一个属性键值对中  
  44.   
  45.             sct.setAttribute("dept", depts);   
  46.   
  47.             System.out.println("======listener test is beginning=========");   
  48.   
  49.         }catch(Exception e){   
  50.   
  51.             e.printStackTrace();   
  52.   
  53.         }finally{   
  54.   
  55.             ConnectTool.releasersc(rs, pstm, connection);   
  56.   
  57.         }   
  58.   
  59.     }   
  60.   
  61. }  
 

在完成上述编码后,仍需在web.xml中进行如下配置,以使得该监听器可以起作用。

 

Xml代码  收藏代码
  1. <listener>   
  2.   
  3.    <listener-class>ServletContextTest.ServletContextLTest</listener-class>   
  4.   
  5. </listener>    

 

在完成上述配置后,web服务器在启动时,会直接加载该监听器,通过以下的应用程序就可以进行数据的访问。

 

Java代码  收藏代码
  1. public class CreateEmployee extends HttpServlet{   
  2.   
  3.     @Override   
  4.   
  5.     protected void service(HttpServletRequest request, HttpServletResponse response)   
  6.   
  7.             throws ServletException, IOException {   
  8.   
  9.         ServletContext sct=getServletConfig().getServletContext();   
  10.   
  11.         // 从上下文环境中通过属性名获取属性值  
  12.   
  13.         Map<Integer,String> dept=(Map<Integer,String>)sct.getAttribute("dept");   
  14.   
  15.         Set<Integer> key=dept.keySet();   
  16.   
  17.         response.setContentType("text/html;charset=utf-8");   
  18.   
  19.         PrintWriter out=response.getWriter();   
  20.   
  21.         out.println("<html>");   
  22.   
  23.         out.println("<body>");   
  24.   
  25.         out.println("<form action='/register' action='post'>");   
  26.   
  27.         out.println("<table alignb='center'>");   
  28.   
  29.         out.println("<tr>");   
  30.   
  31.         out.println("<td>");   
  32.   
  33.         out.println("username:");   
  34.   
  35.         out.println("</td>");   
  36.   
  37.         out.println("<td>");   
  38.   
  39.         out.println("<input type='text' name='username'");   
  40.   
  41.         out.println("</tr>");   
  42.   
  43.         out.println("<tr>");   
  44.   
  45.         out.println("<td>");   
  46.   
  47.         out.println("city:");   
  48.   
  49.         out.println("</td>");   
  50.   
  51.         out.println("<td>");   
  52.   
  53.         out.println("<select name='dept'");   
  54.   
  55.         for(Integer i:key){   
  56.   
  57.             out.println("<option value='"+i+"'>"+dept.get(i)+"</option>");   
  58.   
  59.         }   
  60.   
  61.         out.println("</select>");   
  62.   
  63.         out.println("</td>");   
  64.   
  65.         out.println("<tr>");   
  66.   
  67.         out.println("</table>");   
  68.   
  69.         out.println("</form>");   
  70.   
  71.         out.println("</body>");   
  72.   
  73.         out.println("</html>");   
  74.   
  75.         out.flush();   
  76.   
  77.     }   
  78.   
  79. }  

 

例二:书写一个类用于统计当Web应用启动后,网页被客户端访问的次数。如果重新启动Web应用,计数器不会重新从1开始统计访问次数,而是从上次统计的结果上进行累加。

 

在实际应用中,往往需要统计自Web应用被发布后网页被客户端访问的次数,这就要求当Web应用被终止时,计数器的数值被永久存储在一个文件中或者数据库中,等到Web应用重新启动时,先从文件或数据库中读取计数器的初始值,然后在此基础上继续计数。

 

向文件中写入或读取计数器的数值的功能可以由自定义的 MyServletContextListener类来完成,它具有以下功能:

 

1、在 Web应用启动时从文件中读取计数器的数值,并把表示计数器的 Counter对象存放到 Web 应用范围内。存放计数器的文件的路径为helloapp/count/count.txt。

2、在Web应用终止时把Web应用范围内的计数器的数值保存到count.txt文件中。

Java代码  收藏代码
  1. public class MyServletContextListener implements ServletContextListener{  
  2.   
  3.   public void contextInitialized(ServletContextEvent sce){  
  4.   
  5.     System.out.println("helloapp application is Initialized.");  
  6.   
  7.     // 获取 ServletContext 对象  
  8.   
  9.     ServletContext context=sce.getServletContext();  
  10.   
  11.     try{  
  12.   
  13.        // 从文件中读取计数器的数值  
  14.   
  15.        BufferedReader reader=new BufferedReader(  
  16.   
  17.            new InputStreamReader(context.  
  18.   
  19.            getResourceAsStream("/count/count.txt")));  
  20.   
  21.        int count=Integer.parseInt(reader.readLine());  
  22.   
  23.        reader.close();  
  24.   
  25.        // 创建计数器对象  
  26.   
  27.        Counter counter=new Counter(count);  
  28.   
  29.        // 把计数器对象保存到 Web 应用范围  
  30.   
  31.        context.setAttribute("counter",counter);  
  32.   
  33.        } catch(IOException e) {  
  34.   
  35.           e.printStackTrace();  
  36.   
  37.        }  
  38.   
  39.    }  
  40.   
  41.    public void contextDestroyed(ServletContextEvent sce){  
  42.   
  43.        System.out.println("helloapp application is Destroyed.");  
  44.   
  45.        // 获取 ServletContext 对象  
  46.   
  47.        ServletContext context=sce.getServletContext();  
  48.   
  49.        // 从 Web 应用范围获得计数器对象  
  50.   
  51.        Counter counter=(Counter)context.getAttribute("counter");  
  52.   
  53.        if(counter!=null){  
  54.   
  55.        try{  
  56.   
  57.           // 把计数器的数值写到 count.txt 文件中  
  58.   
  59.           String filepath=context.getRealPath("/count");  
  60.   
  61.           filepath=filepath+"/count.txt";  
  62.   
  63.           PrintWriter pw=new PrintWriter(filepath);  
  64.   
  65.           pw.println(counter.getCount());  
  66.   
  67.           pw.close();  
  68.   
  69.          } catch(IOException e) {  
  70.   
  71.              e.printStackTrace();  
  72.   
  73.          }  
  74.   
  75.      }  
  76.   
  77.    }  
  78.   
  79. }   
 

将用户自定义的MyServletContextListener监听器在Servlet容器进行注册,Servlet容器会在启动或终止Web应用时,会调用该监听器的相关方法。在web.xml文件中,<listener>元素用于向容器注册监听器:

Xml代码  收藏代码
  1. <listener>  
  2. <listener-class> ServletContextTest .MyServletContextListener<listener-class />  
  3. </listener>   

 

通过上述两个例子,即可以非常清楚的了解到ServletContextListener接口的使用方法及技巧。

 

在Container加载Web应用程序时(例如启动 Container之后),会呼叫contextInitialized(),而当容器移除Web应用程序时,会呼叫contextDestroyed ()方法。

 

通过Tomcat 控制台的打印结果的先后顺序,会发现当 Web 应用启动时,Servlet容器先调用contextInitialized()方法,再调用lifeInit的init()方法;

当Web应用终止时,Servlet容器先调用lifeInit的destroy()方法,再调用contextDestroyed()方法。

 

由此可见,在Web应用的生命周期中,ServletContext对象最早被创建,最晚被销毁。

 

原文地址:http://blog.youkuaiyun.com/zhaozheng7758/archive/2010/12/28/6103700.aspx

上线之前多一道闸:业务审核系统的接入定义、双轨状态机与可靠生效闭环 运营后台“保存即生效”,让价格、库存、人群等配置每次修改都相当于一次无评审的上线。本文以至尊会员降价活动为例,系统拆解业务审核系统:用带业务语义的操作编码、规则化审核人与候选人快照、完整的生效回调契约做好接入定义;把业务改造为提交待生效,以不可变快照、字段级差异和唯一约束加幂等号防误配防重复;用审批轨与执行轨双轨状态机、链路式重新提交和以事件为准的审核链路理清状态;最后以发件箱、幂等键、超时先查后试、乐观锁与对账闭合生效环节,并结合两个可运行的Java程序,给出五种生效策略的事故率实测对比。 阅读详情

相关推荐

摄像头模组CCM简介

摄像头模组,全称Camera Compact Module,简写为CCM。CCM 包含几大件: 镜头(lens)、音圈马达(VCM)、传感器(sensor)、软板(FPC)、图像处理芯片(DSP)。工作原理:物体通过镜头(lens)聚集的光,通过CMOS或CCD集成电路,把光信号转换成电信号,再经过内部图像处理器(ISP)转换成数字图像信号输出到数字信号处理器(DSP)加工处理,转换成标准的GRB、YUV等格式图像信号。摄像头模组主要由以下几个部分组成:镜头(Lens):将光线汇聚到图像传感器上。

m0_73482095的博客 1万+

ServletContextListener

Servlet应用程序需要放置到servlet容器中运行,那么应用程序需要与容器进行配合运行,就需要使用ServletContext 与 Web 容器通信。例如写日志,转发请求等。 每一个 Web 应用程序含有一个Context,也就是ServletContext,被Web应用内的各个程序共享。因为Context可以用来保存资源并且共享,所以我所知道的 ServletContext 的最大应用是...

君寞傲 4932

RS485接口EMC设计:三级防护与滤波隔离方案

RS485总线在工业现场面临共模噪声、差模脉冲和地电位差三大电磁兼容挑战。通过三级防护架构(气体放电管、PTC热敏电阻、半导体放电管)实现能量梯次泄放,结合共模扼流圈和滤波电容形成完整防护链。该方案经实测可将6kV浪涌下的通信稳定性提升90%,特别适用于工业自动化、电力监控等严苛环境。设计要点包括防护器件选型计算、PCB分区布局及地处理策略,其中GDT通流能力与TSS箝位电压的配合是关键。

weixin_33419305的博客 525

ServletContextListener基础介绍

ServletContextListener

优快云_G_Y的博客 674

免费AI视频生成全流程:通义千问+Seedance 2.5+Grok实战指南

AI视频生成正在成为内容创作的重要方式,但高昂的API费用常让个人创作者望而却步。实际上,通过合理组合云端免费工具,也能搭建一条完整的视频生产链路:利用大模型生成脚本,用视频生成模型将文本渲染成画面,再借助多模态模型进行一致性校验。这种“文本+视频+多模态”的协作模式,将复杂的生成任务解耦为可独立调用的模块,既降低了本地硬件要求,也为批量内容验证提供了低成本方案。该流程适用于短视频素材快速产出、产品Demo验证以及AI应用集成等场景,核心在于打通免费账号、API调用与批量任务调度。本文以通义千问、Seeda

weixin_29044157的博客 380

中标麒麟,postgres报错invalid value for parameter "timeZone":"Asia/Beijing"

在中标麒麟服务器上,安装postgres,启动tomcat容器时,报invalid value for parameter "timeZone":"Asia/Beijing"。 查看postgres运行日志,也报同样的错误。 报错原因:服务器的时区,在Postgres支持的时区目录中找不到。当时在服务器上信息为Beijing 解决步骤: 1. cat /etc/sysconfig/cloc

u010213931的博客 7924

Java Web——Servlet的监听器接口(ServletContextListener、ServletContextAttributeListener)

Java Web——Servlet的监听器接口(ServletContextListener、ServletContextAttributeListener)

贝尔摩德苦艾酒 1万+

基于Coze平台从零构建AI智能体:以测试用例生成为例的实战指南

在人工智能技术快速发展的今天,大语言模型(LLM)和提示词工程(Prompt Engineering)已成为构建智能应用的核心技术。其原理在于通过自然语言指令引导模型完成特定任务,其技术价值在于极大地降低了AI应用开发的门槛,使非专业开发者也能快速实现想法。这一技术广泛应用于自动化办公、智能客服、内容生成等场景。本文聚焦于字节跳动旗下的Coze平台,该平台通过可视化工作流编排和预置技能,将上述技术封装为易用的工具。文章以“根据产品需求文档(PRD)自动生成测试用例”这一具体场景为例,详细拆解了从需求分析、工

weixin_30617695的博客 338

ServletContext 接口详解和具体应用

MIME(Multipurpose Internet Mail Extensions)类型,也称为媒体类型(media type)或内容类型(content type),是一种标识数据类型的标准,用于指示在传输过程中需要处理的数据的类型。MIME类型通常与文件扩展名相关联,用于表示一个文件的类型。

swadian2008的博客 3211

在 PyCharm 中使用 Copilot

此外,要在 PyCharm 中使用 GitHub Copilot,您必须有效订阅 Copilot。在 PyCharm 中安装 GitHub Copilot 后,您现在可以将其用作项目的扩展。此外,它很容易安装在不同的 IDE 平台上,您还可以为特定编程语言启用 GitHub 插件。此外,按照以下步骤,您可以轻松地在 PyCharm 中安装 GitHub Copilot。此外,在 IDE 上使用 GitHub Copilot 时,您可以使用一些快捷方式。

一览无遗 1万+

【基于CKF的IMM】CV和CT两个模型下的IMM,二维,滤波使用CKF(容积卡尔曼滤波),附完整的matlab代码

该文章摘要: 本文提出了一种基于交互多模型(IMM)和容积卡尔曼滤波(CKF)的融合定位算法,用于解决目标在直线运动和转弯机动之间的模型切换问题。通过MATLAB仿真实现了IMM-CKF算法,并与单一的CV-CKF(匀速模型)和CT-CKF(匀角速转弯模型)方法进行对比。实验结果表明,在包含直线段和转弯段的复合轨迹跟踪中,IMM-CKF方法能够自适应调整模型权重,显著提高了定位精度。轨迹跟踪图、位置/速度误差对比图以及模型概率曲线直观展示了IMM算法的优势。文章提供了完整的MATLAB实现代码,可用于目标跟

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 615

ServletContextListener使用

 ServletContextListener 接口作用:监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用的生命周期。  ServletContextListener 接口主要有两个方法,一个在当Servlet 容器启动web应用时调用,另一个是在Servlet 容器终止web应用时调用。实现 ServletContextListener 接口需重写这两方法。 ...

累死的青蛙 5067

YOLOv11改进策略【损失函数篇】| arXiv2025 TeLU双曲正切指数线性单元 强梯度防消失 + 解析光滑稳训练,极速提升收敛与泛化

本文记录的是。TeLU(Hyperbolic Tangent Exponential Linear Unit)通过。本文利用TeLU激活函数,以x⋅tanhex统一实现正区间强梯度加速收敛与负区间持续梯度避免死神经元,全程保持解析光滑与极低计算开销,,显著提升深度网络在分类、检测、分割、时序任务中的收敛速度、精度与泛化鲁棒性。

Limiiiing的博客 224

ServletContextListener 在springboot 中的使用

1.实现ServletContextListener /** * 自定义监听器,用来监听系统启动,和注销 */ @WebListener public class SystemListener implements ServletContextListener { Logger logger = LoggerFactory.getLogger(SystemListener.class); @Override public void contextInitialized(Se.

ye___li的博客 2743

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

多个ServletContextListener的使用

因为项目一些代码原因,tomcat老僵死,linux下执行tomcat的shutdown脚本总是无法关闭。考虑到改代码逻辑不太实际,于是写了个监听器类实现ServletContextListener,在contextDestroyed方法中实现关闭的逻辑,再在web.xml配好,问题搞定。     由于之前没怎么用过这个,有点好奇。趁有空做了个简单的测试。 测试A: publ

luxiaohuoa的专栏 1918

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

ServletContextListener示例

侦听器是坐在那里的东西,等待指定的事件发生,然后“劫持”该事件并运行自己的事件。 问题 您想在启动Web应用程序之前初始化数据库连接池,Web应用程序环境中是否存在“ main()”方法? 解 ServletContextListener是您想要的,它将在启动Web应用程序之前运行您的代码。 1. ServletContextListener示例 在此示例中,我们将向您展示如...

一名可爱的技术搬运工 207

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: 修改tomcat的conf/server.xml解决网页乱码
下一篇: spring开发:spring的作用域(scope="prototype";scope="singleton")
RiceToLife
博客等级 码龄10年 4粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值