本發(fā)明屬于軟件工程計(jì)算機(jī)算法技術(shù)領(lǐng)域,具體涉及一種基于注解的Web應(yīng)用代碼生成方法。
背景技術(shù):
現(xiàn)有技術(shù)的方案主要從以下幾個(gè)方面闡述:
一般的,軟件開發(fā)過程包括:需求分析、概要設(shè)計(jì)、系統(tǒng)詳細(xì)設(shè)計(jì)、編碼、單元測試、集成測試等步驟。其中數(shù)據(jù)庫表設(shè)計(jì)是系統(tǒng)概要設(shè)計(jì)的一部分工作。
現(xiàn)有技術(shù)的通常代碼生成器,通常著眼于替代程序員“編碼”的工具?!熬幋a”僅僅是軟件開發(fā)過程的一個(gè)組成部分,并且編碼工作必須依賴于前期需求分析、概要設(shè)計(jì)、系統(tǒng)詳細(xì)設(shè)計(jì)的工作成果?,F(xiàn)有的技術(shù)方案,《Web應(yīng)用代碼生成系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)》文獻(xiàn)1,需要分別對(duì)控制器、視圖、模型層進(jìn)行配置,可以認(rèn)為是基于模塊的“詳細(xì)設(shè)計(jì)”進(jìn)行的。另外《基于J2EE的Web應(yīng)用開發(fā)平臺(tái)代碼生成器設(shè)計(jì)與實(shí)現(xiàn)》的文獻(xiàn)2,則是基于“數(shù)據(jù)庫表設(shè)計(jì)”進(jìn)行的。
《Web應(yīng)用代碼生成系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)》文獻(xiàn)1的技術(shù)方案,使用XML文件分別對(duì)所要生成的源代碼各個(gè)層次進(jìn)行配置。如圖1(從文檔中截圖)所示,“欄目”的模塊分別對(duì)模型層、控制層、視圖層等的代碼進(jìn)行配置。由于需要分別對(duì)各個(gè)層次的代碼進(jìn)行配置,實(shí)際上必須在《詳細(xì)設(shè)計(jì)》文檔完成后,根據(jù)詳細(xì)設(shè)計(jì)才能進(jìn)行。這種方法的主要缺點(diǎn)有:(1)對(duì)于單個(gè)業(yè)務(wù)模塊來說,需要分為控制層、視圖層、模型層分別配置,每個(gè)層都需要配置其特定信息,例如控制層需要配置其視圖的鏈接、執(zhí)行的SQL操作等;模型層則需要配置屬性的名稱、類型;視圖層也需要對(duì)JSP文件的名稱、類型等進(jìn)行配置,非常繁雜。(2)由于其配置的思想是基于單個(gè)模塊進(jìn)行分層次的XML配置,各層次的配置均無法指向其他的業(yè)務(wù)模塊。而實(shí)際上,任何一個(gè)Web應(yīng)用的模塊都與其他業(yè)務(wù)對(duì)象之間存在關(guān)聯(lián),例如,某系統(tǒng)的員工管理模塊,新增、刪除、修改員工時(shí),必然需要指定該員工的所屬部門,可能采用下拉框或樹型結(jié)構(gòu)等方式供用戶選擇。《Web應(yīng)用代碼生成系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)》文獻(xiàn)1中所指的XML方式中,就無法生成與部門下拉框等相關(guān)的代碼(因?yàn)闊o法正確引用到另外一個(gè)業(yè)務(wù)模塊“部門管理”的相關(guān)內(nèi)容)。
目前《基于J2EE的Web應(yīng)用開發(fā)平臺(tái)代碼生成器設(shè)計(jì)與實(shí)現(xiàn)》文獻(xiàn)2的技術(shù)方案,使用9張數(shù)據(jù)庫表分別對(duì)所要生成的業(yè)務(wù)模塊對(duì)應(yīng)的數(shù)據(jù)實(shí)體進(jìn)行配置,從圖2可以看出,9張配置表圍繞著業(yè)務(wù)模塊對(duì)應(yīng)的數(shù)據(jù)庫表實(shí)體進(jìn)行配置,所利用的是數(shù)據(jù)庫設(shè)計(jì)輸出的表結(jié)構(gòu)(包括主外鍵關(guān)系)、系統(tǒng)編碼等信息。數(shù)據(jù)庫設(shè)計(jì)屬于系統(tǒng)概要設(shè)計(jì)的數(shù)據(jù)模型部分,比較能夠真實(shí)反映源代碼中偏底層的部分(尤其是DAO層代碼)。但數(shù)據(jù)庫設(shè)計(jì)畢竟不能替代系統(tǒng)的整體設(shè)計(jì),基于數(shù)據(jù)庫設(shè)計(jì)的觀念,所生成的代碼將嚴(yán)重依賴于數(shù)據(jù)庫的底層增刪改查功能,而不具備對(duì)業(yè)務(wù)層、控制層的表述能力?!痘贘2EE的Web應(yīng)用開發(fā)平臺(tái)代碼生成器設(shè)計(jì)與實(shí)現(xiàn)》的文獻(xiàn)所采用的數(shù)據(jù)庫方式,其主要缺點(diǎn)為:(1)需要9張數(shù)據(jù)表用于配置,分別用于保存實(shí)體信息、實(shí)體項(xiàng)信息、實(shí)體外鍵信息、實(shí)體統(tǒng)計(jì)圖、實(shí)體個(gè)性化信息、實(shí)體統(tǒng)計(jì)圖個(gè)性化信息、系統(tǒng)編碼、編碼明細(xì)等9項(xiàng)配置。需要的配置信息繁雜,且非常瑣碎,把原本整體的模塊概念,分為9個(gè)不同的角度理解,并用數(shù)據(jù)庫表描述其配置信息,人為增加了復(fù)雜度;(2)系統(tǒng)設(shè)計(jì)基于數(shù)據(jù)實(shí)體的層面,考慮的層級(jí)較低。我們知道,無論是結(jié)構(gòu)化設(shè)計(jì)還是面向?qū)ο笤O(shè)計(jì),都是自頂向下設(shè)計(jì)。即從用戶需求出發(fā),自頂向下設(shè)計(jì)。數(shù)據(jù)庫表結(jié)構(gòu)是系統(tǒng)分析設(shè)計(jì)的結(jié)果,以數(shù)據(jù)實(shí)體作為配置的基礎(chǔ),將使得系統(tǒng)只具備單個(gè)數(shù)據(jù)庫表的增刪改查功能,而不具備處理更為復(fù)雜的業(yè)務(wù)模塊生成能力。例如,一個(gè)員工查詢的頁面,是否需要以該員工所屬部門作為查詢條件?這樣的配置信息與數(shù)據(jù)庫表結(jié)構(gòu)無關(guān),純粹屬于頁面展現(xiàn)的配置,在現(xiàn)有所指的技術(shù)方案中就無法實(shí)現(xiàn)配置。
基于上述1和2文獻(xiàn)的描述中,《Web應(yīng)用代碼生成系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)》文獻(xiàn)1的技術(shù)方案是基于單個(gè)業(yè)務(wù)對(duì)象(例如員工)的XML配置生成多個(gè)層次(控制器、視圖、模型等)的代碼;《基于J2EE的Web應(yīng)用開發(fā)平臺(tái)代碼生成器設(shè)計(jì)與實(shí)現(xiàn)》文獻(xiàn)2的技術(shù)方案是基于單個(gè)實(shí)體的9個(gè)配置表配置進(jìn)行生成。而實(shí)際的業(yè)務(wù)場景遠(yuǎn)比此復(fù)雜(例如員工的增刪改查必然涉及到該員工所屬部門的表結(jié)構(gòu)和界面展現(xiàn))。因此,上述兩種方案所生成的代碼不具備立即編譯執(zhí)行的可能性,而需要人工添加各業(yè)務(wù)對(duì)象或各實(shí)體之間的關(guān)系代碼,并在大量添加代碼后,再進(jìn)行編譯調(diào)試。事實(shí)上,在大量添加各業(yè)務(wù)對(duì)象關(guān)系代碼的同時(shí),將引入很多錯(cuò)誤,生成器對(duì)于軟件工程過程所起到的效用有限。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明要解決的技術(shù)問題是:為了克服上述中存在的問題,提供了一種基于注解的Web應(yīng)用代碼生成方法,該方法以面向?qū)ο蠓治鲈O(shè)計(jì)(OOAD)技術(shù)為基礎(chǔ),基于面向?qū)ο蠓治龅墓ぷ鞒晒胺治鲱悺?,并以注解方式描述分析類及分析類之間的關(guān)聯(lián)關(guān)系,并將面向?qū)ο蠓治?OOA)所建立的分析類模型,轉(zhuǎn)化為Web應(yīng)用的源代碼(例如Java及JSP代碼),并自動(dòng)編譯通過、發(fā)布執(zhí)行。
本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案是:一種基于注解的Web應(yīng)用代碼生成方法,其特征是,包括如下步驟:
S1:運(yùn)行Ant,并啟動(dòng)代碼生成技術(shù);
S2:代碼生成技術(shù)調(diào)用本業(yè)務(wù)對(duì)應(yīng)的分析類的注解讀取方法;
S3:在讀取本業(yè)務(wù)的分析類屬性的注解時(shí),需要讀取相關(guān)分析類的注解內(nèi)容,比如在一個(gè)對(duì)象模型中,一個(gè)分析類總是與其他分析類存在相互關(guān)聯(lián),例如在一個(gè)房屋管理系統(tǒng)中,分析類房屋(House)的一個(gè)屬性“所屬樓棟”就會(huì)關(guān)聯(lián)到分析類樓棟(Building);
S4:相關(guān)的分析類將注解內(nèi)容轉(zhuǎn)化為Map<String,Object>格式的數(shù)據(jù)對(duì)象,返回給本業(yè)務(wù)模塊的分析類;
S5:本業(yè)務(wù)模塊的分析類將所有注解描述的內(nèi)容轉(zhuǎn)化為Map<String,Object>格式的數(shù)據(jù)對(duì)象,并返回給代碼生成技術(shù);
S6:代碼生成技術(shù)將從注解中獲得的業(yè)務(wù)描述信息發(fā)送給Freemarker模板引擎;
S7:Freemarker模板引擎依次調(diào)用各個(gè)源代碼模板,與輸入的數(shù)據(jù)生成源代碼,源代碼包括Java、JSP、sql腳本等;
S8:Ant啟動(dòng)目標(biāo)代碼編譯任務(wù);
S9:代碼編譯任務(wù)對(duì)上述生成的源代碼進(jìn)行編譯、復(fù)制、生成jar包或war包;
S10:Ant啟動(dòng)Jetty任務(wù),發(fā)布Web應(yīng)用。
所述的Ant是一個(gè)將軟件編譯、測試、部署等步驟聯(lián)系在一起加以自動(dòng)化的一個(gè)工具,大多用于Java環(huán)境中的軟件開發(fā)。由Apache軟件基金會(huì)所提供。Ant與linux系統(tǒng)下的make功能相似,且具有跨平臺(tái)、操作簡便、擴(kuò)展方便等優(yōu)點(diǎn)。Ant可以便利地執(zhí)行編譯、啟動(dòng)Java程序(例如Jetty)、文件管理等固有任務(wù),也可以通過Java語言開發(fā)自定義任意以實(shí)現(xiàn)特定的功能。
所述的代碼生成技術(shù)是將已有軟件的各種有關(guān)知識(shí)用于建立新的軟件,以縮減軟件開發(fā)和維護(hù)的花費(fèi)的一種技術(shù),在web應(yīng)用開發(fā)領(lǐng)域,編碼和與編碼密切相關(guān)的詳細(xì)設(shè)計(jì)、單元測試環(huán)節(jié)占據(jù)了大部分工期和工時(shí)。代碼生成技術(shù)將本企業(yè)在web應(yīng)用開發(fā)領(lǐng)域的相關(guān)技術(shù)、經(jīng)驗(yàn)、知識(shí),以“代碼生成器”模板的方式進(jìn)行固化,并配合適當(dāng)?shù)摹芭渲眯畔ⅰ鄙纱a,達(dá)到軟件復(fù)用的目標(biāo)。常用的配置信息表達(dá)方式主要由:XML、JSON。代碼生成技術(shù)是軟件復(fù)用方法的一個(gè)特例,軟件復(fù)用對(duì)于提高軟件生產(chǎn)力和質(zhì)量非常重要。在web應(yīng)用開發(fā)領(lǐng)域,復(fù)用本公司以往的類似產(chǎn)品的部分模塊,已經(jīng)成為一種比較常見的做法。但是,由于業(yè)務(wù)領(lǐng)域的巨大差異,即使在一個(gè)企業(yè)的范圍之內(nèi),往往也只能對(duì)組織結(jié)構(gòu)管理、用戶管理、角色權(quán)限管理等少數(shù)公共功能模塊進(jìn)行復(fù)用。而更大范圍內(nèi)大量業(yè)務(wù)模塊就不具備復(fù)用價(jià)值。
所述的注解是現(xiàn)代編程語言在代碼級(jí)別的說明,聲明在類、屬性、方法、局部變量、方法參數(shù)等的前面,用來對(duì)這些元素進(jìn)行說明。注解(Annotation)的特點(diǎn)在于保存在編譯后的類文件(.class)中,程序運(yùn)行時(shí)使用反射(Reflect)機(jī)制獲取注解(Annotation),以得到指定的類、屬性、方法、參數(shù)、局部變量、方法參數(shù)等的額外信息。
所述的分析類是采用面向?qū)ο蠓治鏊@得的類模型。
所述的面向?qū)ο蠓治鍪窃诒容^明確的用戶需求基礎(chǔ)上,通過對(duì)問題空間的分析,把問題分解為一些對(duì)象與類,并找出這些對(duì)象的屬性與服務(wù),以及對(duì)象之間的關(guān)系,并以此建立以對(duì)象為單元的信息系統(tǒng)邏輯模型。
所述的Freemarker模板引擎是一種基于模板和要改變的數(shù)據(jù),并用來生成輸出文本格式的各類文件等的通用工具。由于Web應(yīng)用軟件的源代碼Java、JSP、JavaScript等均為文本格式,因此可用Freemarker模板引擎結(jié)合適當(dāng)?shù)淖远x模板創(chuàng)建。
本發(fā)明的有益效果是:所述的一種基于注解的Web應(yīng)用代碼生成方法,該方法基于軟件工程過程初級(jí)階段(OOA)的成果,抽象級(jí)別較高;生成的目標(biāo)代碼已經(jīng)包含分析類之間的關(guān)系;且能夠編譯通過并已經(jīng)能正常運(yùn)行,因此能大幅度縮減編碼過程及與之相關(guān)的詳細(xì)設(shè)計(jì)及單元測試時(shí)間,以達(dá)到大幅度提升軟件工程生產(chǎn)率和產(chǎn)品質(zhì)量的目標(biāo),具體優(yōu)點(diǎn)如下:
1、基于面向?qū)ο蠓治?OOA)的工作成果分析類,在項(xiàng)目早期即可進(jìn)行代碼生成;
2、采用基于注解描述作為配置的方式,比XML與數(shù)據(jù)庫表配置更便利;
3、基于上述步驟,生成的代碼可自動(dòng)編譯通過,并可啟動(dòng)運(yùn)行,在項(xiàng)目早期可反復(fù)調(diào)整原型,并重新生成;
4、采用bootstrap等通用第三方組件技術(shù),界面代碼標(biāo)準(zhǔn)美觀、便于修改。
附圖說明
下面結(jié)合附圖和實(shí)施例對(duì)本發(fā)明進(jìn)一步說明。
圖1是《Web應(yīng)用代碼生成系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)》文獻(xiàn)1中摘抄的編程代碼;
圖2是《基于J2EE的Web應(yīng)用開發(fā)平臺(tái)代碼生成器設(shè)計(jì)與實(shí)現(xiàn)》文獻(xiàn)2中所描述的圖;
圖3是本發(fā)明的一種基于注解的Web應(yīng)用代碼生成方法的實(shí)施例時(shí)序圖;
圖4是本發(fā)明的一種基于注解的Web應(yīng)用代碼生成方法的實(shí)施例實(shí)際代碼生成結(jié)果圖;
圖5是本發(fā)明的一種基于注解的Web應(yīng)用代碼生成方法的實(shí)施例實(shí)際代碼生成另一結(jié)果圖;
具體實(shí)施方式
現(xiàn)在結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步詳細(xì)的說明。這些附圖均為簡化的示意圖,僅以示意方式說明本發(fā)明的基本結(jié)構(gòu),因此其僅顯示與本發(fā)明有關(guān)的構(gòu)成。
如圖3所示的一種基于注解的Web應(yīng)用代碼生成方法,包括如下步驟:
S1:運(yùn)行Ant,并啟動(dòng)代碼生成技術(shù),Ant是一個(gè)將軟件編譯、測試、部署等步驟聯(lián)系在一起加以自動(dòng)化的一個(gè)工具,大多用于Java環(huán)境中的軟件開發(fā);
S2:代碼生成技術(shù)調(diào)用本業(yè)務(wù)對(duì)應(yīng)的分析類的注解讀取方法,代碼生成技術(shù)是將已有軟件的各種有關(guān)知識(shí)用于建立新的軟件,以縮減軟件開發(fā)和維護(hù)的花費(fèi)的一種技術(shù);
S3:在讀取本業(yè)務(wù)的分析類屬性的注解時(shí),需要讀取相關(guān)分析類的注解內(nèi)容,注解是現(xiàn)代編程語言在代碼級(jí)別的說明;
S4:相關(guān)的分析類將注解內(nèi)容轉(zhuǎn)化為Map<String,Object>格式的數(shù)據(jù)對(duì)象,返回給本業(yè)務(wù)模塊的分析類,分析類是采用面向?qū)ο蠓治鏊@得的類模型,面向?qū)ο蠓治鍪窃诒容^明確的用戶需求基礎(chǔ)上,通過對(duì)問題空間的分析,把問題分解為一些對(duì)象與類,并找出這些對(duì)象的屬性與服務(wù),以及對(duì)象之間的關(guān)系,并以此建立以對(duì)象為單元的信息系統(tǒng)邏輯模型;
S5:本業(yè)務(wù)模塊的分析類將所有注解描述的內(nèi)容轉(zhuǎn)化為Map<String,Object>格式的數(shù)據(jù)對(duì)象,并返回給代碼生成技術(shù);
S6:代碼生成技術(shù)將從注解中獲得的業(yè)務(wù)描述信息發(fā)送給Freemarker模板引擎,F(xiàn)reemarker模板引擎是一種基于模板和要改變的數(shù)據(jù),并用來生成輸出文本格式的各類文件等的通用工具;
S7:Freemarker模板引擎依次調(diào)用各個(gè)源代碼模板,與輸入的數(shù)據(jù)生成源代碼;
S8:Ant啟動(dòng)目標(biāo)代碼編譯任務(wù);
S9:代碼編譯任務(wù)對(duì)上述生成的源代碼進(jìn)行編譯、復(fù)制、生成jar包或war包;
S10:Ant啟動(dòng)Jetty任務(wù),發(fā)布Web應(yīng)用。
經(jīng)過以上S1-S10的步驟,完成了從代碼生成、編譯、啟動(dòng)Web服務(wù)器(Jetty)等一系列工作。
第一、分析類采用面向?qū)ο蠓治龅墓ぷ鞒晒?,本方法基于軟件工程過程初級(jí)階段(OOA)的工作成果,這使得配置的基礎(chǔ)具有較高的抽象性,這就確保了代碼生成的配置在最大程度上擬合了目標(biāo)系統(tǒng)。而現(xiàn)有技術(shù)通常是基于數(shù)據(jù)庫表這樣的低層次抽象,或者是對(duì)目標(biāo)代碼的各層次(控制器、模型、視圖等)分別做抽象;
第二、基于“注解”(Annotation)描述風(fēng)格,使用XML或數(shù)據(jù)庫配置,都存在配置數(shù)據(jù)過多或過于分散的問題,且難以表示各個(gè)業(yè)務(wù)模塊之間的相關(guān)性;
第三、生成的代碼不但包含了本模塊的特性,還能夠正確引用相關(guān)的模塊特性。例如,在生成的員工管理模塊的新增員工功能中,生成的代碼可以對(duì)該員工選擇適當(dāng)?shù)乃鶎俨块T。而其他現(xiàn)有方法通常只能對(duì)本業(yè)務(wù)模塊、本業(yè)務(wù)實(shí)體進(jìn)行描述,而難以關(guān)聯(lián)到相關(guān)的業(yè)務(wù)模塊?;凇白⒔狻泵枋鰰r(shí),用注解的Java類描述“分析類”,不但可以描述本業(yè)務(wù)模塊的特性,還可以通過屬性引用到相關(guān)的“分析類”,這些被引用的分析類同樣是注解描述風(fēng)格的。
基于以上第三點(diǎn),由于生成的代碼已經(jīng)能夠正確本模塊及相關(guān)聯(lián)的業(yè)務(wù)模塊屬性,該代碼質(zhì)量很高,與最終程序員所需要的目標(biāo)代碼已經(jīng)非常接近。一般的,只需要對(duì)生成的頁面適當(dāng)排版即可。
實(shí)施例:
本發(fā)明的一種基于注解的Web應(yīng)用代碼生成方法,進(jìn)一步對(duì)生成的代碼進(jìn)行自動(dòng)編譯、發(fā)布執(zhí)行;如果前期在模塊關(guān)系中配置有誤,在自動(dòng)編譯、發(fā)布的過程中將自動(dòng)檢查出來,例如圖4所示,代碼生成“樓棟管理”,“樓棟管理”頁面已經(jīng)完全可用,無需修改,自動(dòng)編譯部署后查詢結(jié)果正確。如圖5所示,“更改樓棟”頁面同樣也自動(dòng)編譯部署正確,并且相關(guān)的樓棟類型、省份、市、縣等均能顯示其名稱。
以上述依據(jù)本發(fā)明的理想實(shí)施例為啟示,通過上述的說明內(nèi)容,相關(guān)工作人員完全可以在不偏離本項(xiàng)發(fā)明技術(shù)思想的范圍內(nèi),進(jìn)行多樣的變更以及修改。本項(xiàng)發(fā)明的技術(shù)性范圍并不局限于說明書上的內(nèi)容,必須要根據(jù)權(quán)利要求范圍來確定其技術(shù)性范圍。