Listener&Filter
监听器的概述
监听器就是一个实现了特定接口的Java类,这个Java类用于监听另一个Java类的方法调用或者属性的改变。当被监听对象发生上述事件后,监听器某个方法将会立即被执行。
监听器的用途
用来监听其他对象的变化的。主要应用在图形化界面开发上。
Java中GUI,Android
监听器的术语
- 事件源:指的是被监听对象(汽车)
- 监听器:指的是监听的对象(报警器)
- 事件源和监听器绑定:在汽车上安装报警器
- 事件:指的是事件源对象的改变(踹了汽车一脚)----主要功能获得事件源对象。
GUI的小窗口监听器Demo

Servlet中的Listener
在Servlet中定义了多种类型的监听器,它们用于监听的事件源分别是ServletContext、HttpSession和ServletRequest这三个域对象。
Servlet中的监听器的分类
- 一类:监听三个域对象的创建和销毁的监听器(三个)
- 二类:监听三个域对象的属性变更(属性添加、移除、替换)的监听器(三个)
- 三类:监听HttpSession中JavaBean的状态改变(钝化、活化、绑定、解除绑定)的监听(两个)
ServletContextListener
用来监听ServletContext域对象的创建和销毁的监听器。
ServletContext创建和销毁
创建:在服务器启动的时候,为每个web应用创建单独的ServletContext对象。
销毁:在服务器关闭的时候,或者项目从web服务器中移除的时候。
ServletContextListener监听器的方法
监听ServletContext对象的创建

监听ServletContext对象的销毁

编写监听器ServletContextListener
监听器的代码

监听器的配置(web.xml)

ServletContextListener用途
- 加载框架的配置文件(如:Spring框架提供了一个核心监听器ContextLoaderListener)
- 定时任务调度
HttpSessionListener
用来监听HttpSession对象的创建和销毁。
HttpSession创建和销毁
- 创建:服务器端第一次调用getSession()方法时候。
- 销毁:
- 非正常关闭服务器(正常关闭服务器session会被序列化)。
- Session过期(默认过期时间30分钟)。
- 手动调用session.invalidate()方法。
HttpSessionListener监听器的方法
监听HttpSession对象创建

监听HttpSession对象销毁

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

监听器的配置(web.xml)

Ps:
- 访问HTML是否创建Session :不会
- 访问JSP是否创建Session :会
- 访问Servlet是否创建Session :不会(默认没有调用getSession方法)
ServletRequestListener
用户监听ServletRequest对象的创建和销毁
ServletRequest对象的创建和销毁
- 创建:从客户端向服务器发送一次请求,服务器就会创建request对象。
- 销毁: 服务器对这次请求作出了响应之后,request对象就销毁了。
ServletRequestListener监听器的方法
监听ServletRequest对象的创建

监听ServletRequest对象的销毁

编写监听器代码
监听器代码

监听器配置

Ps:
- 访问HTML页面是否创建请求对象 :会
- 访问JSP页面是否创建请求对象 :会
- 访问Servlet是否创建请求对象 :会
第二类:监听三个域对象的属性变更的监听器
ServletContextAttributeListener
监听ServletContext对象中的属性变更(属性添加,移除,替换)的监听器

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

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

代码演示:



第三类:监听HttpSession中Java类状态改变的监听器
保存在Session域中的Java类可以有多种状态:绑定到session中;从session中解除绑定;随session对象持久化到一个存储设备中(钝化);随session对象从一个存储设备中恢复(活化)。
Servlet对方中定义了两个特殊的监听的接口来帮助Java类了解自己在Session域中的状态:
- HttpSessionBindingListener
- HttpSessionActivationListener
实现这两个接口的类不需要在web.xml中进行配置。
HttpSessionBindingListener
监听Java类在HttpSession中的绑定和解除绑定的状态的监听器:

测试代码:

访问jsp:

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

测试代码

先访问
,正常重启服务器后再访问

关闭服务器时控制栏显示:"Bean2被session钝化了..."
打开服务器时控制栏显示:"Bean2被session活化了..."
配置完成session的序列化和反序列化
Context标签可以配置在:
- tomcat/conf/context.xml :所有tomcat下虚拟主机和虚拟目录下的工程都会序列化session
- tomcat/conf/Catalina/localhost/context.xml :localhost虚拟主机下的所有项目会序列化session
- 工程/META-INF/context.xml :当前工程才会序列化session
//每1分钟将session序列化到itheima目录 <?xml version="1.0" encoding="UTF-8"?> <Context> <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1"> <Store className="org.apache.catalina.session.FileStore" directory="itheima"/> </Manager> </Context>
Filter
Filter称为过滤器,它是Servlet技术中最实用的技术,web开发人员通过Filter技术,对web服务器所管理的资源(JSP,Servlet,静态图片或静态html文件)进行拦截,从而实现一些特殊的功能。
Filter就是过滤从客户端向服务器发送的请求。
Filter的Demo


效果:访问任何jsp时控制栏打印"FilterDemo1执行了..."
ps:为何不打印两次"FilterDemo1执行了..."?
响应时经过过滤器只会执行chain.doFilter后边的代码
FilterChain
FilterChain过滤器链:在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称为是一个过滤器链。
Web服务器根据Filter在web.xml文件中的注册顺序(mapping的配置顺序)决定先调用那个Filter。依次调用后面的过滤器,如果没有下一个过滤器,调用目标资源

Filter的生命周期
Filter的创建和销毁是由web服务器负责。Web应用程序启动的时候,web服务器创建Filter的实例对象。并调用其init方法进行初始化(filter对象只会创建一次,init方法也只会执行一次)。
每次filter进行拦截的时候,都会执行doFilter的方法。
当服务器关闭的时候,应用从服务器中移除的时候,服务器会销毁Filter对象。
FilterConfig
用来获得Filter的相关的配置的对象



过滤器的相关配置
<url-pattern>的配置
- 完全路径匹配 :以/开始 比如/aaa /aaa/bbb
- 目录匹配 :以/开始 以*结束 比如/* /aaa/* /aaa/bbb/*
- 扩展名匹配:不能以/开始 以*开始 比如*.jsp *.do *.action
<servlet-name>的配置
专门以Servlet的配置的名称拦截Servlet。
<dispatcher>的配置
默认的情况下过滤器会拦截请求。如果进行转发(需要拦截这次转发)。
dispatcher的取值
- REQUEST :默认值。默认过滤器拦截的就是请求。
- FORWARD:转发。
- INCLUDE :页面包含的时候进行拦截
- ERROR :页面出现全局错误页面跳转的时候进行拦截

filter使用场景:登录验证(每次请求时在filter中查session)
Filter处理get和post请求时的中文乱码(装饰者模式)
如何增强一个类中的方法?
继承
必须要能够控制这个类的构造。
装饰者
被增强的类和增强的类需要实现相同的接口。
在增强的类中获得被增强的类的引用。
缺点:接口中的方法过多,重写很多其他的方法。
动态代理
类需要实现接口。



浙公网安备 33010602011771号