在我们的web容器中,一直不断的触发着各种事件,例如:web应用启动和关闭,request请求到达和结束等。但是这些事件通常对于开发者来说是透明的,我们可以根据这些接口开发符合我们自身需求的功能。在web中常见的的几个监听事件如下:

  • ServletContextListener:用于监听web应用的启动和关闭
  • ServletContextAttributeListener:用于监听在application范围内的数据的变动
  • ServletRequestListener:用于监听用户请求的细节
  • ServletRequestAttributeListener:用于监听request范围内的数据的变动
  • HttpSessionListener:用于监听某次会话的开始和结束
  • HttpSessionAttributeListener:用于监听session范围内的属性数据的变动

一、使用ServletContextListener监听web应用的启动和关闭

我们想要实现一个自定义的Listener,需要两个步骤,第一个是根据自己的需求继承相应的上述的监听事件的接口,并实现其中的相应的方法。第二个步骤就是,在web.xml中配置此Listener监听器的处理类或者使用注解配置。下面我们通过继承自ServletContextListener接口来实现对web应用的启动和关闭实时监控。

~~~

public class MyListener implements ServletContextListener {

@Override//web应用启动时候触发此事件
public void contextInitialized(ServletContextEvent sce) {
    System.out.println("web应用启动了。。。");
}

@Override//web应用关闭的时候触发事件
public void contextDestroyed(ServletContextEvent sce) {

    System.out.println("web应用被关闭了。。。");
}

}

~~~

~~~

<listener>
    <listener-class>Test_packge.MyListener</listener-class>
</listener>

~~~

二、使用ServletContextAttributeListener监听application范围内的属性变化

上面的代码可以让我们监听web应用的启动和关闭情况,下面我们可以通过实现ServletContextAttributeListener接口来完成对application范围内的属性数值改变情况进行监听。其中主要有以下三个方法:

~~~

default void attributeAdded(ServletContextAttributeEvent scae) {
}

default void attributeRemoved(ServletContextAttributeEvent scae) {
}

default void attributeReplaced(ServletContextAttributeEvent scae) {
}
这三个方法分别会在application范围内添加属性的时候,删除属性的时候,更新属性的时候触发。下面做一点演示:

public class MyListener implements ServletContextAttributeListener {

@Override
public void attributeAdded(ServletContextAttributeEvent scae) {

    String name = scae.getName();
    Object value = scae.getValue();
    System.out.println("add: "+name+":"+value);
}
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {

    String name = scae.getName();
    Object value = scae.getValue();
    System.out.println("remove: "+name+":"+value);
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {

    String name = scae.getName();
    Object value = scae.getValue();
    System.out.println("replaced: "+name+":"+value);
}

}

~~~

~~~

<%application.setAttribute("x","a");%>

<%application.removeAttribute("x","a");%>

~~~

上述代码中,我们调用了ServletContextAttributeEvent 对象的getName方法和getValue方法来获取当前的application属性的名和值。当然此对象还有另外一个方法就是用于获取servlecontext对象的。

三、使用ServletRequestListener监听用户请求的开始和结束

上述代码主要完成的是对web应用的启动和结束的状态进行监听,包括application范围内的属性值的改变的监听。下面我们看对用户请求进行监听的接口ServletRequestListener,它主要有两个方法:

~~~

default void requestDestroyed(ServletRequestEvent sre) {

}

default void requestInitialized(ServletRequestEvent sre) {
}
这两个方法分别会在请求的到达和请求的结束时触发,ServletRequestEvent 中定义的方法可以返回当前请求的对象request和web应用的ServletContext对象。通过继承接口ServletRequestAttributeListener可以实现监听request范围内的属性的变更,其内部方法和上述的ServletContextAttributeListener 类似,不演示了。

**四、使用HttpSessionListener监听会话的开始和结束**
HttpSessionListener监听器用于监听每个用户创建会话和关闭会话的动作,有两个方法:
default void sessionCreated(HttpSessionEvent se) {
}

default void sessionDestroyed(HttpSessionEvent se) {
}
一个是用于监听会话开始,一个是用于监听会话的结束。HttpSessionEvent 类可以返回一HttpSession对象,该对象指向当前会话,可以从中获取会话创建的时间,属性值,sessionId,ServletContext对象等。通过他我们可以直接的监视具体用户的各个操作。下面我们通过一个例子:显示当前所有在线的用户

public class MyListener implements HttpSessionListener {

public void sessionCreated(HttpSessionEvent se) {

    ServletContext app = se.getSession().getServletContext();
    //如果是新一次会话
    if(se.getSession().isNew()){
        Map<String,String> map = (Map<String,String>)app.getAttribute("online");
        if(map==null){
            //如果这是第一次会话,创建一个用于记录在线人数的map集合
            map = new Hashtable<String, String>();
        }
        //此处的用户名实际上是可以获取的,此处为了演示方便,默认walekr
        map.put(se.getSession().getId(),"walker");
        app.setAttribute("online",map);
    }
}
public void sessionDestroyed(HttpSessionEvent se) {

    ServletContext app = se.getSession().getServletContext();
    Map<String,String> map = (Map<String,String>)app.getAttribute("online");
    if(map!=null) {
        map.remove(se.getSession().getId());
    }
    app.setAttribute("online",map);
}

}

~~~

~~~

<%@ page contentType="text/html;charset=UTF-8" language="java" %>











<%

Map

<%}%>





~~~



