Servlet监听器的使用

制作人:全心全意

在Servlet技术中已经定义了一些事件,并且可以针对这些事件来编写相关的事件监听器,从而对事件做出相应的处理。例如,想要在Web应用程序启动和关闭时来执行一些任务(如数据库连接的建立和释放),或者想要监控Session的创建和销毁,那么就可以通过监听器来实现。

Servlet监听器简介

监听器的作用是监听Web容器的有效期事件,因此它是由容器管理的。利用Listener接口监听在容器中的某个执行程序,并且根据其应用程序的需求做出适当的响应。

Servlet和JS中的8个Listener接口和6个Event类

Listener接口 Event类
    ServletContextListener     ServletContextEvent
    ServletContextAttributeListener     ServletContextAttributeEvent
    HttpSessionListener     HttpSessionEvent
    HttpSessionActivationListener
    HttpSessionAttributeListener     HttpSessionBindingEvent
    HttpSessionBindingListener
    ServletResquestListener     ServletResquestEvent
    ServletRequestAttributeListener     ServletRequestAttributeEvent

Servlet监听器的原理

Servlet监听器是当今Web应用开发的一个重要组成部分。它是在Servlet2.3规范中的Servlet过滤器一起引入的,并且在Servlet2.4规范中对其进行了较大的改进,主要就是用来对Web应用进行监听和控制的,极大地增强了Web应用的事件处理能力。

Servlet监听器的功能比较接近Java的GUI程序的监听器,可以监听由于Web应用中状态改变而引起的Servlet容器产生的相应事件,然后接受并处理这些事件。

Servlet上下文监听

Servlet上下文监听可以监听ServletContext对象的创建、删除以及属性添加、删除和修改操作,该监听器需要用到以下两个接口。

  • ServletContextListener接口

该接口存放在javax.servlet包内,它主要实现监听ServletContext的创建和删除。ServletContextListener接口提供了两个方法,它们也被称为“Web应用程序的生命周期方法”。下面分别进行介绍。

  contextInitialized(ServletContextEvent event)方法:通知正在收听的对象,应用程序已将被加载及初始化。

  contextDestroyed(ServletContextEvent event)方法:通知正在收听的对象,应用程序已经被载出,即关闭。

  • ServletAttributeListener接口

该接口存放在javax.servlet包内,主要实现监听ServletContext属性的增加、删除和修改。ServletAttributeListener接口提供了以下3个方法。

  attributeAdded(ServletContextAttributeEvent event)方法:当有对象加入Application的范围时,通知正在收听的对象。

  attributeReplaced(ServletContextAttributeEvent event)方法:当在Application的范围有对象取代另一个对象时,通知正在收听的对象。

  attributeRemoved(ServletContextAttributeEvent event)方法:当有对象从Application的范围移除时,通知正在收听的对象。

HTTP会话监听

HTTP会话监听(HttpSession)信息,有4个接口可以进行监听。

  • HttpSessionListener接口

HttpSessionListener接口实现监听HTTP会话创建、销毁。HttpSessionListener接口提供了两个方法。

  sessionCreated(HttpSessionEvent event)方法:通知正在收听的对象,session已经被加载及初始化。

  sessionDestroyed(HttpSessionEvent event)方法:通知正在收听的对象,session已经被载出(HttpSessionEvent类的主要方法是getSession(),可以使用该方法回传一个session对象。)

  • HttpSessionActivationListener接口

HttpSessionActivationListener接口实现监听HTTP会话active和passivate。HttpSessionActivationListener接口提供了以下3个方法。

  attributeAdded(HttpSessionBindingEvent event)方法:当有对象加如session的范围时,通知正在收听的对象。

  attributeReplaced(HttpSessionBindingEvent event)方法:当在session的范围有对象取代另一个对象时,通知正在收听的对象。

  attributeRemoved(HttpSessionBindingEvent event)方法:当有对象从session的范围移除时,通知正在收听的对象(HttpSessionBindingEvent类主要有3个方法:getName()、getSession()和getValues())。

  • HttpBindingListener接口

HttpBindingListener接口实现监听HTTP会话中对象的绑定信息。它是唯一不需要在web.xml中设定Listener的。HttpBindingListener接口提供以下两个方法。

  valueBound(HttpSessionBindingEvent event)方法:当有对象加入session范围内时会被自动调用。

  valueUnBound(HttpSessionBindingEvent event)方法:当有对象从session的范围内移除时会被自动调用。

  • HttpSessionAttributeListener接口

HttpSessionAttributeListener接口实现监听HTTP会话中属性的设置请求。HttpSessionAttributeListener接口提供以下两个方法。

  sessionDidActivate(HttpSessionEvent event)方法:通知正在收听的对象,它的session已经变为有效状态。

  sessionWillPassivate(HttpSessionEvent event)方法:通知正在收听的对象,它的session已经变为无效状态。

Servlet请求监听

在Servlet2.4规范中新增加了一个技术,就是可以监听客户端的请求。一旦能够在监听程序中获取客户端的请求,就可以对请求进行统一处理。要实现客户端的请求和请求参数设置的监听需要实现两个接口。

  • ServletRequestListener接口

