监听器概述


监听器(Listener)是一种特殊的Servlet技术,它可以监听Web应用的上下文信息、Servlet请求信息和Servlet会话信息,即ServletContext、ServletRequest、HttpSession。并根据不同的情况,在后台调用相应的处理程序。利用监听器对Web应用进行监听和控制,来增强Web应用的事件处理能力。

监听器要用到javax.servlet.jar中的一组监听接口和事件类,根据监听对象的不同,监听器可被划分为3种:

1)ServletContext事件监听器:用于监听应用程序环境对象。

2)HttpSession事件监听器:用于监听用户会话对象。

3)ServletRequest事件监听器:用于监听请求消息对象。

这3种监听器共包含了8个监听接口、6个监听事件类。

监听对象 监听接口 监听事件类
ServletRequest ServletRequestListener ServletRequestEvent
ServletRequestAttributeListener ServletRequestAttributeEvent
HttpSession HttpSessionListener HttpSessionEvent
HttpSessionActivationListener
HttpSessionAttributeListener HttpSessionBindingEvent
HttpSessionBindingListener
ServletContext ServletContextListener ServletContextEvent
ServletContextAttributeListener ServletContextAttributeEvent

监听器的启动顺序


1)当有多个监听器时,按各监听器在web.xml中配置的顺序进行先后顺序启动。

2)相较于过滤器、Servlet的启动顺序是:

监听器>过滤器>Servlet

Listener分类


1)监听ServletContext对象(对应jsp内置对象——application对象)

对ServletCOntext对象实现监听,可以监听到ServletContext对象中属性的变化(增删改操作),也可以就监听到ServletContext对象本身的变化(创建和销毁)。常见监听方法:

接口名称 接口方法 激发条件
ServletContextAttributeListener public void attributeAdded(ServletContextAttributeEvent scab); 增加属性
public void attributeRemoved(ServletContextAttributeEvent scab); 删除属性
public void attributeRepalced(ServletContextAttributeEvent scab); 修改属性
ServletContextListener public void contextInitialized(ServletContextEvent sce); 创建对象
public void contextDestroyed(ServletContextEvent sce); 销毁对象

2)监听会话(HttpSession对象)(对应jsp内置对象——session对象):

对HttpSession对象实现监听,可以监听到HttpSession对象中属性的变化(增删改操作),也可以就监听到HttpSession对象本身的变化(创建和销毁),以及该对象的状态,还可以监听HttpSession对象是否绑定到该监视器对象上。常见监听方法:

接口名称 接口方法 激发条件
HttpSessionAttributeListener public void attributeAdded(HttpSessionBindingEvent se); 增加属性
public void attributeRemoved(HttpSessionBindingEvent se); 删除属性
public void attributeReplaced(HttpSessionBindingEvent se); 修改属性
HttpSessionListener public void sessionCreated(HttpSessionEvent se); 创建对象
public void sessionDestroyed(HttpSessionEvent se); 销毁对象
HttpSessionActivationListener public void sessionDidActivate(HttpSessionEvent se); 会话刚被激活
public void sessionWillPssivate(HttpSessionEvent se); 会话将要钝化
HttpSessionBindingListener public void valueBound(HttpSessionBindingEvent se); 调用setAttribute()
public void valueUnbound(HttpSessionBindingEvent se); 调用removeAttribute()

注意1:

活化(Activate)和钝化(Passivate)是Web容器为了更好地利用系统资源或者进行服务器负载平衡等原因而对特定对象采取的措施。

会话对象的钝化是指暂时将会话对象通过序列化的方法存储到硬盘上;

活化与钝化相反,是把硬盘上存储的会话对象重新加载到Web容器中。

Tomcat中的两种钝化管理器:org.apache.catalina.session.StandardManger和org.apache.catalina.session.Persistentmanger

注意2:

session的销毁有两种情况:

  (1)session超时,web.xml配置:

<session-config>
<session-timeout>120</session-timeout><!--session120分钟后超时销毁-->
</session-config>

  (2)手工使session失效

