JavaWeb中的Listener概述

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



猜你喜欢

转载自blog.csdn.net/u012605477/article/details/75308241