`

JavaWeb之Listener

 
阅读更多

简介

 

监听器:专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。

Servlet 监听器:Servlet 规范中定义的一种特殊类,它用于监听 web 应用程序中的 ServletContext, HttpSession 和 ServletRequest 等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。

 

 

Servlet 监听器的分类

 

按监听的事件类型 Servlet 监听器可分为如下三种类型:

监听域对象自身的创建和销毁的事件监听器

监听域对象中的属性的增加和删除的事件监听器

监听绑定到 HttpSession 域中的某个对象的状态的事件监听器

 

 

编写 Servlet 监听器

 

Servlet 规范为每种事件监听器都定义了相应的接口,开发人员编写的事件监听器程序只需实现这些接口,web 服务器根据用户编写的事件监听器所实现的接口把它注册到相应的被监听对象上

一些 Servlet 事件监听器需要在 web 应用程序的 web.xml 文件中进行注册,一个 web.xml 文件中可以注册多个 Servlet 事件监听器,web 服务器按照它们在 web.xml 文件中的注册顺序来加载和注册这些 Serlvet 事件监听器。

Serlvet 事件监听器的注册和调用过程都是由 web 容器自动完成的,当发生被监听的对象被创建,修改或销毁事件时,web容器将调用与之相关的 Servlet 事件监听器对象的相关方法,开发人员在在这些方法中编写的事件处理代码即被执行

由于一个 web 应用程序只会为每个事件监听器创建一个对象,有可能出现多个线程同时调用同一个事件监听器对象的情况,所以,在编写事件监听器类时,应考虑多线程安全的问题

 

 

监听域对象的创建和销毁

 

域对象创建和销毁的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象的创建和销毁事件的监听器。

域对象的创建和销毁时机

 

ServletContextListener 接口

 

ServletContextListener 接口用于监听 ServletContext 对象的创建和销毁事件。

当 ServletContext 对象被创建时,激发contextInitialized (ServletContextEvent sce)方法

WEB应用被加载时调用

当 ServletContext 对象被销毁时,激发contextDestroyed(ServletContextEvent sce)方法

WEB应用被卸载时调用

 

HttpSessionListener 接口

 

HttpSessionListener 接口用于监听HttpSession对象的创建和销毁

创建一个Session时,激发sessionCreated

    (HttpSessionEvent se) 方法

销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se) 方法。 

 

 

ServletRequestListener接口 

 

ServletRequestListener 接口用于监听ServletRequest 对象的创建和销毁

创建一个ServletRequest 对象时,激发requestInitialized(ServletRequestEvent sre)方法

销毁一个Session时,激发requestDestroyed(ServletRequestEvent sre)方法。

 

 

域对象中属性的变更的事件监听器

 

域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器。

这三个监听器接口分别是ServletContextAttributeListener, HttpSessionAttributeListener 和ServletRequestAttributeListener,这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换的事件,同一个事件在这三个接口中对应的方法名称完全相同,只是接受的参数类型不同 

 

 

attributeAdded 方法

 

当向被监听器对象中增加一个属性时,web容器就调用事件监听器的 attributeAdded 方法进行相应,这个方法接受一个事件类型的参数,监听器可以通过这个参数来获得正在增加属性的域对象和被保存到域中的属性对象

各个域属性监听器中的完整语法定义为:

public void attributeAdded(ServletContextAttributeEvent scae) 

public void attributeReplaced(HttpSessionBindingEvent  hsbe) 

public void attributeRmoved(ServletRequestAttributeEvent srae)

 

 

attributeRemoved 方法

 

当删除被监听对象中的一个属性时,web 容器调用事件监听器的这个方法进行相应

各个域属性监听器中的完整语法定义为:

public void attributeRemoved(ServletContextAttributeEvent scae) 

public void attributeRemoved (HttpSessionBindingEvent  hsbe) 

public void attributeRemoved (ServletRequestAttributeEvent srae)

 

 

attributeReplaced 方法

 

当监听器的域对象中的某个属性被替换时,web容器调用事件监听器的这个方法进行相应

各个域属性监听器中的完整语法定义为:

public void attributeReplaced(ServletContextAttributeEvent scae) 

public void attributeReplaced (HttpSessionBindingEvent  hsbe) 

public void attributeReplaced (ServletRequestAttributeEvent srae)

 

 

感知 Session 绑定的事件监听器

 

保存在 Session 域中的对象可以有多种状态:绑定到  Session 中;从 Session 域中解除绑定;随 Session 对象持久化到一个存储设备中;随 Session 对象从一个存储设备中恢复

Servlet 规范中定义了两个特殊的监听器接口来帮助 JavaBean 对象了解自己在 Session 域中的这些状态:HttpSessionBindingListener接口和HttpSessionActivationListener接口 ,实现这两个接口的类不需要 web.xml 文件中进行注册

 

 

HttpSessionBindingListener接口

 

实现了HttpSessionBindingListener接口的 JavaBean 对象可以感知自己被绑定到 Session 中和从 Session 中删除的事件

当对象被绑定到 HttpSession 对象中时,web 服务器调用该对象的  void valueBound(HttpSessionBindingEvent event) 方法

当对象从 HttpSession 对象中解除绑定时,web 服务器调用该对象的 void valueUnbound(HttpSessionBindingEvent event)方法

 

 

HttpSessionActivationListener接口

 

实现了HttpSessionBindingListener接口的 JavaBean 对象可以感知自己被活化和钝化的事件

当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被钝化之前,web 服务器调用该对象的  void sessionWillPassivate(HttpSessionBindingEvent event) 方法

当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被活化之后,web 服务器调用该对象的 void sessionDidActive(HttpSessionBindingEvent event)方法

 

 

典型应用

 

统计当前在线人数列表

 

小结

 

 

7. HttpSessionActivationListener

 

1). 监听实现了该接口和 Serializable 接口的 Java 类的对象随 session 钝化和活化事件

 

> 活化: 从磁盘中读取 session 对象

 

> 钝化: 向磁盘中写入 session 对象

 

> session 对象存储在tomcat 服务器的 work\Catalina\localhost\contextPath 目录下. SESSION.SER

 

2). 该监听器不需要在 web.xml 文件中进行配置. 

 

3). 

//在活化之后被调用. 

public void sessionDidActivate(HttpSessionEvent se)

 

//在钝化之前被调用

public void sessionWillPassivate(HttpSessionEvent se)

 

HttpSessionEvent: getSession()

 

4). 该监听器较少被使用. 

 

6. HttpSessionBindingListener

 

1). 监听实现了该接口的 Java 类的对象被绑定到 session 或从 session 中解除绑定的事件.

 

//当前对象被绑定到 session 时调用该方法

public void valueBound(HttpSessionBindingEvent event) 

 

//当前对象从 session 中解除绑定调用该方法

public void valueUnbound(HttpSessionBindingEvent event) 

 

2). 注意: 该监听器不需要在 web.xml 文件中进行配置. 

 

3). HttpSessionBindingEvent:

 

getName()

getValue()

getSession()

 

4). 该监听器较少被使用. 

 

5.  XxxAttributeListener

 

1). 监听 ServletContext, HttpSession, ServletRequest 中添加属性, 替换属性, 移除属性的事件监听器. 

 

2). 以 ServletRequestAttributeListener 为例:

 

//添加属性时被调用

public void attributeAdded(ServletRequestAttributeEvent srae) {

System.out.println("向 request 中添加了一个属性...");

}

 

//移除属性时被调用

@Override

public void attributeRemoved(ServletRequestAttributeEvent srae) {

System.out.println("从 request 中移除了一个属性...");

}

 

//替换属性时被调用. 

@Override

public void attributeReplaced(ServletRequestAttributeEvent srae) {

System.out.println("request 中属性替换了...");

}

 

3). 这三个 ServletContextAttributeListener,

ServletRequestAttributeListener, HttpSessionAttributeListener 监听器较少被使用. 

 

4). API:

 

ServletRequestAttributeEvent:

 

> getName(): 获取属性的名字

> getValue(): 获取属性的值. 

 

4. ServletRequestListener & HttpSessionListener

 

1). 和 ServletContextListener 类似。 

 

2). 利用 ServletRequestListener、HttpSessionListener 以及 ServletContextListener 可以把 request, session

及 application 的生命周期进一步的做一了解. 

 

> request: 是一个请求, 当一个响应返回时, 即被销毁. 当发送一个请求时被创建. 注意, 请求转发的过程是一个 request 对象.

重定向是两个请求

 

> session: 当第一次访问 WEB 应用的一个 JSP 或 Servlet 时, 且该 JSP 或 Servlet 中还需要创建 session 对象. 此时服务器会

创建一个 session 对象. 

 

 session 销毁: session 过期, 直接调用 session 的 invalidate 方法, 当前 web 应用被卸载(session 可以被持久化).

 

 * 关闭浏览器, 并不意味着 session 被销毁, 还可以通过 sessionid 找到服务器中的 session 对象.  

 

JSESSIONID=F4119DE0FC93ED38E8EC83B24CFA3B81

http://localhost:8989/day_40/session.jsp;jsessionid=F4119DE0FC93ED38E8EC83B24CFA3B81

 

> application: 贯穿于当前的 WEB 应用的生命周期. 当前 WEB 应用被加载时创建 application 对象, 当前 WEB 应用被卸载时

销毁 application 对象.

 

3. ServletContextListener:

 

1). what: 监听 ServletContext 对象被创建或销毁的 Servlet 监听器

 

2). how:

 

> 创建一个实现了 ServletContextListener 的类, 并且实现其中的两个方法

 

public class HelloServletContextListner implements ServletContextListener

 

> 在 web.xml 文件中配置 Listener

 

<listener>

<listener-class>com.atguigu.javaweb.test.HelloServletContextListner</listener-class>

</listener>

 

3). why: ServletContextListener 是最常用的 Listener, 可以在当前 WEB 应用被加载时对当前 WEB 应用的相关资源进行初始化操作:

创建数据库连接池, 创建 Spring 的 IOC 容器, 读取当前 WEB 应用的初始化参数 ...

 

4). API: 

 

// SerlvetContext 对象被创建(即, 当前 WEB 应用被加载时)的时候, Servlet 容器调用该方法. 

public void contextInitialized(ServletContextEvent sce) 

 

// SerlvetContext 对象被销毁之前(即, 当前 WEB 应用被卸载时)的时候, Servlet 容器调用该方法. 

public void contextDestroyed(ServletContextEvent sce) 

 

ServletContextEvent 中的: getServletContext() 获取 ServletContext 

 

------------------------------------------------------------------------------------------------------------

 

监听器分类

 

1. 监听域对象(pageContext,request,session)自身的创建和销毁的事件监听器

2. 监听域对象中的属性的增加和删除的事件监听器

3. 监听绑定到HttpSession域中的某个对象的状态的事件监听器

 

如何编写监听器

 

1. 编写实现监听器接口的java类

2. 对于第一二种,需要在web.xml中配置

 

 

分享到:
评论

相关推荐

    详解JavaWeb中的 Listener

    JavaWeb中的Listener是基于观察者设计模式的一种机制,它允许应用程序对特定的事件进行监听和响应。在JavaWeb开发中,Listener扮演着观察者的角色,而Servlet容器则充当被观察者,即主题。当特定的事件(如Web应用...

    JavaWeb开发技术-Listener监听器.pptx

    JavaWeb开发技术中的Listener监听器是Java企业级应用开发中的重要组成部分,主要用于监听应用程序中发生的特定事件,并在事件发生时执行相应的处理逻辑。监听器在JavaWeb开发中扮演着关键角色,它们允许开发者对Web...

    12_JavaWeb——Filter&Listener案例资源

    此资源与我的博客12_JavaWeb——Filter&Listener中的案例对应,在11_JavaWeb——Cookie&Session案例资源基础上加上了过滤器,实现了对未登录用户的拦截,希望有所帮助。

    javaweb 监听器(Listener)和过滤器(Filter)

    javaweb 监听器(Listener)和过滤器(Filter)

    JavaWeb两大组件FILTER&LISTENER

    在JavaWeb开发中,"FILTER(过滤器)"和"LISTENER(监听器)"是两个重要的组件,它们极大地增强了应用程序的功能和灵活性。本案例将深入探讨这两个组件的原理、用法及其在实际项目中的应用。 一、FILTER(过滤器) ...

    Javaweb程序设计教材源码.rar

    6. **Filter和Listener**:在JavaWeb中,Filter可以拦截请求和响应,进行预处理或后处理,如身份验证、日志记录。Listener则监听特定事件,如会话创建或销毁。源码中可能包含自定义的Filter和Listener实现。 7. **...

    javaweb笔记+代码(狂神说java)

    JavaWeb是Java技术在Web应用开发中的核心领域,它涵盖了从服务器端编程到与客户端交互的各个层面。"javaweb笔记+代码(狂神说java)"可能是一份由知名讲师“狂神”编写的教程资料,包含了学习JavaWeb开发的知识点以及...

    javaweb520-JavaWeb-master.zip

    8. **Spring框架**:Spring是JavaWeb开发中最常用的框架之一,它提供了依赖注入、AOP(面向切面编程)、事务管理等功能,简化了企业级应用的开发。 9. **MyBatis**:MyBatis是一个持久层框架,它简化了SQL操作,将...

    javaweb笔记+狂神+知识总结

    JavaWeb是Java技术在Web应用开发中的核心领域,它涵盖了从服务器端编程到与客户端交互的各个层面。"狂神"可能是指一位知名的JavaWeb讲师或教程作者,他的笔记为学习者提供了深入理解和实践该技术的宝贵资源。下面将...

    javaWEB 教材源码

    6. **过滤器(Filter)与监听器(Listener)**:这两者是JavaWeb中的重要组件,过滤器可以拦截请求和响应,实现预处理和后处理功能,如字符编码转换;监听器则可以监听特定事件,如session的创建和销毁。 7. **Web...

    Javaweb--狂神版

    6. **过滤器与监听器**:Filter和Listener是JavaWeb的重要组件。过滤器可以拦截请求和响应,进行预处理或后处理,如字符编码转换。监听器监听特定的事件,如session的创建、销毁,实现特定功能。 7. **Apache ...

    JavaWEB项目开发案例精粹

    - **Listener**:监听器,用于监听Web容器中的事件。 #### 三、框架介绍 1. **Spring Framework**: - **核心容器**:提供依赖注入(DI)和面向切面编程(AOP)功能。 - **Spring MVC**:基于MVC设计模式的Web...

    JavaWeb练习题.zip

    JavaWeb是Java技术在Web应用开发中的核心领域,它涵盖了从服务器端编程、网页动态内容生成到用户交互处理等一系列技术。在这个"JavaWeb练习题.zip"压缩包中,我们可以推测包含的是作者田超凡设计的一些JavaWeb相关的...

    JavaWeb每日总结思维导图

    JavaWeb每日总结思维导图,包含JavaWeb开发的多项技术,方便复习知识点使用。内容包括:MySQL、MySQL约束&多表、MySQL多表&事务、JDBC、数据库连接池、HTML、CSS、JS基础&高级、BootStrap、XML、Tomcat、Servlet&...

    javaweb项目实(含笔记与详细实现步骤)

    7. **过滤器与监听器**:Filter和Listener是JavaWeb的高级特性。过滤器用于在请求处理前后进行拦截和修改,监听器则可以监听特定的Web事件,如session创建、销毁等,从而实现一些额外的功能。 8. **Struts、Spring ...

    JavaWeb习题解析与实验指导_JavaWeb习题解析与实验指导_

    5. **Filter和Listener**:这两种组件在JavaWeb中用于扩展和增强应用功能。Filters可以拦截请求和响应,而Listeners监听Web组件的事件。 6. **Session和Cookie管理**:用于在客户端和服务器之间保持状态,理解它们...

    JavaWeb.zip

    JavaWeb技术是构建互联网应用程序的重要框架,它涵盖了Java语言与Web开发的各种技术,包括Servlet、JSP、JSTL、Filter、Listener等。这个"JavaWeb.zip"压缩包显然包含了与JavaWeb开发相关的实验报告、练习题目和其他...

    javaweb题库

    11. **Filter和Listener**:在JavaWeb中,Filter用于拦截请求和响应,实现如登录验证、URL重写等功能。Listener则监听各种事件,如会话创建、销毁、请求初始化等,可以用来实现特定的业务逻辑。 12. **Web容器**:...

    期末大作业JAVAWEB+MYSQL学生公寓系统(Idea开发)

    【JAVAWEB】标签表明项目的核心技术是JavaWeb,它是Java技术在Web应用上的体现,涵盖了Servlet、JSP、Filter、Listener等多个组件。在本项目中,Servlet可能是主要的业务逻辑处理者,负责接收HTTP请求,执行相应的...

    34个经典javaweb项目实例.zip

    7. **Filter和Listener**:Filter是JavaWeb中的一个组件,可以拦截请求和响应,进行预处理或后处理。Listener监听特定的事件,如session的创建和销毁。这些在web.xml中配置,实例中可能涉及登录验证、字符编码转换等...

Global site tag (gtag.js) - Google Analytics