public void invalidate();//使session失效方法。session.invalidate();

3)监听请求(ServletRequest对象)(对应jsp内置对象——request对象)

对ServletRequest对象实现监听,可以监听到ServletRequest对象中属性的变化(增删改操作),也可以就监听到ServletRequest对象本身的变化(创建和销毁)。常见监听方法:

接口名称 接口方法 激发条件
ServletRequestAttributeListener public void attributeAdded(ServletRequestAttributeEvent srae); 增加属性
public void attributeRemoved(ServletRequestAttributeEvent srae); 删除属性
public void attributeReplaced(ServletRequestAttributeEvent srae); 修改属性
ServletRequestListener public void requestInitialized(ServletRequestEvent sre); 创建对象
public void requestDestroyed(ServletRequestEvent sre); 销毁对象

监听器设计步骤(实例)


实例:实现在线人数统计。

当一个浏览器第一次访问网站时,服务器会新建一个HttpSession对象,并触发HttpSession创建事件,如果注册了HttpSessionListener事件监听器,则会调用HttpSessionListener事件监听器的sessionCreated方法。相反,当这个浏览器用户注销或访问超时的时候,服务器会销毁相应的HttpSession对象,触发HttpSession销毁事件,同时调用所注册的HttpSessionListener事件监听器的sessionDestroyed方法。这样,只需在HttpSessionListener实现类的sessionCreated方法中让计数器加1,在sessionDestroyed方法中让计数器减1,就可以实现网站在线人数的统计功能。(在参考博客中还有其他方法统计网站在线人数,在此不再赘述)

创建实现对应接口的监听器类:

package com.listener;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener; public class OnlineListener implements HttpSessionListener { //定义静态变量存储在线人数
private static int onlineCount=0; @Override
public void sessionCreated(HttpSessionEvent arg0) {
onlineCount++;
} @Override
public void sessionDestroyed(HttpSessionEvent arg0) {
if(onlineCount>0) onlineCount--; } //自定义一个返回在线人数的方法
public static int getOnlineCount(){
return onlineCount;
} }

配置web.xml文件(配置相对简单,只需配置监听器所在的类,无需配置映射地址)

在servlet 3.0版本及更高版本中,可以使用注解的方式将实现了某个监听器接口的类声明为监听器,即在类名上标注@WebListener。

<!-- 配置监听器 -->
<listener>
<listener-class>com.listener.OnlineListener</listener-class>
</listener>

创建显示在线人数的jsp页面(注意要导入监听器类所在的包)

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="com.listener.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>在线人数显示页面</title>
</head>
<body>
<h2>当前的在线人数:<%=OnlineListener.getOnlineCount() %></h2>
</body>
</html>

然后可用不同浏览器访问这一网址,查看运行结果。

参考博客:http://www.cnblogs.com/coderland/p/5902874.html

参考书籍:《Java EE框架开发技术与案例教程 》

