`
jiues
  • 浏览: 120361 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

ServletContextListener监听器使用

阅读更多
ServletContextListener监听器使用(附网站计数器例子)

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

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

contextInitialized(ServletContextEvent sce):当Servlet容器启动Web应用时调用该方法。在调用完该方法之后,容器再对Filter初始化,并且对那些在Web应用启动时就需要被初始化的Servlet进行初始化。

contextDestroyed(ServletContextEvent sce):当Servlet容器终止Web应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet和Filter过滤器。

下面通过一个例子来介绍ServletContextListener的用法。本章 4.4.1节的例程4-9的CounterServlet类只能统计当Web应用启动后,网页被客户端访问的次数。如果重新启动Web应用,计数器又会重新从1开始统计访问次数。在实际应用中,往往需要统计自Web应用被发布后网页被客户端访问的次数,这就要求当Web应用被终止时,计数器的数值被永久存储在一个文件中或者数据库中,等到Web应用重新启动时,先从文件或数据库中读取计数器的初始值,然后在此基础上继续计数。

向文件中写入或读取计数器的数值的功能可以由自定义的 MyServletContextListener类(参见例程4-11)来完成,它具有以下功能:

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

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

例程4-11 MyServletContextListener.java
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.getResourceAsStream("/count/count.txt"))); 
  18.  
  19. int count=Integer.parseInt(reader.readLine()); 
  20.  
  21. reader.close(); 
  22.  
  23.  //创建计数器对象 
  24.  
  25. Counter counter=new Counter(count); 
  26.  
  27. //把计数器对象保存到Web应用范围 
  28.  
  29. context.setAttribute("counter",counter); 
  30.  
  31. }catch(IOException e){e.printStackTrace();} 
  32.  
  33. } 
  34.  
  35. public void contextDestroyed(ServletContextEvent sce){ 
  36.  
  37. System.out.println("helloapp application is Destroyed."); 
  38.  
  39.     //获取ServletContext对象 
  40.  
  41. ServletContext context=sce.getServletContext(); 
  42.  
  43.     //从Web应用范围获得计数器对象 
  44.  
  45. Counter counter=(Counter)context.getAttribute("counter"); 
  46.  
  47.     if(counter!=null){ 
  48.  
  49. try{ 
  50.  
  51. //把计数器的数值写到count.txt文件中 
  52.  
  53. String filepath=context.getRealPath("/count"); 
  54.  
  55. filepath=filepath+"/count.txt"; 
  56.  
  57. PrintWriter pw=new PrintWriter(filepath); 
  58.  
  59. pw.println(counter.getCount()); 
  60.  
  61. pw.close(); 
  62.  
  63. }catch(IOException e){e.printStackTrace();} 
  64.  
  65. } 
  66.  
  67. } 
  68.  
  69. } 

public class MyServletContextListener implements ServletContextListener{

public void contextInitialized(ServletContextEvent sce){

System.out.println("helloapp application is Initialized.");

    //获取ServletContext对象

ServletContext context=sce.getServletContext();

    try{

//从文件中读取计数器的数值

BufferedReader reader=new BufferedReader(

new InputStreamReader(context.getResourceAsStream("/count/count.txt")));

int count=Integer.parseInt(reader.readLine());

reader.close();

//创建计数器对象

Counter counter=new Counter(count);

//把计数器对象保存到Web应用范围

context.setAttribute("counter",counter);

}catch(IOException e){e.printStackTrace();}

}

public void contextDestroyed(ServletContextEvent sce){

System.out.println("helloapp application is Destroyed.");

    //获取ServletContext对象

ServletContext context=sce.getServletContext();

    //从Web应用范围获得计数器对象

Counter counter=(Counter)context.getAttribute("counter");

    if(counter!=null){

try{

//把计数器的数值写到count.txt文件中

String filepath=context.getRealPath("/count");

filepath=filepath+"/count.txt";

PrintWriter pw=new PrintWriter(filepath);

pw.println(counter.getCount());

pw.close();

}catch(IOException e){e.printStackTrace();}

}

}

}

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

   1. Tips 
   2.  
   3. <listener> 
   4.  
   5. <listener-class>mypack.MyServletContextListener<listener-class /> 
   6.  
   7. </listener> 

Tips

<listener>

<listener-class>mypack.MyServletContextListener<listener-class />

</listener>



下面按如下步骤演示MyServletContextListener监听器的作用。

(1)在helloapp/count目录下创建count.txt文件,在该文件中存放了一个数字“5”。

(2)启动 Tomcat。在浏览器中通过 http://localhost:8080/helloapp/counter 访问CounterServlet,在第一次访问该Servlet时,浏览器端显示计数器的值为5。

(3)刷新上述访问 CounterServlet 的页面,会看到每刷新一次,计数器的值增加1,假定最后一次刷新后的计数器的值为10。

(4)手工终止helloapp应用。查看helloapp/count/count.txt文件,会发现在该文件中存放的数字变为10。

(5)手工重新启动 helloapp 应用。在浏览器中再次访问 CounterServlet,当第一次访问该Servlet时,浏览器端显示计数器的值为10。

从上述实验中可以看出,MyServletContextListener 监听器与 CounterServlet 共享Web应用范围内的代表计数器的Counter对象。监听器在Web应用启动或终止时会操纵Counter对象,而Servlet在每次响应客户请求时会操纵Counter对象。

观察MyServletContextListener及本章4.3.4节的名为 lifeInit的 LifeServlet在 Tomcat 控制台的打印结果的先后顺序,会发现当 Web 应用启动时,Servlet容器先调用MyServletContextListener的contextInitialized()方法,再调用 lifeInit的init()方法;当Web应用终止时,Servlet容器先调用lifeInit的destroy()方法,再调用 MyServletContextListener的contextDestroyed()方法。由此可见,在Web应用的生命周期中,ServletContext对象最早被创建,最晚被销毁。
分享到:
评论
1 楼 tataky 2010-05-21  
这是哪本书里写的

相关推荐

    ServletContextListener socket实现数据接收

    通过创建ServletContextListener监听器,socket来实现tcp/ip协议客户端数据的接收功能。这是一个maven项目,直接导入eclipse即可运行,此处监听的是9092端口,将项目运行起后,可以对其端口使用情况进行查看,在...

    JavaWeb新版教程. jsp--ServletContextListener监听器演示.avi

    JavaWeb新版教程. jsp--ServletContextListener监听器演示.avi

    ServletContextListener使用详解

    ServletContextListener 是 Servlet API 中的一个接口,它能够监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用的生命周期。当 Servlet 容器启动或终止 Web 应用时,会触发 ServletContextEvent 事件,...

    JavaWeb开发技术-Listener监听器.pptx

    Listener监听器 JavaBean Servlet Jsp XML HTML JAVA WEB开发技术 Listener监听器 事件监听器用于对程序中发生的事件进行监听,在监听的过程中会涉及几个重要组成部分: 事件(Event) 事件源 事件处理器 事件监听器...

    23-Listener-源代码.rar

    5)ServletContextListener监听器的主要作用 a、初始化的工作:初始化对象 初始化数据 ---- 加载数据库驱动 连接池的初始 化 b、加载一些初始化的配置文件 --- spring的配置文件 c、任务调度----定时器----Timer/...

    JAVA培训Servlet监听器.pdf

    ServletContextListener用于监听WEB应用启动和销毁的事件,监听器类需要实现javax.servlet.ServletContextListener接口。例如: ```java public class QuartzListener implements ServletContextListener{ private...

    JSP监听器用法分析

    本文实例讲述了JSP监听器用法。分享给大家供大家参考,具体如下: 监听器也叫Listener,是servlet服务的监听器。它可以监听客户端的请求,服务端的操作等...2. ServletContextListener监听ServletContext。当创建Servle

    监听器:监听三个对象的创建和销毁方法

    本次工程的目标是学习监听器,掌握监听三个对象的创建和销毁方法。 三个对象:rquest,session,ServletContext 实现的接口:...2.使用注解的方法注册监听器 3.部署工程并运行,在控制台会输出相应的信息

    spring的监听器和缓存.docx

    public class MyListener implements ServletContextListener { ​ @Override public void contextInitialized(ServletContextEvent sce) { log.info("web项目的启动{} 一开始就启动",sce.getServletContext...

    Spring的监听器ContextLoaderListener的作用

    它实现了 ServletContextListener 接口,在 web.xml 文件中配置这个监听器,启动容器时,就会默认执行它实现的方法。 ContextLoaderListener 的作用可以分为三个方面: 首先,ContextLoaderListener 会关联 ...

    Servlet监听器例子

    关于Servlet监听器的几个例子,用于统计在线人数等等

    Java基于servlet监听器实现在线人数监控功能的方法

    主要介绍了Java基于servlet监听器实现在线人数监控功能的方法,结合实例形式分析了ServletContextListener监听功能的相关使用步骤与操作技巧,需要的朋友可以参考下

    Spring与Web环境集成.pdf

    为了解决这些弊端,我们可以使用ServletContextListener监听Web应用的启动,在Web应用启动时加载Spring的配置文件,创建应用上下文对象ApplicationContext,并将其存储到ServletContext域中。这样,我们就可以在任意...

    用Timer开发的一个定时任务

    最近公司项目要用到定时任务,因为是通过接口传送数据,所以我就新建了一个web项目,在web.xml配置文件里配置一个监听器,然后该监听器再继承HttpServlet,同时实现ServletContextListener接口,很简单的一个定时...

    springboot参考指南

    Application事件和监听器 v. 22.5. Web环境 vi. 22.6. 命令行启动器 vii. 22.7. Application退出 ii. 23.外化配置 i. 23.1. 配置随机值 ii. 23.2. 访问命令行属性 iii. 23.3. Application属性文件 iv. 23.4. 特定的...

    java常见的几种内存溢出和解决方案.docx

    解决方法是实现 ServletContextListener 的监听,在 contextDestroyed 方法中进行关闭。 5. JVM 参数设置: 在 Server 容器启动时,我们需要设置 JVM 的几个参数,包括: * -Xms:java Heap 初始大小 * -Xmx:...

    java定时器的实现

    java定时器的实现 本例依据Java自身提供的接口实现,通过监听器(Listener)和定时器(Timer)定时执行某个任务(Task)。

Global site tag (gtag.js) - Google Analytics