ServletRequestListener接口提供了以下两个方法。

  requestInitalized(ServletRequestEvent event)方法:通知正在收听的对象,ServletRequest已经被加载及初始化。

  requestDestroyed(ServletRequestEvent event)方法:通知正在收听的对象,ServletRequest已经被载出,即关闭。

  • ServletRequestAttributeListener接口

ServletRequestAttribute接口提供了以下3个方法。

  attributeAdded(ServletRequestAttributeEvent event)方法:当有对象加入request的范围时,通知正在收听的对象。

  attributeReplaced(ServletRequestAttributeEvent event)方法:当在request的范围内有对象取代另一个对象时,通知正在收听的对象。

  attributeRemoved(ServletRequestAttributeEvent event)方法:当有对象从request的范围移除时,通知正在收听的对象。

Servlet监听器的使用实例

实例1:监听统计在线人数

UserInfoList类:用在存储在线用户和对在线用户的具体操作。

  1. package com.zq;
  2.  
  3. import java.util.Vector;
  4.  
  5. public class UserInfoList {
  6. private static UserInfoList user = new UserInfoList();
  7. private Vector vector = null;
  8.  
  9. public UserInfoList() {
  10. this.vector = new Vector();
  11. }
  12.  
  13. public static UserInfoList getInstance() {
  14. return user;
  15. }
  16.  
  17. // 增加用户
  18. public boolean addUserInfo(String user) {
  19. if (user != null) {
  20. this.vector.add(user);
  21. return true;
  22. } else {
  23. return false;
  24. }
  25. }
  26.  
  27. // 获取用户列表
  28. public Vector getList() {
  29. return vector;
  30. }
  31.  
  32. // 移除用户
  33. public void removeUserInfo(String user) {
  34. if (user != null) {
  35. this.vector.removeElement(user);
  36. }
  37. }
  38. }

UserInfoTrace监听类:当有对象加入session时,valueBound()方法会自动被执行;当有对象从session中移除时,valueUnbound()方法会被自动执行,在valueBound()和valueUnbound()方法中都加入了输出信息的功能,可使用户在控制台中更清楚地了解执行过程。

  1. package com.zq;
  2.  
  3. import javax.servlet.http.HttpSessionBindingEvent;
  4.  
  5. public class UserInfoTrace
  6. implements javax.servlet.http.HttpSessionBindingListener {
  7.  
  8. private String user;
  9. private UserInfoList container = UserInfoList.getInstance();
  10.  
  11. public UserInfoTrace() {
  12. user = "";
  13. }
  14.  
  15. // 设置在线监听人员
  16. public void setUser(String user) {
  17. this.user = user;
  18. }
  19.  
  20. // 获取在线监听
  21. public String getUser() {
  22. return this.user;
  23. }
  24.  
  25. public void valueBound(HttpSessionBindingEvent arg0) {
  26. System.out.println("上线" + this.user);
  27.  
  28. }
  29.  
  30. public void valueUnbound(HttpSessionBindingEvent arg0) {
  31. System.out.println("下线" + this.user);
  32. if (user != "") {
  33. container.removeUserInfo(user);
  34. }
  35. }
  36.  
  37. }

index.jsp页面:用于放置增加在线用户的表单

  1. <%@ page language="java" contentType="text/html; charset=utf-8"
  2. pageEncoding="utf-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  7. <title>使用监听查看在线用户</title>
  8. </head>
  9. <script language="javascript">
  10. function checkEmpty(form) {
  11. for (i = 0; i < form.length; i++) {
  12. if (form.elements[i].value == "") {
  13. alert("表单信息不能为空");
  14. return false;
  15. }
  16. }
  17. }
  18. </script>
  19. <body>
  20. <form name="form" method="post" action="showUser.jsp"
  21. onSubmit="return checkEmpty(form)">
  22. <input type="text" name="user"><br> <br> <input
  23. type="submit" name="Submit" value="登录">
  24. </form>
  25.  
  26. </body>
  27. </html>

showUser.jsp页面:用于接收index.jsp页面表单提交的用户,在在线用户列表中添加此用户,并显示所有在线用户。

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ page import="java.util.*"%>
  4. <%@ page import="com.zq.*"%>
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  6. <html>
  7. <head>
  8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  9. <title>显示用户</title>
  10. </head>
  11. <body>
  12. <%
  13. UserInfoList list = UserInfoList.getInstance();
  14. UserInfoTrace ut = new UserInfoTrace();
  15. String name = request.getParameter("user");
  16. ut.setUser(name);
  17. session.setAttribute("list", ut);
  18. list.addUserInfo(ut.getUser());
  19. session.setMaxInactiveInterval(10);
  20. //session最大时限为10秒
  21. %>
  22. <textarea rows="8" cols="20">
  23. <%
  24. Vector vector = list.getList();
  25. if (vector != null && vector.size() > 0) {
  26. for (int i = 0; i < vector.size(); i++) {
  27. out.println(vector.elementAt(i));
  28. }
  29. }
  30. %>
  31. </textarea>
  32. <br>
  33. <a href="loginOut.jsp">退出</a>
  34.  
  35. </body>
  36. </html>

