samtiger


          QQ:418148757
          Name:yangchuan
          數(shù)據(jù)加載中……
          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)該說好是非常簡潔的。比如我的一個簡單存儲。就如下簡單:
                    

          @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)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 焉耆| 民和| 谷城县| 新闻| 遂昌县| 长武县| 关岭| 青河县| 乌什县| 和静县| 徐水县| 靖州| 双牌县| 新密市| 滦平县| 泸水县| 安溪县| 邯郸市| 广州市| 托里县| 宜城市| 柯坪县| 永修县| 岐山县| 通化市| 谷城县| 尉犁县| 乌拉特中旗| 吴旗县| 木里| 屏边| 南城县| 平舆县| 清远市| 阳西县| 庄浪县| 巫山县| 高要市| 巢湖市| 敖汉旗| 荥经县|