做一点解释,当用户使用浏览器访问服务器时候,会为此用户创建session对象,我们监听创建session动作,在application范围内创建map映射集合用于记录sessionId和用户名,sessionId是web容器为我们自动创建的不会重复的序列。我们可以打开多个浏览器模拟多用户访问,可以看到结果如上图所示,输出了所有与在线的用户sessionId和用户名。需要注意一点的是,session对象在服务器端存在的是时间是有限的,也就是说如果某个用户长时间没有再次访问服务器更新session的话,服务器会自动清除该对象,也就导致用户可能需要重新登录。还有一点,每个客户端都会获取在服务器端的session对象,但是如果客户端关闭了,session并不会立即从服务器端清除,依然需要等到超时之后服务器删除该对象。具体的深入理解session,以后的文章会介绍,此处了解即可。

此外,HttpSessionAttributeListener可以用来监听session范围内的属性的变更,主要有如下几个方法:

~~~

default void attributeAdded(HttpSessionBindingEvent se) {

}

default void attributeRemoved(HttpSessionBindingEvent se) {
}

default void attributeReplaced(HttpSessionBindingEvent se) {
}

~~~

这三个方法和上述的几个监听属性的方法是类似的,此处不再赘述。

以上便是Listener监听器的基本内容,理解较为浅薄,望对大家有帮助!

Java ---Listener监听器的更多相关文章

  1. [Java] JSP笔记 - Listener 监听器

    Java Web 开发时,可以使用 Listener 来监听来监听一些事件,从而实现一些功能.实际上这个监听器,原理就是 Delphi 中大家常用的各种事件. 1. 那么,监听器的主要用途用哪些呢: ...

  2. 【Servlet】Java Serlvet Listener 监听器

    Listener监听器 Servlet规范中定义的一种特殊的组件,用来监听Servlet容器产生的事件并进行相应的处理 容器产生的事件分类 - 生命周期相关的事件 - 设置和删除Attribute数据 ...

  3. Java Listener pattern 监听者模式

    Java Listener pattern 监听者模式 2016-5-12 监听者模式(观察者模式)能降低对象之间耦合程度.为两个相互依赖调用的类进行解耦. 便于进行模块化开发工作.不同模块的开发者可 ...

  4. Listener监听器和Filter过滤器

    Listener监听器 WEB中的监听器 WEB 中的 Listener 和 Filter 是属于 Servlet 规范中的高级的技术.WEB中的监听器共有三类八种(监听三个域对象)* 事件源:Ser ...

  5. Servlet3.0的注解自定义原生Listener监听器实战

    简介:监听器介绍和Servlet3.0的注解自定义原生Listener监听器实战 自定义Listener(常用的监听器 servletContextListener.httpSessionListen ...

  6. 15 Filter过滤器和Listener监听器

    1.Filter:过滤器 (1) 概念:生活中的过滤器:净水器,空气净化器,土匪.web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能.过滤器的作用:一般用于完成通用的 ...

  7. Java Listener

    六.  Java Listener 1.  Java Listener 简介 * Java Listener 1. Java Listener(即:Java 监听器):用于监听 ServletRequ ...

  8. .jsp文件的使用和理解以及一些小练习和Listener监听器

    什么是 jsp,它有什么用? jsp 的全换是 java server pages.Java 的服务器页面.jsp 的主要作用是代替 Servlet 程序回传 html 页面的数据.因为 Servle ...

  9. 转-JavaWeb三大组件之Listener监听器

    JavaWeb三大组件之Listener监听器一.概述1,它是一个接口,内容由我们来实现 2,它需要注册,例如注册在按钮上 3,监听器中的方法,会在特殊事件发生时被调用 二.JavaWeb中的监听器1 ...

随机推荐

  1. 如何通过Visual Studio来管理我们的数据库项目

    某日的一个早晨,产品早上来告诉我说要把之前变更的一个功能更改回原来的设计内容,作为程序员大家都最讨厌需求来回反复变更,但是没有办法,苦逼的程序员最终还是继续要改,毕竟是给老板打工的,但是发现我们之前的 ...

  2. angular : ui-router 操作原理

    <body> <a ui-sref="title">title<a> </body> ui-router 会去解析body里的ui- ...

  3. PHP链接Redis

    命令行下运行 redis-server.exe redis.windows.conf 此时,redis服务已经开启,然后我们可以再新开一个命令行,作为控制台 redis-cli.exe -h 127. ...

  4. Swap Nodes in Pairs leetcode

    Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1->2-&g ...

  5. 在.NET项目中使用PostSharp,使用MemoryCache实现缓存的处理(转)

    在之前一篇随笔<在.NET项目中使用PostSharp,实现AOP面向切面编程处理>介绍了PostSharp框架的使用,试用PostSharp能给我带来很多便利和优势,减少代码冗余,提高可 ...

  6. JAVA面试题和答案(二)

    本文我们将要讨论Java面试中的各种不同类型的面试题,它们可以让雇主测试应聘者的Java和通用的面向对象编程的能力.下面的章节分为上下两篇,第一篇将要讨论面向对象编程和它的特点,关于Java和它的功能 ...

  7. 使用 POJO 对象绑定请求参数

    概述 Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配,自动为该对象填充属性值并且支持级联属性.这一特性在日常开发过程中使用频率比较高,开发效率也高,本文主要对 POJO 对象绑定 ...

  8. java学习笔记 --- 集合

    1.定义:集合是一种容器,专门用来存储对象 数组和集合的区别?   A:长度区别  数组的长度固定 集合长度可变 B:内容不同  数组存储的是同一种类型的元素  而集合可以存储不同类型的元素  C:元 ...

  9. MyBatis解决字段名与实体类属性名不相同的冲突(四)

    一.创建表和表数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no ), order_price FLOA ...

  10. ThreadLocal本地线程变量的理解

     一般的Web应用划分为展现层.服务层和持久层三个层次,在不同的层中编写对应的逻辑,下层通过接口向上层开放功能调用.在一般情况下,从接收请求到返回响应所经过的所有程序调用都同属于一个线程.       ...