2020-03-26

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、<url-pattern>的配置

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

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

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


2、<servlet-name>的配置

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


3、<dispatcher>的配置

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

    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、增强类的代码

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容

  • 作业: ((一)监听器的概述 1、什么是监听器监听器就是一个实现了特定接口的Java类,这个Java类用于监听另一...
    常樂_b00d阅读 395评论 0 0
  • 监听器(listener) 监听器简介 :监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个...
    奋斗的老王阅读 2,461评论 0 53
  • 监听器 (一)监听器的概述 1、什么是监听器监听器就是一个实现了特定接口的Java类,这个Java类用于监听另一个...
    唐梦帆阅读 141评论 0 0
  • (一)监听器的概述 1、什么是监听器监听器就是一个实现了特定接口的Java类,这个Java类用于监听另一个Java...
    请重置阅读 139评论 0 0
  • day15 监听器 (一)监听器的概述 1、什么是监听器监听器就是一个实现了特定接口...
    漩涡水户阅读 114评论 0 0