struts是早期的成熟MVC前端控制层框架,具有诸多优点,近两天又系统了研究了一下框架的原理,
希望能够从原理上研究一下struts框架的实现思路。也就是说如果理解了这些原理的相关应用技术,就可以自己写出
一个山寨版的struts了,当然根据水平的不同,写出的框架的健壮性、扩展性、重用性肯定会相差很多的。
struts的有两个控制器,分别是前端的ActionServlet中心控制器,和后端所有action都需要继承的
Action控制器。真正的开发过程中,项目开发人员并不需要对ActionServlet有过多的了解就可以开发的很happy。
但是这篇随笔我想系统的写一下我最近的研究体会,解析struts架构。从ActionServlet开始,让我们看透struts。
struts并不神秘,构建起这个框架的技术是servlet,jsp,javabean,dom4j或jdom,反射。
1.ActionServlet(中心控制器)
ActionServlet需要做的工作是,根据web.xml的struts配置文件的路径,解析struts配置文件(一般用的都是
/WEB-INF/struts-config.xml)。当然不只找配置文件这么简单,还需要初始化一些属性值,如果web.xml没有
指定,就使用默认的值,这是第一个重要步骤。第二步填充ActionFrom,struts框架构建于“Action-Form”模式上
所以这一步非常重要,也是难点。首先根据配置文件,利用反射的Class.forName方法查找匹配的类,如果存在则填充,
不存在则抛出异常。提取页面所有参数名(request.getParameterNames()--Enumeration),接着把参数名与bean
中的属性名进行匹配,若匹配把取出的值填充到bean中(使用BeanUtils技术)保存form对象。如果使用ActionForm
的子类DynaActionForm,则是走另一套类似的方法,只不过不需要使用反射,而是直接对比配置文件的配置属性和
所配置数据类型是否一致。一致就构建进一个内致的formbean对象。然后需要借助Action后端控制器进行操作默认会
调用对应的action的execute方法(前提:action没有继承自DispatchAction之类的特殊Action控制器子类的话)。最终
接收返回的ActionForward,派发请求并查找响应。
--------------------------这就是神秘的ActionServlet。
2.Action(后端控制器)
主要包含execute方法,还有其他加起来多达21种可覆写方法。当然这也就体现出了struts框架的完善度。如果我们自己想要在
不看源码的情况下实现这个控制器,我觉得需要挑战一下自己的能力。这里不过多的叙述了。
3.ActionFrom
包含方法:Reset、validate.....9种可覆写方法。实现诸如校验、重置的功能。
4.ActionMapping
这是action的控制方法都要传的一个重要参数对象,包含属性:path,name,type,validate,HashMap:forwards....
5.ActionForward
这是action的控制方法都要返回的一个参数对象,包含属性:name,path,redirect....
---------------------------以上就是struts的核心类。
struts的插件实现是给了一个Plugin接口,其中有两个接口方法来实现的。说白了就是在struts启动的时候,会加载
插件的初始化方法或者配置文件。
当然除了上述的主要核心内容外struts也要实现许多其他的功能类,来实现国际化,模块异常,链式结构,页面标签处理,
可视化结构,以及一些我所没有用到的功能。这些源代码没有研究,目前资历尚浅,有待今后研究。
总结:
不要因为现在有了struts2,JSF,甚至更新的JavaFX技术,就不去学好老框架,每个框架都有它的智慧所在。况且掌握
一个框架又不难,所以更没有理由拒绝。
本文转自施杨博客园博客,原文链接:http://www.cnblogs.com/shiyangxt/archive/2009/02/07/1385956.html,如需转载请自行联系原作者