【JavaWeb】Listener&Filter监听器和过滤器

目录

一、监听器的概述

1.什么是监听器

2.监听器的用途

3.监听器的术语

二、监听器的入门

1.监听器的入门程序

2.监听器的执行过程

3.Servlet中的监听器

3.1Servlet中的监听器简介

3.2Servlet中的监听器的分类

3.3ServletContextListener监听器的使用

3.4HttpSessionListener监听器的使用

3.5ServletRequestListener监听器的使用

4.统计当前在线人数的案例

1.案例分析

 2.代码实现

5.监听三个域对象的属性变更的监听器

6.监听HttpSession中Java类状态改变的监听器

三、Filter(过滤器)的概述

1.什么是Filter

2.为什么学习过滤器

3.Filter的入门

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

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

4.FilterChain对象的概述

1.什么是FilterChain

2.FilterChain的演示

5.Filter的生命周期

6.FilterConfig对象的概述

1.FilterConfig对象的作用:

2.FilterConfig对象的API

3.FilterConfig的演示

7.过滤器的相关配置

四、案例:权限验证过滤器

1.案例需求

2.案例登录功能

2.1创建表

2.2搭建项目的环境

五、通用的字符集编码过滤器的分析

1.案例需求

2.增强一个类的方法

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


一、监听器的概述

1.什么是监听器

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

2.监听器的用途

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

  • Java中GUI,Android

3.监听器的术语

  1. 事件源:指的是被监听对象(汽车)
  2. 监听器:指的是监听的对象(报警器)
  3. 事件源和监听器绑定:在汽车上安装报警器
  4. 事件:指的是事件源对象的改变(踹了汽车一脚)----主要功能获得事件源对象。

二、监听器的入门

1.监听器的入门程序

2.监听器的执行过程

3.Servlet中的监听器

3.1Servlet中的监听器简介

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

3.2Servlet中的监听器的分类

  1. 一类:监听三个域对象的创建和销毁的监听器(三个)
  2. 二类:监听三个域对象的属性变更(属性添加、移除、替换)的监听器(三个)
  3. 三类:监听HttpSession中JavaBean的状态改变(钝化、活化、绑定、解除绑定)的监听(两个)

3.3ServletContextListener监听器的使用

3.3.1ServletContextListener监听器的作用

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

3.3.2ServletContext创建和销毁

ServletContext:

  • 创建:在服务器启动的时候,为每个web应用创建单独的ServletContext对象。
  • 销毁:在服务器关闭的时候,或者项目从web服务器中移除的时候。

3.3.3ServletContextListener监听器的方法

1.监听ServletContext对象的创建

 2.监听ServletContext对象的销毁

3.4.4监听器的代码

3.4.5监听器的配置

3.4.6ServletContextListener企业用途

  1. 加载框架的配置文件:Spring框架提供了一个核心监听器ContextLoaderListener。
  2. 定时任务调度

3.4HttpSessionListener监听器的使用

3.4.1HttpSessionListener监听器作用

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

3.4.2HttpSession创建和销毁

  • 创建:服务器端第一次调用getSession()方法时候。
  • 销毁:

        ① 非正常关闭服务器(正常关闭服务器session会被序列化)。

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

        ③ 手动调用session.invalidate()方法。

3.4.3HttpSessionListener监听器的方法

1.监听HttpSession对象创建

2.监听HttpSession对象销毁

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

  • 监听器代码

  • 监听器的配置

 3.4.5问题

  1. 访问HTML是否创建Session          :不会
  2. 访问JSP是否创建Session             :会
  3. 访问Servlet是否创建Session        :不会(默认没有调用getSession方法)

3.5ServletRequestListener监听器的使用

3.5.1ServletRequestListener监听器作用

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

3.5.2ServletRequest对象的创建和销毁

  • 创建:从客户端向服务器发送一次请求,服务器就会创建request对象。
  • 销毁:服务器对这次请求作出了响应之后,request对象就销毁了。

3.5.3ServletRequestListener监听器的方法

  • 监听ServletRequest对象的创建

  •  监听ServletRequest对象的销毁

 3.5.4编写监听器代码

  • 监听器代码

  • 监听器配置

  •  问题:
  1. 访问HTML页面是否创建请求对象       :会
  2. 访问JSP页面是否创建请求对象            :会
  3. 访问Servlet是否创建请求对象              :会

4.统计当前在线人数的案例

1.案例分析

 2.代码实现

  • 创建ServletContextListener进行初始化

  • 创建HttpSessionListener

  • 配置监听器

  •  创建JSP页面

5.监听三个域对象的属性变更的监听器

1.ServletContextAttributeListener

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

 2.HttpSessionAttributeListener

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

3.ServletRequestAttributeListener

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

4.演示第二类监听器

演示HttpSessionAttributeListener:

  • 代码编写

  • 配置监听器

  • 编写测试的JSP

6.监听HttpSession中Java类状态改变的监听器

1.第三类监听器概述

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

Servlet对方中定义了两个特殊的监听的接口来帮助Java类了解自己在Session域中的状态

HttpSessionBindingListener接口

HttpSessionActivationListener接口,

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

2.HttpSessionBindingListener监听器:

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

  • 测试代码:

3.HttpSessionActivationListener监听器

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

  • 测试代码

  • 配置完成session的序列化和反序列化

Context标签可以配置在:

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

tomcat/conf/Catalina/localhost/context.xml         :localhost虚拟主机下的所有项目会序列化session

工程/META-INF/context.xml                                      :当前工程才会序列化session

<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
	<Store className="org.apache.catalina.session.FileStore" directory="itheima"/>
</Manager>
</Context>

三、Filter(过滤器)的概述

1.什么是Filter

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

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

2.为什么学习过滤器

3.Filter的入门

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

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

4.FilterChain对象的概述

1.什么是FilterChain

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

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

2.FilterChain的演示

5.Filter的生命周期

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

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

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

6.FilterConfig对象的概述

1.FilterConfig对象的作用:

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

2.FilterConfig对象的API

3.FilterConfig的演示

7.过滤器的相关配置

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.案例需求

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

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

2.案例登录功能

2.1创建表

create database web05;
use web05;
create table user(
	id int primary key auto_increment,
	username varchar(20),
	password varchar(20)
);
insert into user values (null,'aaa','123');

2.2搭建项目的环境

2.2.1权限验证的过滤器实现

五、通用的字符集编码过滤器的分析

1.案例需求

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

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

2.增强一个类的方法

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

1.如何增强一个类中的方法?

  • ①继承:必须要能够控制这个类的构造。
  • 装饰者:
  • 被增强的类和增强的类需要实现相同的接口。
  • 在增强的类中获得被增强的类的引用。
  • 缺点:接口中的方法过多,重写很多其他的方法。

③动态代理:类需要实现接口

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

1.过滤器的代码

2.增强类的代码

猜你喜欢

转载自blog.csdn.net/wang_qiu_hao/article/details/126806881