Listener,中文名为监听器,在javaWeb中监听器的作用就是监听web项目中的一些数据对象。
例如:猫为监听器,老鼠为事件源,则抓老鼠为监听事件。
从字面意思来说,监听器一般和监听事件,事件源共同组成一个监听整体。
从javaWeb方面来说:监听器就是一个普通Java类,该类实现了特定的接口,然后该类就用于监听一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。
即被监听对象的一些状态改变(包含方法调用,属性改变等),立马触发监听事件,然后影响监听对象。
即老鼠的各种行动,时刻影响着猫的下一步动作。
我们先说一下JavaWeb中的“官方”监听器(我指的官方是指Servlet规范中定义的,不要纠结于官方是什么):
在JavaWeb中,”官方“定义了多种类型的监听器,也定义了多个事件源。
这些被监听的事件源分别为:SerlvetConext,HttpSession,ServletRequest,
针对这些事件源,Servlet定义了与之对应的多种类型的监听器,我们主要按事件类型将其划分为三种:
类型一.监听三个域对象创建和销毁的事件监听器
类型二.监听域对象中属性的增加和删除的事件监听器
类型三.监听绑定到HttpSession域中的某个对象的状态的事件监听器。
下面的方法是对上面的三种监听类型以及他们的监听类的具体实现,本不想说,但不说又不合适,说了又云里雾里,不懂的可先从下面的紫色内容开始看。
类型一,三个域对象的创建与销毁方法签名:
ServletRequestListener有以下两个方法:
void requestDestroyed(ServletRequestEvent sre)
void requestInitialized(ServletRequestEvent sre)
HttpSessionListener有以下两个方法
void sessionCreated(HttpSessionEvent se)
void sessionDestroyed(HttpSessionEvent se)
ServletContextListener有以下两个方法
void contextDestroyed(ServletContextEvent sce)
void contextInitialized(ServletContextEvent sce)
类型二,三个类型对象域中属性增、删、改的监听器
ServletContextAttributeListener,
HttpSessionAttributeListener,
ServletRequestAttributeListener
类型三,事件感知型监听器:监听自己何时被帮到session上,何时解绑了;何时被钝化了,何时被活化了(序列化到某个存储设置中)。
注意:这种监听器不需要注册。某个javabean实现这些接口后就可以监听何时被绑定、解绑或被激活或钝化。
HttpSessionBindingListener:实现该接口的类,能检测自己何时被Httpsession绑定,和解绑
HttpSessionActivationListener:实现该接口的类(要求些javabean必须是实现了Serializable接口的),能监测自己何时随着HttpSession一起激活和钝化。
想要明白这些监听方法,就要了解并知道这些监听对象,所以在这里先要说一下JavaWeb中得九大内置对象。
该链接是对九大内置对象的概述:http://blog.csdn.net/u012605477/article/details/75338436,不明白的可以看看,明白的可跳过。
通过九大内置对象我们知道:
SerlvetConext就是九大对象中的application
HttpSession就是九大内置对象中的Session
ServletRequest就是九大内置对象中得HttpServletRequest。
这三个就是我们的监听对象,俗称事件源(即老鼠),而监听器(猫)则要实现这些对象的特殊接口,重写该接口下面的方法。
我们拿类型一和类型二中共有的ServletContext(application)举例:
首先,创建一个JSP文件,在该jsp中对application对象添加了name属性,并修改该属性,以及删除该属性。
其次,在包里面添加一个实现ServletContext监听接口的实现类applicationAttributeListener.
最后,在web.xml中,添加了对监听器类实现类applicationAttributeListener的引用。
具体代码如下:
用tomcat启动web项目,并打开application.jsp页面,控制台会打印监听对象(老鼠)的状态变化,jsp页面我忘记截图了......尴尬
通过图文,对于application域对象的监听器实现就这样结束了,其他的域对象与其类似,就不再过多描述。
接下来对类型三进行阐述性说明:
1.先创建一个javaBean,并让其实现类型三的接口,具体代码如下:
package com.strategy.jpa; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionBindingListener; public class javaBean implements HttpSessionBindingListener { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public javaBean(int id,String name) { this.id=id; this.name=name; } public void valueBound(HttpSessionBindingEvent event) { System.out.println(id+"被加到session中了"); } public void valueUnbound(HttpSessionBindingEvent event) { System.out.println(id+"被session踢出来了"); } }2.在原有的application.jsp中添加对session对象的属性添加没代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@page import="com.strategy.jpa.javaBean"%> <!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>ServletContextAttributeListener监听器测试</title> <body> <% //往application域对象中添加属性 application.setAttribute("name", "张三"); //替换application域对象中name属性的值 application.setAttribute("name", "李四"); //移除application域对象中name属性 application.removeAttribute("name"); %> <% //将javabean对象绑定到Session中 session.setAttribute("bean",new javaBean(001,"张三")); //从Session中删除javabean对象 session.removeAttribute("bean"); %> </body> </html>3.启动tomcat,观看控制台,发现控制台打印了相应的内容。
类型三,不需要在web.xml中进行配置,实现指定接口就行。
至此,对于域对象的属性监听大致就是这些,序列化的监听我并未写出来,不过都是换汤不换药,大家只要知道这一块是怎么做到的即可。
如果你想知道剩下的部分,可以看下面这个大神的博客。
http://www.cnblogs.com/xdp-gacl/p/3969249.html