多个Filter能够处理同一个页面,一个Filter也能处理多个页面,同时可以通过配置文件灵活的设置要通过Filter进行处理的页面。如果的灵活性是通过职责链模式实现的。
职责链模式
定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着该条链处理该请求,直到有对象处理该请求为止。
其模式图为
图中Client为请求的发出者,hanlder为定义了处理方法的抽象类,ConcreteHandler1和ConcreteHandler2为在其职责范围内处理请求的具体类,如果不能处理请求,则把请求发送给后继者。
很多情景中会用到该情景,拿咱们日常请假来说,上课的时候快递来了,和班长打个招呼就行;如果家里有什么急事,班长不能决定,则交给老师处理。班长可以处理像取快递,外出看病这样的小问题,老师可以处理回家这样的大问题。
在该实例中,同学是发出请求的Client,班长是处理请求的handler,老师也是处理请求的handler,如果班长发现自己不能处理某请求,则将该请求发送给老师处理。我们通过简单的代码实现该例子。
Handler类
/*
*定义职责对象接口
*
*/
public abstract class Handler{
//定义职责链中下一个对象
protected Handler successor=null;
//设置下一个处理请求的对象
public void SetHandler(Handler handler){
this.successor=handler;
}
public Handler GetHandler(){
return successor;
}
//对请求的处理方法,也可以设置参数和返回值
public abstract void HandleRequest(String Request){
//每个继承类都有不一样的实现方法
}
}
班长类
/*
*班长类
*
*/
public class banzhang extends Handler{
public void HandleReuqest(String Request){
//如果请求是 看病或者 拿快递
if(Request.equals("...")){
//对请求进行处理
}else{
if(this.successor!=null){
return this.successor.HanldeRequest(Request)
}
}
}
}
教师类
/*
*老师类
*
*/
public class Teacher extends Handler{
public void HandleRequest(String Request){
//如果请求是回家等大事件
//do something
//对请求进行处理
}
}
客户端
public class Client{
public static void main(String[] arg){
Banzhang banzhang=new BanZhang();
Teacher teacher=new Teacher();
banzhang.SetHandler(teacher);
banzhang.HandlerRequest("回家");
}
}
在客户端的测试代码中,讲班长的下一个处理者设置为老师,这样形成了两个人的链,这里传递的回家这样的请求,班长不能处理,就会把请求传递给下一个请求处理者老师。
Filter中职责链的实现
实现了Filter接口的类相当于上面例子中的具体的ConcreteHandler,也就是老师和班长,那么处理链是怎么形成的?
我们写好几个Filter类后,要在web.xml文件中配置每个Filter处理的页面,然后执行对应页面或执行的请求返回时,Filter会起作用。在真正执行到FIlter类之前,很多Tomcat的内部类会首先执行,帮助形成整个职责链。其中包括ApplicationFilterChain类,StandardWrapperValue类,ApplicationFilterFactory类,其中前两个类能在调试Filter执行的过程中看到:
这篇博文有点头重脚轻了,因为不知道去哪深入的学习Tomcat执行Filter时内部的机制,还请大家知道的给推荐些资料,不胜感激。
这是写博客参考的连接《java与模式》之职责链模式。