Listener & Filter

(一)监听器的概述

1、什么是监听器

    监听器就是一个实现了特定接口的Java类,这个Java类用于监听另一个Java类的方法调用,或者属性的改变。当被监听对象发生上述事件后,监听器某个方法将会立即被执行

2、监听器的用途

    用来监听其他对象的变化的,主要应用在图形化界面的开发上

    例如Java中的GUI、Android等,都有大量的监听器的使用

3、监听器的术语

    事件源:指的是被监听对象(汽车)

    监听器:指的是监听的对象(报警器)

    事件源和监听器绑定:在汽车上安装报警器

    事件:指的是事件源对象的改变(踹了汽车一脚),主要功能是获得事件源对象

(二)监听器的入门

1、监听器的入门程序

2、监听器的执行过程

(三)Servlet中的监听器

一、Servlet中的监听器简介

    在Servlet中定义了多种类型的监听器,它们用于监听的事件源分别是ServletContext、HttpSession和ServletRequest这三个域对象

二、Servlet中的监听器的分类

1、一类:监听三个域对象的创建和销毁的监听器(三个)

2、二类:监听三个域对象的属性变更(属性添加、移除、替换)的监听器(三个)

3、三类:监听HttpSession中JavaBean的状态改变(钝化、活化、绑定、解除绑定)的监听(两个)

(四)ServletContextListener监听器的使用

一、ServletContextListener监听器的作用

    用来监听ServletContext域对象的创建和销毁的监听器

二、ServletContext创建和销毁

1、创建:在服务器启动的时候,为每个Web应用创建单独的ServletContext对象

2、销毁:在服务器关闭的时候,或者项目从Web服务器中移除的时候

三、ServletContextListener监听器的方法

1、监听ServletContext对象的创建

        contextInitialized(ServletContextEvent sce)

2、监听ServletContext对象的销毁

        contextDestroyed(ServletContextEvent sce)

四、编写监听器

1、监听器的代码

2、监听器的配置

五、ServletContextListener的企业用途

1、加载框架的配置文件

​Spring框架提供了一个核心监听器叫ContextLoaderListener

2、定时任务调度

(五)HttpSessionListener监听器的使用

一、HttpSessionListener监听器作用

    用来监听HttpSession对象的创建和销毁

二、HttpSession创建和销毁

    创建:

        服务器端第一次调用getSession()方法的时候

    销毁:

        非正常关闭服务器(正常关闭服务器Session会被序列化)

        Session过期(默认过期时间30分钟)

        手动调用session.invalidate()方法

三、HttpSessionListener监听器的方法

1、监听HttpSession对象创建

        sessionCreated(HttpSessionEvent se)

2、监听HttpSession对象销毁

        sessionDestroyed(HttpSessionEvent se)

四、编写监听器监听HttpSession对象创建和销毁

1、监听器的代码

2、监听器的配置

3、问题:

    访问HTML是否会创建Session?不会

    访问JSP是否会创建Session?会

    访问Servlet是否会创建Session?不会(默认没有调用getSession方法)

(六)ServletRequestListener监听器的使用

一、ServletRequestListener监听器的作用

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

二、ServletRequest对象的创建和销毁

    创建:从客户端向服务器发送一次请求,服务器就会创建Request对象

    销毁:服务器对这次请求作出了响应之后,Request对象就销毁了

三、ServletRequestListener监听器的方法

1、监听ServletRequest对象的创建

        requestInitialized(ServletRequestEvent sre)

2、监听ServletRequest对象的销毁

        requestDestroyed(ServletRequestEvent sre)

四、编写监听器代码

1、监听器代码

2、监听器配置

3、问题:

    访问HTML页面是否创建请求对象?会

    访问JSP页面是否创建请求对象?会

    访问Servlet是否创建请求对象?会

(七)统计当前在线人数的案例

一、案例分析

    在服务器启动的时候需要有一个初始值为零。

    当浏览器访问服务器上的某个JSP了,就会创建Session,

    此时获取初始值,进行+1操作。

    如果Session销毁了,获取该值进行-1操作

二、代码实现

1、创建ServletContextListener进行初始化

2、创建HttpSessionListener

3、配置监听器

4、创建JSP页面

(八)监听三个域对象的属性变更的监听器

一、三类监听器

1、ServletContextAttributeListener

监听ServletContext对象中的属性变更(属性添加、移除、替换)的监听器

attributeAdded(ServletContextAttributeEvent event)

attributeRemoved(ServletContextAttributeEvent event)

attributeReplaced(ServletContextAttributeEvent event)

2、HttpSessionAttributeListener

监听HttpSession对象中的属性变更(属性添加、移除、替换)的监听器

attributeAdded(HttpSessionBindingEvent event)

attributeRemoved(HttpSessionBindingEvent event)

attributeReplaced(HttpSessionBindingEvent event)

3、ServletRequestAttributeListener

​监听ServletRequest对象中的属性变更(属性添加、移除、替换)的监听器

attributeAdded(ServletRequestAttributeEvent srae)

attributeRemoved(ServletRequestAttributeEvent srae)

attributeReplaced(ServletRequestAttributeEvent srae)

二、演示第二类监听器

1、演示HttpSessionAttributeListener

2、配置监听器

3、编写测试的JSP

(九)监听HttpSession中Java类状态改变的监听器

一、第三类监听器概述

