Struts框架原理分析之我见
? ?struts是早期的成熟MVC前端控制層框架,具有諸多優(yōu)點(diǎn),近兩天又系統(tǒng)了研究了一下框架的原理,
希望能夠從原理上研究一下struts框架的實(shí)現(xiàn)思路。也就是說如果理解了這些原理的相關(guān)應(yīng)用技術(shù),就可以自己寫出
一個(gè)山寨版的struts了,當(dāng)然根據(jù)水平的不同,寫出的框架的健壯性、擴(kuò)展性、重用性肯定會相差很多的。
????????????????????struts的有兩個(gè)控制器,分別是前端的ActionServlet中心控制器,和后端所有action都需要繼承的
Action控制器。真正的開發(fā)過程中,項(xiàng)目開發(fā)人員并不需要對ActionServlet有過多的了解就可以開發(fā)的很happy。
但是這篇隨筆我想系統(tǒng)的寫一下我最近的研究體會,解析struts架構(gòu)。從ActionServlet開始,讓我們看透struts。
struts并不神秘,構(gòu)建起這個(gè)框架的技術(shù)是servlet,jsp,javabean,dom4j或jdom,反射。
?
1.ActionServlet(中心控制器)
ActionServlet需要做的工作是,根據(jù)web.xml的struts配置文件的路徑,解析struts配置文件(一般用的都是
/WEB-INF/struts-config.xml)。當(dāng)然不只找配置文件這么簡單,還需要初始化一些屬性值,如果web.xml沒有
指定,就使用默認(rèn)的值,這是第一個(gè)重要步驟。第二步填充ActionFrom,struts框架構(gòu)建于“Action-Form”模式上
所以這一步非常重要,也是難點(diǎn)。首先根據(jù)配置文件,利用反射的Class.forName方法查找匹配的類,如果存在則填充,
不存在則拋出異常。提取頁面所有參數(shù)名(request.getParameterNames()--Enumeration),接著把參數(shù)名與bean
中的屬性名進(jìn)行匹配,若匹配把取出的值填充到bean中(使用BeanUtils技術(shù))保存form對象。如果使用ActionForm
的子類DynaActionForm,則是走另一套類似的方法,只不過不需要使用反射,而是直接對比配置文件的配置屬性和
所配置數(shù)據(jù)類型是否一致。一致就構(gòu)建進(jìn)一個(gè)內(nèi)致的formbean對象。然后需要借助Action后端控制器進(jìn)行操作默認(rèn)會
調(diào)用對應(yīng)的action的execute方法(前提:action沒有繼承自DispatchAction之類的特殊Action控制器子類的話)。最終
接收返回的ActionForward,派發(fā)請求并查找響應(yīng)。
????????????????????????????????????????????????????????????????????????????????--------------------------這就是神秘的ActionServlet。
2.Action(后端控制器)
主要包含execute方法,還有其他加起來多達(dá)21種可覆寫方法。當(dāng)然這也就體現(xiàn)出了struts框架的完善度。如果我們自己想要在
不看源碼的情況下實(shí)現(xiàn)這個(gè)控制器,我覺得需要挑戰(zhàn)一下自己的能力。這里不過多的敘述了。
3.ActionFrom
包含方法:Reset、validate.....9種可覆寫方法。實(shí)現(xiàn)諸如校驗(yàn)、重置的功能。
4.ActionMapping
這是action的控制方法都要傳的一個(gè)重要參數(shù)對象,包含屬性:path,name,type,validate,HashMap:forwards....
5.ActionForward
這是action的控制方法都要返回的一個(gè)參數(shù)對象,包含屬性:name,path,redirect....
??????????????????????????????????????????????????????????????????????????????---------------------------以上就是struts的核心類。
?struts的插件實(shí)現(xiàn)是給了一個(gè)Plugin接口,其中有兩個(gè)接口方法來實(shí)現(xiàn)的。說白了就是在struts啟動的時(shí)候,會加載
插件的初始化方法或者配置文件。
?當(dāng)然除了上述的主要核心內(nèi)容外struts也要實(shí)現(xiàn)許多其他的功能類,來實(shí)現(xiàn)國際化,模塊異常,鏈?zhǔn)浇Y(jié)構(gòu),頁面標(biāo)簽處理,
可視化結(jié)構(gòu),以及一些我所沒有用到的功能。這些源代碼沒有研究,目前資歷尚淺,有待今后研究。
總結(jié):
不要因?yàn)楝F(xiàn)在有了struts2,JSF,甚至更新的JavaFX技術(shù),就不去學(xué)好老框架,每個(gè)框架都有它的智慧所在。況且掌握
一個(gè)框架又不難,所以更沒有理由拒絕。
?本文轉(zhuǎn)自施楊博客園博客,原文鏈接:http://www.cnblogs.com/shiyangxt/archive/2009/02/07/1385956.html,如需轉(zhuǎn)載請自行聯(lián)系原作者
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的Struts框架原理分析之我见的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内存映射MMAP和DMA【转】
- 下一篇: 参加51CTO组织的2013云计算架构师