filter
这个关键字在JavaSE
中jdk1.8
新特性stream
流中的方法中是出现过:
Stream filter(Predicate<? super T> predicate);
这个方法返回一个子集流,过滤掉不满足条件的数据,返回符合条件的数据,非终端方法。
通过它可以直观的猜测这个关键字是和过滤数据有关系的。
Filter
是过滤器;Filter
是Servlet
高级特性之一,实际就是实现Filter
接口的Java
类,主要还是Java
程序;Servlet
程序看作是一个最终要执行的目标,可以使用过滤器Filter
来添加过滤代码,这个过滤代码可以添加到Servlet
执行之前,也可以添加到Servlet
执行之后,Filter
可以做到在Servlet
这个目标程序执行之前过滤,也可以在目标程序执行之后过滤;Filter
之前发送请求访问Servlet
:
(可以看到三个Servlet都写了判断登录的代码,代码重复写,没有达到代码复用的效果)
Filter
之后发送请求访问Servlet
可以是以下这样的:(经不经过过滤器看路径,先走过滤器再去寻资源,一个项目里面可以有多个过滤器,一个请求也可能经过多个过滤器再到所需资源)
过滤器在WEB容器中哪里?
只能说Filter
过滤器功能很强大!!!
和Servlet生命周期一致。
唯一的区别:Filter
默认情况下,在服务器启动阶段就实例化,而Servlet
不会,Servlet
是默认根据请求来的。
Java
类实现一个接口:Jakarta.servlet.Filter
,并且实现这个接口当中的所有方法;
init
方法:在Filter
对象第一次被创建之后调用,并且只调用一次;(默认方法)
doFilter
方法:只要用户发送一次请求,则执行一次;
destroy
方法:在Filter
对象被释放/销毁之前调用,并且只调用一次。(默认方法)如果
init
和destroy
方法没有特殊使用,子类可以不重写,它们俩是默认方法;Filter
可以称为函数式接口!
三个方法中一个doFilter
方法是特殊的,(其他俩个和Servlet中是一致的)。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
doFilter
前俩参数是ServletRequest
和ServletResponse
对象,可以看到这是面向接口编程,可以实现任何协议的过滤操作!!!
第三个参数FilterChain
是Servlet
中没有的。
FilterChain
接口是由WEB
容器实现的,我们只管使用即可!!!下面是使用描述:
web.xml
文件中对Filter
进行配置或者利用注解(@WebFilter)进行配置,这个配置和Servlet
很像;注意:
Servlet
对象默认情况下,在服务器启动的时候是不会新建对象的,Filter
对象默认情况下,在服务器启动的时候会新建对象。另外Servlet是单例的,Filter也是单例的!!!
或
目标Servlet是否执行,取决于两个条件:
chain.doFilter(request,response);
代码;Servlet
的请求路径一致。chain.doFilter(request,response);
这行代码的作用:
执行下一个过滤器,如果下面没有过滤器了,执行最终的Servlet
。
注意:Filter的优先级天生就比Servlet优先级高;所以当路径一致是优先执行的是Filter,是否执行Servlet
取决于以上写的那两个条件!!!
/*
)/
开始(*.do
)/
开始(/dept/*
)web.xml
文件中进行配置的时候,Filter
的执行顺序是什么?依靠
filter-mapping
标签的配置位置,越靠上优先级越高。
比较Filter实现类的类名。
比如FilterA和FilterB,则先执行FilterA;
比如Filter1和Filter2,则先执行Filter1;
遵循栈数据结构。
Filter
过滤器这里有一个设计模式:职责链设计模式(也叫责任链设计模式);
过滤器最大的优点:
在程序编译阶段不会确定调用程序,因为Filter
的调用顺序是配置到web.xml
文件中,只要修改web.xml
配置文件中filter.mapping
标签的顺序就可以调整Filter
的执行顺序,显然Filter的执行顺序是在程序运行阶段动态组合的,那么这种设计模式被称为职责链设计模式。
职责链设计模式
最大的核心思想:
在程序运行阶段,动态的组合程序的调用顺序。
可以看看我Gitee
中的oa3
,里面有通过Filter
改进后的CRUD
!
使用Filter改进oa3