学习Struts,建议先从 web Servlet编程开始学起,跟着框架发展的轨迹,用心体悟那设计之美的韵味。
和最初接触java web编程一样,我们乐此不疲的用着Servlet,写着重复度很高的代码,来做那些简单的功能开发。
像现在好多成熟的框架那样,我们在感觉重复编程枯燥无味的同时,有人不甘于此,厉声大呼,“我要轻松高效的编程,不要重复枯燥的劳动”。于是慢慢的演变出了很多框架,也出现了Model1的进阶版Model2,由Model2进阶到Struts1,Struts1又进阶到Struts2等等。
Model1:还是男耕女织,落魄的旧时代。那时候的程序猿多数是典型的多体力少脑力的劳动人民,你长得结实 ,肯加班,甚至多吃两口白米饭就能多搞出来几个功能页面。
图片摘自 <http://book.51cto.com/art/200708/53966.htm>
Model2:时代在进步,MVC的初步应用已经让饱受Model1劳赘的同志们欢呼雀跃不已,MVC带来了盘古开天辟地的感觉,让业务逻辑和页面展示分开了,不用再写强耦合的代码,也不用修改的时候在代码堆里翻来找去的了。Model2中用Servlet来做控制器,接受Web请求,再来调用JavaBean,这就有了一种层次和高度的体现。
图片摘自 <http://book.51cto.com/art/200708/53966.htm>
由Model2到Struts1的过渡,也是那些“偷懒的”设计者做的好事,当Model2中Servlet里的众多if else 被大家厌恶的时候,配置文件+反射,就此跳出来拯救世界了,从繁杂的业务逻辑或者功能开发中,找出结构化、近模板化的东西,把这些带有分支气味的代码拿出来,放到了配置文件中,用反射技术来动态获取任何你想要得到的东西,也使得需求变更,代码维护更方便。
大家可以跟着网上的系列文章,把这几个过程的Demo做一下,更能感受到其中的设计之美,变化之味。
Struts1:框架之路的开始,在Struts1中,将ActionServlet封装成了Struts1的核心类,同样也作为了很重的Controller控制器在配置文件中随着WebProject的启动而加载,并且根据配置的映射信息会把相应的Action实例化一遍,在页面发送http请求的时候会被ActionServlet处理,进而 调用映射的Action对象来处理相关逻辑,处理结束根据配置中的跳转信息,跳转到相应页面。
struts1中执行页面请求的流程图如下:
struts1的简易脑图.
Struts2:较之Struts1来说,更友好,没有那野蛮的侵入性代码,主要变动的地方就是将自定义action类必须继承Action这一条约束和侵入性很强的一点去掉了,并且将ActionForm(页面实体类)融合到了自定义action类中,可以自由的使用轻便的POJO来承载页面数据。
改进后的struts将原来Action中execute()方法里的众多核心对象,将HttpServletRequest等对象融合到了ActionContext、ServletActionContext中,将原来Struts1的Action中暴露出来的ActionMapping、ActionForm等都融合进框架等。
Struts2比Struts1进步很多,使之侵入性更小,更轻便高效,从webWork中吸收了好多优秀的框架设计。这也是每个框架进步的动力和源泉,互相借鉴发展。
从Servlet的原始编程开始,经历着框架从无到有,开发由繁琐重复到简洁高效,着一步一步走到Struts2框架的产生,都是我们的OO思想作为发散的基点,也是有着那些“懒”人本着不将就的原则在一点点改变着我们的程序设计。