【Jsp精品源码栏目提醒】:本文主要为网学会员提供“Servlet事件监听器 - 其它资料”,希望对需要Servlet事件监听器 - 其它资料网友有所帮助,学习一下!
在 Servlet 技术中已经定义了一些事件,并且我们可以针对这些事件来编写相关的事件监听器,从而对事件作出相应处理。
Servlet 事件主要有 3 类:Servlet上下文事件、会话事件与请求事件。
下面具体讲解这 3 类事件的监听器实现。
1.对 Servlet 上下文进行监听可以监听 ServletContext 对象的创建和删除以及属性的添加、删除和修改等操作。
该监听器需要使用到如下两个接口类: ● ServletContextAttributeListener:监听对 ServletContext 属性的操作,如增加、删除、修改操作。
● ServletContextListener:监听 ServletContext,当创建 ServletContext时,激发 contextInitialized ServletContextEvent sce方法;当销毁ServletContext 时,激发 contextDestroyedServletContext- Event sce方法。
2.监听 Http 会话可以监听 Http 会话活动情况、Http 会话中属性设置情况,也可以监听 Http 会话的 active、paasivate 情况等。
该监听器需要使用到如下多个接口类: ● HttpSessionListener:监听 HttpSession 的操作。
当创建一个 Session时,激发 session Created SessionEvent se方法;当销毁一个 Session 时,激发 sessionDestroyed HttpSessionEvent se 方法。
● HttpSessionActivationListener:用于监听 Http 会话 active、passivate情况。
● HttpSessionAttributeListener:监听 HttpSession 中属性的操作。
当在Session 增加一个属性时,激发 attributeAddedHttpSessionBindingEventse 方法;当在 Session 删除一个属性时,激发attributeRemovedHttpSessionBindingEvent se方法;在 Session 属性被重新设置时,激发 attributeReplacedHttpSessionBindingEvent se 方法。
3.对客户端请求进行监听对客户端的请求进行监听是在 Servlet 2.4 规范中新添加的一项技术,使用的接口类如下: ● ServletRequestListener 接口类。
● ServletRequestAttrubuteListener 接口类。
Servlet 上下文监听器实例下面编写一个实例,使它能够对 ServletContext 以及属性进行监听。
由以上介绍可知,该类需要实现 ServletContextAttributeListener 和ServletContextListener 接口类,其详细代码如下:java view plaincopyprint 1.package servlet 2. 3.import java.io.FileOutputStream 4. 5.import java.io.PrintWriter 6. 7.import javax.servlet.ServletContext 8. 9.import javax.servlet.ServletContextAttributeEvent 10. 11. import javax.servlet.ServletContextAttributeListener 12. 13. import javax.servlet.ServletContextEvent 14. 15. import javax.servlet.ServletContextListener 16. 17. public class MyServletContextListener 18. 19. implements ServletContextListenerServletContextAttributeListener 20. 21. private ServletContext context null //定义 一个 ServletContext 对象变量,赋为 null22.23. public void contextInitializedServletContextEvent s 24.25. //TODO 该方法实现了 ServletContextListener 接口定义的方法,对 ServletContext 进行初始化26.27. this.context s.getServletContext //初始化一 个 ServletContext 对象28.29. printServletContext 初始化...... //打印出该 方法的操作信息30.31. 32.33. public void contextDestroyedServletContextEvent s 34.35. //TODO 该方法实现了 ServletContextListener 接口类定义方法,用 于释放 ServletContext 对象36.37. this.context null38.39. printServletContext 被释放......40.41. 42.43. public void attributeAddedServletContextAttributeEvent sa 44.45. //TODO 当上下文添加属性时,将调用该方法。
这里只是将添加的属 性信息打印出来46.47. print增加 ServletContext 对象的一个属性: attributeAddedsa.getName sa.getValue48.49. 50.51. public void attributeRemovedServletContextAttributeEvent sa 52.53. //TODO 当把 ServletContext 中的某个属性删除时,调用该方法54.55. print删除 ServletContext 对象的某一个属性:attributeRemoved56.57. sa.getName58.59. 60.61. public void attributeReplacedServletContextAttributeEvent sa 62.63. //TODO 当上下文进行属性值更新时,将调用该方法64.65. print更改 ServletContext 对象的某一个属性:attributeReplaced66.67. sa.getNamesa.getValue68.69. 70.71. private void printString message72.73. //调用该方法在 txt 文件中打印出 message 字符串信息74.75. PrintWriter out null76.77. try78.79. out new PrintWriternew FileOutputStreamD:output.txtt rue80.81. out.printlnnew java.util.Date.toLocaleString ContextList ener: message82.83. out.close 84. 85. 86. 87. catchException e 88. 89. 90. 91. e.printStackTrace 92. 93. 94. 95. 96. 97. 程序说明:该监听器类实现了 ServletContextAttributeListener 和ServletContextListener 两个接口类中的 5 个方法: ● contextInitializedServletContextEvent s方法用来初始化ServletContext 对象。
● contextDestroyedServletContextEvent s方法在上下文中删除某个属性时调用。
● attributeAddedServletContextAttributeEvent sa方法在上下文中添加一个新的属性时调用。
● attributeReplacedServletContextAttributeEvent sa方法在更新属性时调用。
● attributeRemovedServletContextAttributeEvent sa方法在上下文中删除某个属性时会被调用。
在使用这个监听器之前还需要在 Web 模块中的 web.xml 配置文件中进行声明,代码如下:java view plaincopyprint 1. 2. 3.servlet.MyServletContextListener 4. 5.接下来就编写
JSP 程序来操作 ServletContext 的属性,看看监听器程序作出什么反应,该
JSP 的一段代码如下:java view plaincopyprint 1.代码说明:当第一次添加属性 userid 时,监听器调用contextInitializedServletContextEvent s初始化监听方法和attributeAddedServletContextAttributeEvent sa添加属性监听方法。
可以查看 D 根目录下的 output.txt 文件内容,如下:2006-7-12 14:07:50 ContextListener: ServletContext 初始化......2006-7-12 14:13:55 ContextListener: 增加 ServletContext 对象的一个属性:attributeAddeduseridzzb2006-7-12 14:13:55 ContextListener: 更改 ServletContext 对象的某一个属性:attributeReplaced useridzzb22006-7-12 14:13:55 ContextListener: 删除 ServletContext 对象的某一个属性:attributeRemoved userid该 log 文件记录了监听器所做的动作。
12.2.2 Http 会话监听器实例通过上一个监听器实例,读者应该对监听器的实现过程有所了解,本小节将要介绍基于 Http 会话的监听器。
首先创建监听器类 MySessionListener.java,其源代码如下:java view plaincopyprint 1.package servlet 2. 3.import java.io.FileOutputStream 4. 5.import java.io.PrintWriter 6. 7.import javax.servlet.ServletContext 8. 9.import javax.servlet.ServletContextEvent 10. 11. import javax.servlet.ServletContextListener 12. 13. import javax.servlet.http.HttpSessionActivationListener 14. 15. import javax.servlet.http.HttpSessionAttributeListener 16. 17. import javax.servlet.http.HttpSessionBindingEvent18.19. import javax.servlet.http.HttpSessionEvent20.21. import javax.servlet.http.HttpSessionListener22.23. public class MySessionListener24.25. implements HttpSessionActivationListenerHttpSessionAttributeListener26.27. HttpSessionListenerServletContextListener28.29. ServletContext context null30.31. int users 032.33. public void sessionWillPassivateHttpSessionEvent arg0 34.35. //监听 Http 会话的 passivate 情况36.37. printsessionWillPassivatearg0.getSession.getId38.39. 40.41. public void sessionDidActivateHttpSessionEvent arg0 42.43. //监听 Http 会话的 active 情况44.45. printsessionDidActivatearg0.getSession.getId46.47. 48.49. public void attributeAddedHttpSessionBindingEvent arg0 50.51. //监听 Http 会话中的属性添加52.53. printattributeAddedarg0.getSession.getIdarg0.getName arg0.getValue54.55. 56.57. public void attributeRemovedHttpSessionBindingEvent arg0 58.59. //监听 Http 会话中的属性删除60.61. printattributeRemovedarg0.getSession.getIdarg0.getName arg0.getValue62.63. 64.65. public void attributeReplacedHttpSessionBindingEvent arg0 66.67. //监听 Http 会话中的属性更改操作68.69. printattributeReplacedarg0.getSession.getIdarg0.getName arg0.getValue70.71. 72.73. public void sessionCreatedHttpSessionEvent arg0 74.75. //Http 会话的创建监听76.77. users //创建一 个会话,把 users 变量加 178.79. printsessionCreatedarg0.getSession.getId目前拥有 users个用户80.81. context.setAttributeusersnew Integerusers //把会话数设 置到 ServletContext 的属性 users 中82.83. 84.85. public void sessionDestroyedHttpSessionEvent arg0 86.87. //Http 会话的释放监听88.89. users-- //释放一 个会话,把 users 变量减 190.91. printsessionDestroyedarg0.getSession.getId目前拥有 users个用户92.93. context.setAttributeusersnew Integerusers //把会话数设 置到 ServletContext 的属性 users 中94.95. 96.97. public void contextInitializedServletContextEvent arg0 98.99. //该方法实现了 ServletContextListener 接口定义的方法,对 ServletContext 进行初始化100.101. this.context arg0.getServletContext //初始化 ServletContext 对象102.103. printServletContext 初始化...... //打印出 该方法的操作信息104.105. 106.107. public void contextDestroyedServletContextEvent arg0 108.109. //监听 Servlet 上下文被释放110.111. this.context null //释放 ServletContext 对象112.113. printServletContext 被释放...... //打印出 该方法的操作信息114.115. 116.117. private void printString message118.119. //调用该方法在 txt 文件中打印出 message 字符串信息120.121. PrintWriter out null122.123. try124.125. out new PrintWriternew FileOutputStreamd:output.tx ttrue126.127. out.printlnnew java.util.Date.toLocaleString Session Listener: message128.129. out.close130.131. 132.133. catchException e134.135. 136.137. e.printStackTrace138.139. 140.141. 142. 143. 程序说明:(1)该程序实现了 HttpSessionListener 接口类中的两个方法: ● sessionCreatedHttpSessionEvent arg0方法进行 Http 会话创建的监听,如果 Http 会话被创建将调用该方法。
● sessionDestroyedHttpSessionEvent arg0方法对 Http 会话销毁进行监听,如果某个 Http 会话被释放将调用该方法。
(2)实现 HttpSessionActivationListener 接口类中的如下两个方法: ● sessionDidActivateHttpSessionEvent arg0方法对 Http 会话处于active 情况进行监听。
● sessionWillPassivateHttpSessionEvent arg0方法对 Http 会话处于passivate 情况进行监听。
(3)实现 HttpSessionAttributeListener 接口类中的如下 3 种方法: ● attributeAddedHttpSessionBindingEvent arg0方法对 Http 会话中属性添加进行监听。
● attributeReplacedHttpSessionBindingEvent arg0方法对 Http 会话中属性修改进行监听。
● attributeRemovedHttpSessionBindingEvent arg0方法对 Http 会话中属性删除进行监听。
(4)另外,该程序中还实现了 ServletContextListener 接口类,该类的实现方法已经在 12.2.1 小节中有所介绍。
同样需要在 web.xml 配置文件进行该监听器的声明,配置方法如 12.2.1 小节介绍。
该监听器实现了在线会话人数的统计,当一个会话创建时,users 变量将加1;当销毁一个会话对象的时候,users 变量将减 1。
下面创建测试的
JSP 页面程序,代码如下:java view plaincopyprint 1.执行效果可以查看 output.txt 文档内容,如下:2006-7-12 15:24:47 SessionListener: ServletContext 初始化......2006-7-12 15:25:47 SessionListener:sessionCreated720C4654847ECE025DF6A8AF09117212目前拥有 1 个用户2006-7-12 15:25:47 SessionListener:attributeAdded720C4654847ECE025DF6A8AF09117212usernamezzb12006-7-12 15:25:47 SessionListener:attributeReplaced720C4654847ECE025DF6A8AF09117212usernamezzb12006-7-12 15:25:47 SessionListener:attributeRemoved720C4654847ECE025DF6A8AF09117212usernamezzb22006-7-12 15:25:47 SessionListener:sessionDestroyed720C4654847ECE025DF6A8AF09117212目前拥有 0个用户12.2.3 客户端请求监听器实例对客户端请求进行监听的技术是在 Servlet 2.4 版本之后才出现的。
一旦监听程序能够获得客户端请求,就可以对所有客户端请求进行统一处理。
例如,一个Web 程序如果在本机访问,就可以不登录,如果是远程访问,即需要登录。
这是通过监听客户端请求,从请求中获取到客户端地址,并通过地址来作出相应的处理。
实现客户端请求监听的程序代码如下:
上一篇:
疯狂Java讲义
下一篇:
首鼠两端