Nutz mvc HelloWorld源码简析(不考虑任何扩展点)

阅读更多

       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, 真的是简析!!!!

你可能感兴趣的:(nutz,java,mvc)