java web filter之二 Filter与职责链模式

上接 java web filter之一 基础实现


       多个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与模式》之职责链模式







评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值