希望這篇文章能夠?qū)δ切┱诨蚣磳㈤_發(fā)自己團隊的J2EE應(yīng)用快速開發(fā)平臺的個人或公司能有所啟發(fā)! 像EOS這樣動輒幾十上百萬的平臺不是每個公司都愿意花錢去買的!因此構(gòu)建一套窮人級的企業(yè)快速開發(fā)平臺成了很多團隊的首選,而對于小團隊來說,構(gòu)建一套自己可以維護的開發(fā)平臺才是最重要的。下面,我將以我的平臺的開發(fā)過程為例來詳細解析這個過程! “如果能把項目中大量的代碼編寫工作變得輕松,是多好的一件事! " 在使用了AppFuse之后,我有個想法,能不能利用velocity這個優(yōu)秀的模板引擎,用一種更加直觀的模式,把開發(fā)項目中的重復(fù)代碼讓它自動生成,生成之后的基礎(chǔ)代碼,按照實際的需求稍作修改便可以運行,極大的提高工作效率。這樣的話,程序員就可以從大量的重復(fù)勞動中解放出來,將精力更多的投入到業(yè)務(wù)分析及學(xué)習(xí)中。 這個想法一直在我的腦海里橫亙不去,尤其在做了大量的重復(fù)模塊后,深刻體會了重復(fù)Coding的那種浪費生命的痛苦后,這種沖動尤為強烈。 離開舊公司,到了新公司之后,由于職位和公司定位的不同,讓我有時間開始把快速開發(fā)平臺和自動代碼生成器的開發(fā)真正的擺上開發(fā)日程上了。 第一步 ,自動代碼生成器生成的是業(yè)務(wù)模塊,那么底層必須有一套框架能夠為它提供支撐,而且這套基礎(chǔ)框架要足夠靈活,并且和單個模塊的耦合性要比較弱。要解耦模塊之間的聯(lián)系,勢必要用到MVC分層設(shè)計。感謝Java的開放性,使它有這么許許多多的MVC框架可以使用。我采用的當(dāng)然是目前最流行的 SSH(Struts+Spring+Hibernate)的組合(以前項目一直在用,也有些成熟的積累),花了三個月的時間,通過一個項目的實際應(yīng)用來使這個框架基本成型。其目前功能包括: 1:靈活完善的權(quán)限管理功能(包括用戶管理、角色管理、組織機構(gòu)管理、資源管理、資源角色映射管理...)。原來計劃采用開源的JGuard來托管這部分的功能,因為一些特殊的原因放棄了(考慮要和工作流引擎的權(quán)限部分做集成),只采用了其權(quán)限管理的一些設(shè)計思想。 2:基于Spring的AOP實現(xiàn)的日志和權(quán)限管理(通過Spring的代理也將Struts的Action托管了,使的對Action的調(diào)用也能被 AOP偵測到),這樣對每個功能的調(diào)用,如果需要日志紀錄的話,之間將其配置到Spring的配置文件中就可以了。 3:UI上實現(xiàn)了類似.NET的Validation驗證,這點很重要,想必大家都深刻體會到利用JavaScript或Struts的驗證機制來實現(xiàn)前端頁面數(shù)據(jù)驗證的痛苦了吧:),我們實現(xiàn)的功能如下圖所示:
4、多套UI風(fēng)格樣式。這個不是很必須,但是作為一套成功的系統(tǒng),良好的用戶體驗也是必不可少的。 5、支撐模塊:2套報表引擎(一個是基于JasperReport實現(xiàn)的B/S版本報表;另外一個是類Excel的報表引擎),流程引擎(其實就我個人來看,工作流引擎才是這套系統(tǒng)的靈魂 ,有了它,所有流程性應(yīng)用包括表單、業(yè)務(wù)流、權(quán)限都可以通過配置并結(jié)合Beanshell腳本來獲得 ,以下是我們報表和流程設(shè)計器的一些截圖: ![]()
工作流引擎截圖
報表截圖
6、i18n的支持,由于我們有很多國外的客戶,這塊是必須的。
有了這個基礎(chǔ)支撐平臺之后,就可以開始著手開放我們的代碼生成器了。 第二步 :開發(fā)代碼生成器。 AppFuse基于Ant的自動代碼生成模式讓我深惡痛絕,究其原因,一句話--“不夠人性化”,我們做的首先必須考慮可用性,因此決定采用可視化的UI 模式。由于我用的是NetBean編輯器,做可視化的Swing開發(fā)不成問題(這點要感謝SUN啊,出了個和VB一樣簡單的IDE)。我實現(xiàn)的代碼生成器的界面如下:
![]() ![]() ![]()
![]() 怎么樣?是不是夠傻瓜化啊?呵呵,是個人都能用??! 從上面大家可以看到,我們這個代碼生成器和Hibernate的POJO對象生成工具類似,也是基于數(shù)據(jù)庫的模型來生成代碼的,不同的是,我們生成的代碼范圍更廣,不僅包括了POJO對象暨相應(yīng)的hbm.xml文件,另外還包括相應(yīng)的DAO(Server層)、相應(yīng)的Action、Form類、相關(guān)的 JSP文件(list頁面、edit頁面、Excel導(dǎo)出頁面等等)、資源文件及相關(guān)的Struts和Spring的配置子文件(Struts和 Spring均支撐將配置拆分成多個配置,我們利用這種特性來減低模塊之間的耦合性。) 至于數(shù)據(jù)庫模型的獲得,可以利用JDBC的MetaData(元數(shù)據(jù)模型) 的功能來獲得,我們目前維護了表的完整的主鍵、外鍵關(guān)系(父子表) 第三步:配置模板。有了可視化的數(shù)據(jù)庫表映射模型,也獲得了數(shù)據(jù)庫表及其主外鍵關(guān)系的詳細信息,接下來當(dāng)然是根據(jù)這些信息來生成代碼了。這里我們用了強大的Velocity模板 技術(shù),這樣不僅可以靈活的處理復(fù)雜的表映射對象之間的關(guān)系,也能夠靈活的進行變更升級。而且我們能夠通過所獲得的數(shù)據(jù)庫模型,在頁面上自動實現(xiàn)基于Javascript的數(shù)據(jù)驗證“非空驗證、字符長度驗證、數(shù)字驗證,日期驗證”。 呵呵,通過以上3個步驟的工作,我們的基礎(chǔ)開發(fā)平臺和自動代碼生成器就大功告成了!目前我們生成的代碼可以直接編譯通過,通過簡單的系統(tǒng)配置后,可以直接在服務(wù)器上跑!由于模板種類多,而且模板中自動實現(xiàn)的代碼功能已經(jīng)非常完善了,所以一些特殊的業(yè)務(wù)需求只需要在自動生成的代碼基礎(chǔ)上做簡單修改就可以了! 基礎(chǔ)開發(fā)平臺和代碼生成器投入使用后,對我們項目開發(fā)的資源投入的改善是非常明細的,目前基于基礎(chǔ)平臺和代碼生成器的配合,我們已經(jīng)做了6、7個系統(tǒng)了,平均每個系統(tǒng)的開發(fā)時間至少要比以前節(jié)約40%,有的項目甚至達到了80%以上(我們最高的一天,處理了40多個表的增、刪、該、查的功能,及中文本地化)。而且,另外很重要的一點,生成的代碼無形中統(tǒng)一了程序員的設(shè)計風(fēng)格,我們通過這套開發(fā)機制,能夠最大限度的保證我們開發(fā)的系統(tǒng)質(zhì)量,保證模塊可以在不同系統(tǒng)之間的自由遷移,最大限度的實現(xiàn)復(fù)用!在項目開發(fā)中節(jié)省出來的大量時間,也讓我們可以去研究更多的開源中間件和系統(tǒng),來增強我們的基礎(chǔ)平臺,從而形成一個良性的循環(huán)! 我們做了多套模板,能夠針對單表操作,及父子表操作來自由組合搭配。以下就是我們系統(tǒng)的一些功能截圖,除了中文化之外,基本上沒有修改: 單表操作: ![]() ![]() 父子表關(guān)聯(lián)操作: ![]()
================================================================ 呵呵,這么長時間了,還有人關(guān)注這個帖子,謝謝大家的捧場了! |