白话MVC(二)Struts2中Model的处理基础-ActionContext
白话MVC(一)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???????????????????? 白话MVC(三)
?
在第一篇中,花了主要篇幅探讨了MVC框架中对于编写Model层的约定,约定的目的是为了在Action类中进行自动装配,那么,struts2是如何自动装配Model Bean呢?在阅读struts2的源代码之前,不烦先做几个假设,带着这几个假设去看代码,效率高很多。
至于struts2是不是采用上述三种假设中的一个,符合不符合假设并不重要,重要的是找到了正确的结果。本文探讨的源码基于struts 2.3.4这个最新的发行版本。在探讨的过程中,仍然聚焦在Model层的处理,不详细描述每个细节(其实,以我对struts2框架的了解水平,显然是不可能的 )。
?
struts 2.3.4以StrutsPrepareAndExecuteFilter作为整个框架处理Request的接入点,从名字可以看出来,它是一个Filter(它真是一个Filter),在init方法中,读取了struts的配置文件,并且创建了Dispatcher、PrepareOperations和ExecuteOperations这三个重要的对象,其中Dispatcher是派发request给代理的工具类,很多实际的功能由这个类完成。
Map<String,Object> extraContext = createContextMap(requestMap, params, session, application, request, response, context);
?是不是struts框架非常偏爱Map这个类?这是框架使用了Ongl处理request参数的情形下合理选择。
?
通过阅读这些代码,我们发现,这个时候Action实例还没有被创建,因此不可能会出现装配的Model Bean的情形。但是,这个时候ActionContext已经具备了和Reqeust脱离的条件,也即在框架下一层的处理中,对于数据上的需要,操作的重点对象不再是Request对象,而是ActionContext对象。
?
[本文系作者原创,如若转载,请注明出处,新浪微博:@仪山湖]