打字猴:1.70048485e+09
1700484850
1700484851 //检查是否符合条件
1700484852
1700484853 arg1=check();
1700484854
1700484855 }
1700484856
1700484857 }
1700484858
1700484859 到此为止,我们把init方法已经讲解完毕,它是在容器初始化时调用。有一个HTTP请求发送过来,容器调用我们编写的doFilter方法。仔细看一下我们的代码,其中有这样一句话:Chain.doFilter(req,res),这句话是什么意思呢?是说让后续的过滤器先运行,等它们运行完毕后该过滤器再运行,应该想到这是一个责任链模式,它的类型是FilterChain。Servlet容器把所有的过滤器组合在一起形成了一个过滤器链,它是怎么做到的呢?容器启动的时候,把所有的过滤器都初始化完毕,然户根据它们在web.xml中的配置顺序,从上向下组装一个过滤器链。注意所有的过滤器都必须实现Filter接口,这是建立过滤器链的首要前提。
1700484860
1700484861 我们再回过头来仔细看看类图,是不是有点熟悉?对,类似于中介者模式,我们并没有把中介者传递到各个同事类,只是我们采用中介者模式的思想,把中介者的职责分发出去由各个同事类来处理。
1700484862
1700484863
1700484864
1700484865
1700484866 设计模式之禅 38.1.2 模型管理器
1700484867
1700484868 模型管理器是整个MVC框架的难点,在这里我们会看到非常多的设计模式。我们在核心控制器的类图中看到有一个IActionDispatcher接口,它实现的模型行为分发是一个门面模式,如代码清单38-11所示。
1700484869
1700484870 代码清单38-11 模型行为分发接口
1700484871
1700484872 public interface IActionDispather{
1700484873
1700484874 //根据Action的名字,返回处理结果
1700484875
1700484876 public String actionInvoke(String actionName);
1700484877
1700484878 }
1700484879
1700484880 它的职责非常简单,得到actionName就执行,熟悉Struts的读者可能很清楚这个方法是非常复杂的,它要从配置文件中找到执行对象,然后执行方法,还要考虑值栈、异常等等,非常复杂。我们这里就有一个方法,它对外提供一个门面,所有的访问都是通过该门面来完成,其实现类如代码清单38-12所示。
1700484881
1700484882 代码清单38-12 模型分发实现
1700484883
1700484884 public class ActionDispather implements IActionDispather{
1700484885
1700484886 //需要执行的Action
1700484887
1700484888 private ActionManager actionManager=new ActionManager();
1700484889
1700484890 //拦截器链
1700484891
1700484892 private ArrayList<Interceptors>listInterceptors=InterceptorFactory.createInterceptors();
1700484893
1700484894 public String actionInvoke(String actionName){
1700484895
1700484896 //前置拦截器
1700484897
1700484898 return actionManager.execAction(actionName);
1700484899
[ 上一页 ]  [ :1.70048485e+09 ]  [ 下一页 ]