java Web三大组件--监听器的更多相关文章

  1. java web(五):java web三大组件之另外两个和八大监听器

    java的三大组件指Servlet.Filter.Listener.八大监听器指八个接口.前面介绍了Servlet,现在介绍一下Filter拦截器以及拦截地址的设置, Listener监听那些事件. ...

  2. java web 三大组件

    JavaWeb三大组件 Servlet,Filter,Listener. Servlet Servlet的作用 在Java web b/s架构中,servlet扮演了重要的角色,作为一个中转处理的容器 ...

  3. Java Web三大组件之过滤器(Filter)

    什么是过滤器?有什么用? 过滤器JavaWeb三大组件之一,它与Servlet很相似.不过滤器是用来拦截请求的,而不是处理请求的.过滤,顾名思义,就是留下我们想要的,丢掉我们不需要的.例如:某个网站的 ...

  4. java Web三大组件--过滤器

    参考博客:http://www.cnblogs.com/coderland/p/5902878.html https://www.cnblogs.com/HigginCui/p/5772514.htm ...

  5. web三大组件的加载顺序

    Web三大组件:过滤器组件  监听器组件  Servlet组件 过滤器的顶级接口:javax.servlet.Filter 监听器的顶级接口:javax.servlet.ServletContextL ...

  6. 第一章 java nio三大组件与使用姿势

    本案例来源于<netty权威指南> 一.三大组件 Selector:多路复用器.轮询注册在其上的Channel,当发现某个或者多个Channel处于“就绪状态”后(accept接收连接事件 ...

  7. java web多组件协作实现用户登录验证

    实现步骤: 1.创建用户登录提交界面 2.创建处理用户登录请求servlet组件Main 3.创建代表登录成功响应的servlet的组件LoginSuccess 4.创建代表登录失败响应的servle ...

  8. web三大组件

    1.Servlet Servlet是用来处理客户端请求的动态资源,也就是当我们在浏览器中键入一个地址回车跳转后,请求就会被发送到对应的Servlet上进行处理. Servlet的任务有: 接收请求数据 ...

  9. Java NIO 三大组件之 Buffer

    NIO大三组件 之Buffer 一.什么是Buffer Buffer是用于特定原始类型的数据的容器. 它的实质就是一组数组,用于存储不同类型的数据. 二.缓冲区的类型 缓冲区类型除了Boolean值类 ...

随机推荐

  1. 【vim】模式与模式切换

    很多初学者启动vim后,不知道怎么输入字符:按了半天字母,结果屏幕还是空的. vim和记事本或WORD不一样,不是一打开后就可以输入文字,此时它处于正常模式. vim一共有4个模式: 正常模式 (No ...

  2. 如何编写JQuery 插件详解

    转载自:http://blog.sina.com.cn/s/blog_6154bf970101jam7.html 如今做web开发,jquery 几乎是必不可少的,就连vs神器在2010版本开始将Jq ...

  3. 消除浏览器对input的自动填充

    在做登录相关的页面时,常遇到这样的现象,浏览器input的自动填充行为. 原因 设置 input 的 type 属性为 password 后,当页面进行过提交,并且允许浏览器记住密码后,那么再次加载该 ...

  4. .Net Core新建解决方案,添加项目引用,使用VSCode调试

    并不是我自己琢磨的,是看了别人学习的,因为写的都不完整,所以就整理一下记录后面忘了回看. 反正.Net Core是跨平台的,就不说在什么系统上了.假设我要建一个名为Doggie的解决方案,里面包含了一 ...

  5. python基础-文件操作(10)

    一.什么是文件 等等这些都叫做文件,各种格式的.但不仅仅限制于这些. 二.文件的作用 大家应该听说过一句话:“好记性不如烂笔头”. 不仅人的大脑会遗忘事情,计算机也会如此,比如一个程序在运行过程中用了 ...

  6. C# Windows异步I/O操作

    1.简介 关于Windows的异步I/O操作,只要解决的是同步I/O操作的线程利用率问题,通过异步I/O Api来提升线程的利用率,提升系统的吞吐能力,将各种I/O操作交给线程池然后交由硬件设备执行, ...

  7. redis 系列3 数据结构之简单动态字符串 SDS

    一.  SDS概述 Redis 没有直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串(simple dynamic string, SDS)的抽象类型,并将SDS用作Redis的默 ...

  8. MySql数据库安装

    MySql数据库安装 一丶数据库 什么是数据库 数据库简单连接就是存储数据的容器. 而库则是一组容器合成的东西. 也就是存储数据的.我们编程中常常会用到数据库. 什么是数据管理系统 数据库管理系统就是 ...

  9. spring-boot (四) springboot+mybatis多数据源最简解决方案

    学习文章来自:http://www.ityouknow.com/spring-boot.html 配置文件 pom包就不贴了比较简单该依赖的就依赖,主要是数据库这边的配置: mybatis.confi ...

  10. Mybatis学习(三)————— 映射文件详解

    前面说了全局配置文件中内容的详解,大家应该清楚了,现在来说说这映射文件,这章就对输入映射.输出映射.动态sql这几个知识点进行说明,其中高级映射(一对一,一对多,多对多映射)在下一章进行说明. 一.输 ...