一直都很猶豫,自己寫的東西羞于拿出手來,羞于見世面,主要是覺得,東西太簡單,代碼太丑陋,功能太少。但一直卻又有那么一點點沖動,想找個地方說道說道。就好象自己的孩子再不好,也希望碰面了介紹一下,這是我的娃,男娃。
起因:08年7月有幸外包到了H公司在L市的bi項目組,更有幸的是,我做了我喜歡的前臺編碼工作。可是,等我開始正式工作的時候,我才發現我接下來的工作的痛苦。這是一個老系統,利用的是struts+spring+hibernate經典框架,應該說這個東西還是很不錯的。就是太麻煩了,我們每次修改一個功能或添加一個功能,至少都要接觸到4到6個配置文件,其中業務層的bean需要spring配置兩個:為本模塊加一bean配置,然后又要將這個配置文件的信息包含到一個總的配置文件里。orm持久層的配置:實體bean需要一個配置,(該系統是利用配置文件讀取實體bean的配置文件的),所以也要將這個配置文件包含到另一個文件里。mvc配置文件,該模塊需要一個配置文件,當然還需要在web.xml里包含這個配置文件。
另外還有一點,就是struts1有個缺點就是一個action類配置一個actionForm,要不就是用動態的,要不就是繼承它的actionform。這樣其實很麻煩,比如我有一個增刪查改的頁面,我就放到一個action類里去處理,其實在這個類里,我有不同的表單,比如,查詢表單,實體表單。針對不同的方法,傳入不同的表單對象。還有就是對于以簡單的增加刪除,很希望,不多做任何事情,直接從頁面表單一步就到數據庫了。struts1倒是能解決這個問題,但是始終是要多寫一個actionform類,還要去配置他。總覺得麻煩。
綜上所述:其實我想解決配置文件多和繁瑣的問題,另外就是希望mvc框架提供同一個action可以傳入不同的表單實體,同一個action方法可以接受多個不同的表單實體。
我的愚思: 我是這么想的,我覺得,解決配置文件的問題,完全可以利用注解來配置,我們的業務層,持久層完全可以利用注解來解決,甚至我們的mvc其實也可以利用注解來解決。業務層,持久層就不說了,spring+hibernate早就這么干了。至于mvc,其實流行框架也這么干了,不過我就是想DIY一把,利用spring強大的bean管理能力,mvc的action直接就放在spring里了,通過分析請求地址得到bean的名稱,從而知道調用哪一個action,分析請求中的特定參數,來確定訪問action bean里對應的方法。
詳細: 整個框架因為小,所以僅需要一個filter就可以了,所有的請求都通過這個filter,在它里面我的主要工作就是分析請求地址,取出它里面含有.do的字串作為action bean的name,然后通過spring返回該action對象。通過取出action參數值,做為此次請求需要調用的action 方法。
在調用實際的action之前我們還需要做一個事情,那就是將提交上來的表單,分門別類的裝入到不同的javabean里(實體bean,或查詢bean),通過注解訪問上邊找到的action方法,找到該方法對應的@actionForm注解,提取該方法需要的javabean,迭代出每一個bean的屬性名稱,以及屬性類型,并使用propertyManager所管理的不同類型的屬性編輯器將表單里對應的數據轉化為屬性值存入到javabean里。(當然這里需要將表單里的html元素名稱與javabean里的屬性名稱一致)。最后一步,關于action方法的返回,我做了一個處理器。將返回的數據存入到map中,根據需要做不同的返回。
為了方便處理ajax返回,我也DIY了一個json處理器,將所有對象轉化成json字串,供前臺頁面調用。
個人體會: 這個框架有幾個好處,action 類,不用繼承任何類,看上去就是一個簡單的java類,方法不再依賴request,response對象,方便做單元測試。同一個方法可以傳入不同的javabean對象,可直接將持久層對象與表單數據綁定,不用多寫額外的actionForm對象。加上spring的注解功能
基本減少了80%的配置信息,而且不容易因為配置失誤而出錯。方便做權限管理,通過請求,控制action,控制方法,只要分析請求,就可用權限管路業務。
我的一個案列:后來利用這個框架為客戶做了一個考核系統。整體代碼應該說好是非常簡潔的。比如我的一個簡單存儲。就如下簡單:
@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”);
}