Java ---Listener监听器
在我们的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监听器的更多相关文章
- [Java] JSP笔记 - Listener 监听器
Java Web 开发时,可以使用 Listener 来监听来监听一些事件,从而实现一些功能.实际上这个监听器,原理就是 Delphi 中大家常用的各种事件. 1. 那么,监听器的主要用途用哪些呢: ...
- 【Servlet】Java Serlvet Listener 监听器
Listener监听器 Servlet规范中定义的一种特殊的组件,用来监听Servlet容器产生的事件并进行相应的处理 容器产生的事件分类 - 生命周期相关的事件 - 设置和删除Attribute数据 ...
- Java Listener pattern 监听者模式
Java Listener pattern 监听者模式 2016-5-12 监听者模式(观察者模式)能降低对象之间耦合程度.为两个相互依赖调用的类进行解耦. 便于进行模块化开发工作.不同模块的开发者可 ...
- Listener监听器和Filter过滤器
Listener监听器 WEB中的监听器 WEB 中的 Listener 和 Filter 是属于 Servlet 规范中的高级的技术.WEB中的监听器共有三类八种(监听三个域对象)* 事件源:Ser ...
- Servlet3.0的注解自定义原生Listener监听器实战
简介:监听器介绍和Servlet3.0的注解自定义原生Listener监听器实战 自定义Listener(常用的监听器 servletContextListener.httpSessionListen ...
- 15 Filter过滤器和Listener监听器
1.Filter:过滤器 (1) 概念:生活中的过滤器:净水器,空气净化器,土匪.web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能.过滤器的作用:一般用于完成通用的 ...
- Java Listener
六. Java Listener 1. Java Listener 简介 * Java Listener 1. Java Listener(即:Java 监听器):用于监听 ServletRequ ...
- .jsp文件的使用和理解以及一些小练习和Listener监听器
什么是 jsp,它有什么用? jsp 的全换是 java server pages.Java 的服务器页面.jsp 的主要作用是代替 Servlet 程序回传 html 页面的数据.因为 Servle ...
- 转-JavaWeb三大组件之Listener监听器
JavaWeb三大组件之Listener监听器一.概述1,它是一个接口,内容由我们来实现 2,它需要注册,例如注册在按钮上 3,监听器中的方法,会在特殊事件发生时被调用 二.JavaWeb中的监听器1 ...
随机推荐
- JS中的类,类的继承方法
大牛请无视此篇! 首先我们定义一个类,方法很简单,就像我们定义函数一样,只不过我们为了与函数区分,名称首字母要大写,看代码: function Person (){ } 这就是一个很简单的Poson类 ...
- 用Less定义常用的CSS3效果函数及常用颜色搭配(让CSS写起来更有趣)
定义圆角及调用 /* 定义圆角 @radius 圆角大小 */ .round(@radius:5px){ border-radius:@radius; -webkit-border-radius: @ ...
- Maven进阶宝典
前言: 团队在开发过程中用的是maven项目,由于对maven的一些打包流程以及相关参数配置不是太了解,因此应大家的需求做一下maven的讲解,为了不误导大家,看了很多相关资料,自己也实验了一下,就把 ...
- ER图是啥?
文章转载自「开发者圆桌」一个关于开发者入门.进阶.踩坑的微信公众号 E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型.属性和联系的方法,用来描述现 ...
- 2015年ACM-ICPC亚洲区域赛合肥站网络预选赛H题——The Next (位运算)
Let L denote the number of 1s in integer D's binary representation. Given two integers S1 and S2, we ...
- PHP-配置方法
由于php是一个zip文件(非install版),安装较为简单,解压就行.把解压的 php5.2.1-Win32重命名为 php5.并复制到C盘目录下.即安装路径为 c:\php5 1 找到php目录 ...
- Alamofire源码解读系列(六)之Task代理(TaskDelegate)
本篇介绍Task代理(TaskDelegate.swift) 前言 我相信可能有80%的同学使用AFNetworking或者Alamofire处理网络事件,并且这两个框架都提供了丰富的功能,我也相信很 ...
- Robot Framework 使用笔记
条件表达式: Run Keyword If 表达式 执行动作 ... ELSE IF 表达式 执行动作 ... ELSE 执行动作 基础格式见上表,下面是我遇到的坑: 表达式:判断字符串变量是 ...
- JavaWeb之Ajax
一.什么是Ajax 1.1.Ajax的定义 Ajax:(Asynchronous JavaScript And XML)指异步 JavaScript 及 XML 不是一种新的编程语言,而是一种用于创建 ...
- Java Reference 源码分析
@(Java)[Reference] Java Reference 源码分析 Reference对象封装了其它对象的引用,可以和普通的对象一样操作,在一定的限制条件下,支持和垃圾收集器的交互.即可以使 ...