这两件事都有点2。只是想验证一下这种场景下,finally到底怎么执行。<br>
简单的filter链,只是为了验证。
<span style="white-space: pre;"> </span>
来看测试:
handle filter org.jport.sample.designpattern.responsebilitychain.test1filter
handle filter org.jport.sample.designpattern.responsebilitychain.test3filter
handle filter org.jport.sample.designpattern.responsebilitychain.test4filter
handle filter org.jport.sample.designpattern.responsebilitychain.test2filter
org.jport.sample.designpattern.responsebilitychain.test2filter finally
org.jport.sample.designpattern.responsebilitychain.test4filter finally
org.jport.sample.designpattern.responsebilitychain.test1filter finally
如果chain.dofilter在try{}finally{}块中,那么finally是一定会执行的。加了return后也一样。只不过return后面的语句不再执行了而已。
<div><br>
简单的filter链,只是为了验证。
public interface filter { void dofilterhttp(object request, object response, filterchain chain);}
public class filterchain { private list<filterconfig> filterconfigs = new arraylist<filterconfig>(); private iterator<filterconfig> iterator = null; public void dofilter(object request,object response){ if(this.iterator==null){ this.iterator=filterconfigs.iterator(); } if(this.iterator.hasnext()){ filterconfig config=this.iterator.next(); filter filter=config.getfilter(); filter.dofilterhttp(request, response, this); } } public void addfilterconfig(filterconfig config){ this.filterconfigs.add(config); }}
<span style="white-space: pre;"> </span>
public class filterconfig { private filter filter; public filter getfilter() { return filter; } public void setfilter(filter filter) { this.filter = filter; } }
public class test1filter implements filter { public void dofilterhttp(object request, object response, filterchain chain) { try{ system.out.println("handle filter"+this.getclass().getname()); chain.dofilter(request, response); }finally{ system.out.println(this.getclass().getname()+" finally"); } }}
public class test2filter extends test1filter {}
public class test3filter implements filter { public void dofilterhttp(object request, object response, filterchain chain) { if(true){ system.out.println("handle filter"+this.getclass().getname()); chain.dofilter(request, response); return ; } try{ system.out.println(this.getclass().getname()+" try"); }finally{ system.out.println(this.getclass().getname()+" finally"); } }}
public class test4filter implements filter { public void dofilterhttp(object request, object response, filterchain chain) { try{ if(true){ system.out.println("handle filter"+this.getclass().getname()); chain.dofilter(request, response); return ; } system.out.println(this.getclass().getname()+" try"); }finally{ system.out.println(this.getclass().getname()+" finally"); } } }
来看测试:
public class filtertest { /** * @param args */ public static void main(string[] args) { filterchain chain=new filterchain(); test1filter filter1=new test1filter(); test2filter filter2=new test2filter(); test3filter filter3=new test3filter(); test4filter filter4=new test4filter(); filterconfig config1=new filterconfig(); config1.setfilter(filter1); filterconfig config2=new filterconfig(); config2.setfilter(filter2); filterconfig config3=new filterconfig(); config3.setfilter(filter3); filterconfig config4=new filterconfig(); config4.setfilter(filter4); chain.addfilterconfig(config1); chain.addfilterconfig(config3); chain.addfilterconfig(config4); chain.addfilterconfig(config2); chain.dofilter(null, null); }}
handle filter org.jport.sample.designpattern.responsebilitychain.test1filter
handle filter org.jport.sample.designpattern.responsebilitychain.test3filter
handle filter org.jport.sample.designpattern.responsebilitychain.test4filter
handle filter org.jport.sample.designpattern.responsebilitychain.test2filter
org.jport.sample.designpattern.responsebilitychain.test2filter finally
org.jport.sample.designpattern.responsebilitychain.test4filter finally
org.jport.sample.designpattern.responsebilitychain.test1filter finally
如果chain.dofilter在try{}finally{}块中,那么finally是一定会执行的。加了return后也一样。只不过return后面的语句不再执行了而已。
<div><br>