DIY mvc框架
一直都很猶豫,自己寫的東西羞于拿出手來,羞于見世面,主要是覺得,東西太簡單,代碼太丑陋,功能太少。但一直卻又有那么一點(diǎn)點(diǎn)沖動,想找個地方說道說道。就好象自己的孩子再不好,也希望碰面了介紹一下,這是我的娃,男娃。
起因:08年7月有幸外包到了H公司在L市的bi項(xiàng)目組,更有幸的是,我做了我喜歡的前臺編碼工作。可是,等我開始正式工作的時候,我才發(fā)現(xiàn)我接下來的工作的痛苦。這是一個老系統(tǒng),利用的是struts+spring+hibernate經(jīng)典框架,應(yīng)該說這個東西還是很不錯的。就是太麻煩了,我們每次修改一個功能或添加一個功能,至少都要接觸到4到6個配置文件,其中業(yè)務(wù)層的bean需要spring配置兩個:為本模塊加一bean配置,然后又要將這個配置文件的信息包含到一個總的配置文件里。orm持久層的配置:實(shí)體bean需要一個配置,(該系統(tǒng)是利用配置文件讀取實(shí)體bean的配置文件的),所以也要將這個配置文件包含到另一個文件里。mvc配置文件,該模塊需要一個配置文件,當(dāng)然還需要在web.xml里包含這個配置文件。
另外還有一點(diǎn),就是struts1有個缺點(diǎn)就是一個action類配置一個actionForm,要不就是用動態(tài)的,要不就是繼承它的actionform。這樣其實(shí)很麻煩,比如我有一個增刪查改的頁面,我就放到一個action類里去處理,其實(shí)在這個類里,我有不同的表單,比如,查詢表單,實(shí)體表單。針對不同的方法,傳入不同的表單對象。還有就是對于以簡單的增加刪除,很希望,不多做任何事情,直接從頁面表單一步就到數(shù)據(jù)庫了。struts1倒是能解決這個問題,但是始終是要多寫一個actionform類,還要去配置他。總覺得麻煩。
綜上所述:其實(shí)我想解決配置文件多和繁瑣的問題,另外就是希望mvc框架提供同一個action可以傳入不同的表單實(shí)體,同一個action方法可以接受多個不同的表單實(shí)體。
我的愚思: 我是這么想的,我覺得,解決配置文件的問題,完全可以利用注解來配置,我們的業(yè)務(wù)層,持久層完全可以利用注解來解決,甚至我們的mvc其實(shí)也可以利用注解來解決。業(yè)務(wù)層,持久層就不說了,spring+hibernate早就這么干了。至于mvc,其實(shí)流行框架也這么干了,不過我就是想DIY一把,利用spring強(qiáng)大的bean管理能力,mvc的action直接就放在spring里了,通過分析請求地址得到bean的名稱,從而知道調(diào)用哪一個action,分析請求中的特定參數(shù),來確定訪問action bean里對應(yīng)的方法。
詳細(xì): 整個框架因?yàn)樾。詢H需要一個filter就可以了,所有的請求都通過這個filter,在它里面我的主要工作就是分析請求地址,取出它里面含有.do的字串作為action bean的name,然后通過spring返回該action對象。通過取出action參數(shù)值,做為此次請求需要調(diào)用的action 方法。
在調(diào)用實(shí)際的action之前我們還需要做一個事情,那就是將提交上來的表單,分門別類的裝入到不同的javabean里(實(shí)體bean,或查詢bean),通過注解訪問上邊找到的action方法,找到該方法對應(yīng)的@actionForm注解,提取該方法需要的javabean,迭代出每一個bean的屬性名稱,以及屬性類型,并使用propertyManager所管理的不同類型的屬性編輯器將表單里對應(yīng)的數(shù)據(jù)轉(zhuǎn)化為屬性值存入到j(luò)avabean里。(當(dāng)然這里需要將表單里的html元素名稱與javabean里的屬性名稱一致)。最后一步,關(guān)于action方法的返回,我做了一個處理器。將返回的數(shù)據(jù)存入到map中,根據(jù)需要做不同的返回。
為了方便處理ajax返回,我也DIY了一個json處理器,將所有對象轉(zhuǎn)化成json字串,供前臺頁面調(diào)用。
個人體會: 這個框架有幾個好處,action 類,不用繼承任何類,看上去就是一個簡單的java類,方法不再依賴request,response對象,方便做單元測試。同一個方法可以傳入不同的javabean對象,可直接將持久層對象與表單數(shù)據(jù)綁定,不用多寫額外的actionForm對象。加上spring的注解功能
基本減少了80%的配置信息,而且不容易因?yàn)榕渲檬д`而出錯。方便做權(quán)限管理,通過請求,控制action,控制方法,只要分析請求,就可用權(quán)限管路業(yè)務(wù)。
我的一個案列:后來利用這個框架為客戶做了一個考核系統(tǒng)。整體代碼應(yīng)該說好是非常簡潔的。比如我的一個簡單存儲。就如下簡單:
起因:08年7月有幸外包到了H公司在L市的bi項(xiàng)目組,更有幸的是,我做了我喜歡的前臺編碼工作。可是,等我開始正式工作的時候,我才發(fā)現(xiàn)我接下來的工作的痛苦。這是一個老系統(tǒng),利用的是struts+spring+hibernate經(jīng)典框架,應(yīng)該說這個東西還是很不錯的。就是太麻煩了,我們每次修改一個功能或添加一個功能,至少都要接觸到4到6個配置文件,其中業(yè)務(wù)層的bean需要spring配置兩個:為本模塊加一bean配置,然后又要將這個配置文件的信息包含到一個總的配置文件里。orm持久層的配置:實(shí)體bean需要一個配置,(該系統(tǒng)是利用配置文件讀取實(shí)體bean的配置文件的),所以也要將這個配置文件包含到另一個文件里。mvc配置文件,該模塊需要一個配置文件,當(dāng)然還需要在web.xml里包含這個配置文件。
另外還有一點(diǎn),就是struts1有個缺點(diǎn)就是一個action類配置一個actionForm,要不就是用動態(tài)的,要不就是繼承它的actionform。這樣其實(shí)很麻煩,比如我有一個增刪查改的頁面,我就放到一個action類里去處理,其實(shí)在這個類里,我有不同的表單,比如,查詢表單,實(shí)體表單。針對不同的方法,傳入不同的表單對象。還有就是對于以簡單的增加刪除,很希望,不多做任何事情,直接從頁面表單一步就到數(shù)據(jù)庫了。struts1倒是能解決這個問題,但是始終是要多寫一個actionform類,還要去配置他。總覺得麻煩。
綜上所述:其實(shí)我想解決配置文件多和繁瑣的問題,另外就是希望mvc框架提供同一個action可以傳入不同的表單實(shí)體,同一個action方法可以接受多個不同的表單實(shí)體。
我的愚思: 我是這么想的,我覺得,解決配置文件的問題,完全可以利用注解來配置,我們的業(yè)務(wù)層,持久層完全可以利用注解來解決,甚至我們的mvc其實(shí)也可以利用注解來解決。業(yè)務(wù)層,持久層就不說了,spring+hibernate早就這么干了。至于mvc,其實(shí)流行框架也這么干了,不過我就是想DIY一把,利用spring強(qiáng)大的bean管理能力,mvc的action直接就放在spring里了,通過分析請求地址得到bean的名稱,從而知道調(diào)用哪一個action,分析請求中的特定參數(shù),來確定訪問action bean里對應(yīng)的方法。
詳細(xì): 整個框架因?yàn)樾。詢H需要一個filter就可以了,所有的請求都通過這個filter,在它里面我的主要工作就是分析請求地址,取出它里面含有.do的字串作為action bean的name,然后通過spring返回該action對象。通過取出action參數(shù)值,做為此次請求需要調(diào)用的action 方法。
在調(diào)用實(shí)際的action之前我們還需要做一個事情,那就是將提交上來的表單,分門別類的裝入到不同的javabean里(實(shí)體bean,或查詢bean),通過注解訪問上邊找到的action方法,找到該方法對應(yīng)的@actionForm注解,提取該方法需要的javabean,迭代出每一個bean的屬性名稱,以及屬性類型,并使用propertyManager所管理的不同類型的屬性編輯器將表單里對應(yīng)的數(shù)據(jù)轉(zhuǎn)化為屬性值存入到j(luò)avabean里。(當(dāng)然這里需要將表單里的html元素名稱與javabean里的屬性名稱一致)。最后一步,關(guān)于action方法的返回,我做了一個處理器。將返回的數(shù)據(jù)存入到map中,根據(jù)需要做不同的返回。
為了方便處理ajax返回,我也DIY了一個json處理器,將所有對象轉(zhuǎn)化成json字串,供前臺頁面調(diào)用。
個人體會: 這個框架有幾個好處,action 類,不用繼承任何類,看上去就是一個簡單的java類,方法不再依賴request,response對象,方便做單元測試。同一個方法可以傳入不同的javabean對象,可直接將持久層對象與表單數(shù)據(jù)綁定,不用多寫額外的actionForm對象。加上spring的注解功能
基本減少了80%的配置信息,而且不容易因?yàn)榕渲檬д`而出錯。方便做權(quán)限管理,通過請求,控制action,控制方法,只要分析請求,就可用權(quán)限管路業(yè)務(wù)。
我的一個案列:后來利用這個框架為客戶做了一個考核系統(tǒng)。整體代碼應(yīng)該說好是非常簡潔的。比如我的一個簡單存儲。就如下簡單:
@Component("/targetAction")
public class TargetAction {
@Autowired()
@Qualifier("targetService")
private ItargetService itargetService;
@ActionForm(TblBsTargetInfo.class)
public Object add(Object form, HttpServletRequest request,
HttpServletResponse response) {
itargetService.saveTarget((TblBsTargetInfo) form);
return new JsonResultHandler(“ok”);
}
posted on 2009-03-15 11:32 sam.chuan.yang 閱讀(312) 評論(0) 編輯 收藏