Nutz Mvc里面的一些类和接口:
NutFilter, ActionHandler, NutConfig, Loading,UrlMapping, ActionChainMaker, ActionInfo,ActionChain, Processor, ActionInvoker,HttpAdaptor, AbstractAdaptor, ActionContext,View,
头有点小晕,先说一下他们的作用跟关系。
NutFilter是mvc入口,在init方法中new ActionHandler(),
ActionHandler 中创建Loading, 然后loading#load(),返回是UrlMapping,
在NutLoading#evalUrlMapping()方法中创建一个ActionChainMaker,在这个方法中为所有的加@At注解的方法执行UrlMapping#add()方法
在add方法中,ActionChainMaker创建一个actionChain, 即maker#eval(),在这个方法中,把default-chains.js中默认的8个Processor通通初始化了一遍,通过processor#init()方法.
这个8个默认的Processor分别是UpdateRequestAttributesProcessor,EncodingProcessor,ModuleProcessor,
ActionFiltersProcessor,AdaptorProcessor,MethodInvokeProcessor,ViewProcessor,FailProcessor,
从名字大概可以看出他们的作用分别是什么,在这里重点说下AdaptorProcessor,在AdaptorProcessor#init()中初始化了一个HttpAdaptor, 具体实现在AbstractAdaptor.init()方法中,并设置参数的注入,包括Servlet内置对象,各种注解,基本类型等等.ViewProcessor的作用是产生各种View,包括jsp视图,json视图,forward视图等等.
注意是会在每个@At函数的urls路径都会执行一遍maker#eval()方法.
还是在UrlMapping#add()方法中,创建actionChain后,new 一个ActionInvoker,设置invoker的actionChain,放入到以url为key的一个map中,建立url与invoker的联系。
初始化完了。
具体运行:
NutFilter.doFilter 中调用actionHandler.handler(),该方法就是从urlMapping中取得当前ActionContext所对应的invoker,但是在初始化的时候我们明明是url路径跟invoker映射的,实际跟下去发现确实还是从路径中取得invoker,然后invoker#invoker(),得到actionChain,一路执行各个processor#process()方法。最后到ViewProcessor输出到具体的页面。
用简单几句话概括, 系统启动时加载url与invoker的映射, invoker里面包含了一个actoinChain, actoinChain里面默认的在default-chains.js有8个processor(可以看做是Struts2的拦截器),从头到尾依次init, 然后在doFilter方法中,先取得url对应的invoker,调用invoker#invoker()方法,依次执行processor#process()方法,最后一个Processor为ViewProcessor则根据不同视图forward(redirect)到页面.例如:
RequestDispatcher rd = req.getRequestDispatcher(path);
rd.forward(req, resp);
Over, 真的是简析!!!!