1、保存在Session域中的Java类可以有多种状态:绑定到Session中、从Session中解除绑定、随Session对象持久化到一个存储设备中(钝化)、随Session对象从一个存储设备中恢复(活化)

2、Servlet规范中中定义了两个特殊的监听的接口,来帮助Java类了解自己在Session域中的状态,分别是:

​HttpSessionBindingListener接口

​HttpSessionActivationListener接口

​实现了这两个接口的类,是不需要在web.xml中进行配置的

二、HttpSessionBindingListener监听器

1、监听Java类在HttpSession中的绑定和解除绑定的状态的监听器

        valueBound(HttpSessionBindingEvent event)

        valueUnbound(HttpSessionBindingEvent event)

2、测试代码

三、HttpSessionActivationListener监听器

1、监听HttpSession中Java类的钝化和活化的监听器

        sessionDidActivate(HttpSessionEvent se)

        sessionWillPassivate(HttpSessionEvent se)

2、测试代码

3、配置完成Session的序列化和反序列化

​Context标签可以配置在:

​​Tomcat/conf/context.xml:所有Tomcat下虚拟主机和虚拟目录下的工程都会序列化Session

​​Tomcat/conf/Catalina/localhost/context.xml:只有localhost虚拟主机下的所有项目会序列化Session

​​工程/META-INF/context.xml:只有当前工程才会序列化Session

(十)Filter

一、Filter的概述

1、什么是Filter

    Filter称为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对Web服务器所管理的资源(JSP、Servlet、静态图片、静态html文件等)进行拦截,从而实现一些特殊的功能

    Filter就是过滤从客户端向服务器发送请求

2、为什么学习过滤器

二、Filter的入门

1、第一步:编写一个类实现Filter接口

2、第二步:对过滤器进行配置

三、FilterChain对象的概述

1、什么是FilterChain

    FilterChain过滤器链:在一个Web应用中,可以开发编写多个Filter,这些Filter组合起来称为是一个过滤器链

    Web服务器根据Filter在web.xml文件中的注册顺序(mapping的配置顺序)决定先调用哪个Filter,依次调用后面的过滤器,如果没有下一个过滤器,则调用目标资源

2、FilterChain的演示

四、Filter的生命周期

1、Filter的生命周期描述

    Filter的创建和销毁是由web服务器负责。Web应用程序启动的时候,Web服务器创建Filter的实例对象,并调用其init方法进行初始化的操作(Filter对象只会创建一次,init方法也只会执行一次)

    每次Filter进行拦截的时候,都会执行doFilter的方法

    当服务器关闭的时候,或者应用从服务器中移除的时候,服务器会销毁Filter对象

2、FilterConfig对象的概述

(1)FilterConfig对象的作用:

​​用来获得Filter的相关的配置的对象

(2)FilterConfig对象的API

    getFilterName()

    getInitParameter(String name)

    getInitParameterNames()

    getServletContext()

3、FilterConfig的演示

五、过滤器的相关配置

1、的配置

    完全路径匹配:以/开始,例如/aaa  /aaa/bbb

    目录匹配:以/开始,例如/*  /aaa/*  /aaa/bbb/*

    扩展名匹配:不能以/开始,以*开始,例如*.jsp *.do *.action

2、的配置

    专门以Servlet的配置的名称拦截Servlet

3、的配置

    默认的情况下,过滤器会拦截请求,如果进行转发(需要拦截这次转发)

    dispatcher的取值有四个:

        REQUEST:默认值。默认过滤器拦截的就是请求

        FORWARD:转发

        INCLUDE:页面包含的时候进行拦截

        ERROR:页面出现全局错误页面跳转的时候进行拦截

(十一)权限验证过滤器

一、案例需求

    现在一个网站上需要有登录的功能,在登录成功后,重定向到后台的成功页面(后台的页面有很多)。如果现在没有登录,直接在地址栏上输入后台页面地址

    编写一个过滤器,可以对没有登录的用户进行拦截(没有登录,回到登录页面;如果已经登录,放行)

二、案例登录功能

1、创建表(MySQL执行如下语句)

create database web05 charset utf8;

use web05;

create table user(

id int primary key auto_increment,

username varchar(20),

password varchar(20)

)charset utf8;

insert into user values (null,'aaa','123');

2、搭建项目的环境

3、代码实现

三、权限验证的过滤器实现

(十二)通用的字符集编码过滤器的分析

一、案例需求

    假设网站需要向后台提交中文的数据(有可能是GET,也有可能是POST),中文处理根据不同的请求方式,处理的方式也是不同的

需要调用request.getParameter();方法接收数据,但是这时会存在乱码,如果想调用request.getParameter()方法,无论是get还是post请求,提交的中文都没有乱码

二、增强一个类的方法

1、通过上面的分析,现在要增强request的getParameter方法,增强的过程要写在过滤器当中

​(1)如何增强一个类中的方法?

​​1)继承

​​​必须要能够控制这个类的构造

​​2)装饰者

被增强的类和增强的类需要实现相同的接口

在增强的类中获得被增强的类的引用

缺点:接口中的方法过多,会导致要重写很多其他的方法

​​3)动态代理

类需要实现接口

三、通用的字符集编码过滤器的代码实现

1、过滤器的代码

2、增强类的代码

你可能感兴趣的:(Listener & Filter)