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 ...
随机推荐
- 阅读Facebook POP框架 笔记(一)
在这一系列文章里,我主要会将自己阅读第三方代码的经历记录下来,尝试独立分析解剖一个框架.之前也阅读过一些第三方代码,但是实际上来说对自己的成长并没有太大的帮助,因为阅读的不细致,没有领会到代码的精髓. ...
- 第27篇 重复造轮子---模拟IIS服务器
在写程序的时候,重复造轮子是程序员的一个大忌,很多人对重复造轮子持有反对的态度,但是我觉得这个造轮子的过程,是对于现有的知识的一个深入的探索的过程,虽然我们不可能把轮子造的那么的完善,对于现在有的东西 ...
- Laravel使用Seeder自动填充数据
要查看代码,可以点击 或者转到链接:https://github.com/laravel/framework Laravel自动填充数据使用的是Seeder类 <?php use Illumin ...
- 项目架构开发:数据访问层之Repository
接上文 项目架构开发:数据访问层之Logger 本章我们继续IRepository开发,这个仓储与领域模式里边的仓储有区别,更像一个工具类,也就是有些园友说的“伪仓储”, 这个仓储只实现单表的CURD ...
- Asp.net mvc 知多少(十)
本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...
- Java并发之线程异常捕获
由于线程的本质特性,使得你不能捕获从线程中逃逸的异常,如: import java.util.concurrent.ExecutorService; import java.util.concurre ...
- Flume-ng源码解析之Sink组件
作为启动流程中第二个启动的组件,我们今天来看看Sink的细节 1 Sink Sink在agent中扮演的角色是消费者,将event输送到特定的位置 首先依然是看代码,由代码我们可以看出Sink是一个接 ...
- C#:判断100--999之前的水仙花数
//判断100--999之前的水仙花数.水仙花数举例:153=13+53+33. using System;public class Program { public static void ...
- 1081: [SCOI2005]超级格雷码
1081: [SCOI2005]超级格雷码 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 301 Solved: 159[Submit][Statu ...
- 3396: [Usaco2009 Jan]Total flow 水流
3396: [Usaco2009 Jan]Total flow 水流 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 179 Solved: 73[Su ...