loginOut.jsp页面:用于放置在showUser.jsp页面中点击退出按钮后的处理内容,并在处理后,重定向页面到index.jsp页面。

  1. <%@ page language="java" contentType="text/html; charset=utf-8"
  2. pageEncoding="utf-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  7. </head>
  8. <body>
  9. <%
  10. session.invalidate();
  11. %>
  12. </body>
  13. <script>
  14. parent.location.href = 'index.jsp';
  15. </script>
  16. </html>

Servlet监听器的使用的更多相关文章

  1. servlet监听器Listener(理论+例子)

    Listener采用了观察者模式(24种模式之一),Listener是servlet的监听器,他可以监听客户端的请求.服务器端的操作等, 通过监听器,可以自动激发一些操作.比如:监听在线用户数量 当增 ...

  2. [原创]java WEB学习笔记47:Servlet 监听器简介, ServletContext(Application 对象), HttpSession (Session 对象), HttpServletRequest (request 对象) 监听器,利用listener理解 三个对象的生命周期

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  3. JSP的Servlet监听器

    JSP的Servlet监听器 来源: http://blog.csdn.net/phoenix_17th/article/details/3868670 Servlet 监听器用于监听一些重要事件的发 ...

  4. Java进阶(十三)servlet监听器

    servlet监听器 Listener是Servlet的监听器,它可以监听客户端的请求.服务端的操作等.通过监听器,可以自动激发一些操作,比如监听在线的用户的数量.当 增加一个HttpSession时 ...

  5. 【Servlet】1、Servlet监听器及相关接口

    Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前.发生后可以做一些必要的处理. 接口: 目前Servlet2.4和JSP2.0总共有8个监听器接口和6个Event类,其中Ht ...

  6. Servlet监听器统计在线人数

    监听器的作用是监听Web容器的有效事件,它由Servlet容器管理,利用Listener接口监听某个执行程序,并根据该程序的需求做出适应的响应. 例1 应用Servlet监听器统计在线人数. (1)创 ...

  7. Servlet监听器——实现在线登录人数统计小例子

    一.概念 servlet监听器的主要目的是给web应用增加事件处理机制,以便更好的监视和控制web应用的状态变化,从而在后台调用相应处理程序. 二.监听器的类型 1.根据监听对象的类型和范围,分为3类 ...

  8. 【Servlet】Servlet监听器

    一.Servlet监听器的概念 Servlet监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext.HttpSession和ServletRequest等域对象的创建与销 ...

  9. Servlet监听器详解及举例

    监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行. 监听器原理 监听原理 1.存在事件源 ...

随机推荐

  1. [APIO2018]Circle selection

    https://www.zybuluo.com/ysner/note/1257597 题面 在平面上,有\(n\)个圆,记为\(c_1,c_2,...,c_n\).我们尝试对这些圆运行这个算法: 找到 ...

  2. JSP:目录

    ylbtech-JSP:目录 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtech出处:http://ylbtech.c ...

  3. java笔记线程方式1线程终端与停止

    public final void stop():让线程停止,过时了,但是还可以使用.public void interrupt():中断线程. 把线程的状态终止,并抛出一个InterruptedEx ...

  4. CodeForces 446A DZY Loves Sequences (DP+暴力)

    题意:给定一个序列,让你找出一个最长的序列,使得最多改其中的一个数,使其变成严格上升序列. 析:f[i] 表示以 i 结尾的最长上升长度,g[i] 表示以 i 为开始的最长上升长度,这两个很容易就求得 ...

  5. moiezen

    这题是个随机化+二分裸题--------考场上居然没有想出来--想的出来就怪了吧 我们随机一下增加x的顺序,然后进行二分之前,看看这个x加完之后能不能更新答案,不能就不二分了.具题解所说,这个复杂度是 ...

  6. iOS 关于文件操作 NSFileManager

    创建文件夹 + (BOOL)creatDir:(NSString *)path { if (path.length==0) { return NO; } NSFileManager *fileMana ...

  7. [读书笔记3]《C语言嵌入式系统编程修炼》

    第五章 性能优化   5.1 使用宏定义 在C语言中,宏是产生内嵌代码的唯一方法.对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法.   写一个"标准"宏MIN ...

  8. tablespace monitor shell for windows

    1. #! /bin/ksh #set -x SID=$1 ORACLE_SID=stat10gORACLE_HOME=/oracle10g/product/10.2PATH=$PATH:/usr/b ...

  9. WCF 相关配置

    WCF错误:413 Request Entity Too Large 在我们用WCF传输数据的时候,如果启用默认配置,传输的数据量过大,经常会出这个错误. WCF包含服务端与客户端,所以这个错误可能出 ...

  10. Focusky的下载、安装、注册和使用(动画演示大师)

    一.下载 二.安装 三.使用 四.注册 五.附录 非常感谢Focusky官方团队开发并提供实用的这么一款软件!!! 一.下载 http://www.focusky.com.cn/ 二.安装 三.使用 ...