摘要:在企業級應用開發中存在著項目開發周期長,開發效率低,不能快速響應需求變化等普遍問題。而代碼自動生成技術正是解決這些問題的有效途徑之一。SSH架構目前是企業級應用中最廣泛的J2EE架構之一,本文對基于該架構的代碼自動生成技術進行了探討,通過對開源框架AppFuse進行研究,提取出了其基于SSH架構的快速開發模塊,對該模塊進行了改進,進一步增強了其代碼自動生成能力,并將改進后的模塊應用于一權限管理系統的開發中進行了驗證。
關鍵詞:SSH架構;Appfuse;代碼自動生成
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)20-20272-03
Application Research on Automatic Code Generation Based on SSH Architecture
LI Jin-hai
(Modern Education Technology Center,Qingdao Technological University,Qingdao 266033,China)
Abstract:There are several common problems in the enterprise-ready application development, such as long project development life, low development efficiency, slow response to changing demands. Automatic code generation technology is the very one of effective ways to solve these problems. SSH architecture is one of the most widespread used J2EE architectures in the present. This paper discusses the automatic code generation technology which can be used in SSH architecture. Through the research on the Open Source framework Appfuse, this paper distracts its fast development module based on SSH architecture, improves the code generation ability of the module, and applies this improved module in the development of a privilege management system to have a check if it works well.
Key words:SSH Architecture;Appfuse;Automatic Code Generation
隨著企業信息化的發展,J2EE技術的應用已經日益廣泛。在J2EE體系架構中,基于各種開源框架的J2EE架構的應用逐漸成為主流。優秀的開源框架在J2EE中的應用在一定程度上也促進了企業級應用的發展。然而,在實際開發中仍然存在著項目開發周期長,開發效率低,不能快速響應需求變化等普遍問題。代碼生成技術的發展已逐漸成為解決上述問題的有效途徑之一。本文將對應用廣泛的SSH架構的代碼自動生成展開討論。
1 SSH架構
SSH架構就是一個基于三種開源框架Stuts,Hibernate和Spring的輕量級J2EE架構,目前已是企業級應用開發中應用最廣泛的J2EE架構之一。其架構層次主要劃分為:表現層,業務層,數據持久層和領域對象層。在表現層中應用了Struts框架,這種基于請求驅動的MVC框架給架構也帶來了清晰的MVC劃分。在業務層引入Spring,使用其提供的IoC容器對業務類進行裝配和管理,使類與類之間的耦合度降到最小,利用其提供的AOP框架對業務層中的事務進行聲明式管理。由于Spring對Hibernate提供了良好的支持,通過使用HibernateTemplate可以方便地對數據進行持久化操作。數據持久層正是由Spring和Hibernate共同打造的。其中DAO接口的裝配和管理也是由Spring提供的IoC容器實現的。
該類架構層次清晰,結構明顯,同一層中類或接口的代碼往往具有類似的結構,非常適于使用代碼生成工具實現部分代碼自動生成。
2 AppFuse框架
AppFuse 是一個開源項目,它使用了在 Java 平臺上構建的開源工具來幫助開發者快速而高效地開發 Web 應用程序。它使用 Ant 來驅動測試、代碼生成、編譯和部署。它提供了目錄和包結構,以及開發基于 Java 語言的 Web 應用程序所需要的庫。AppFuse支持的Web框架有:Struts、Spring MVC、WebWork、JSF and Tapestry,支持的持久層框架有:Hibernate和iBates,支持的測試環境有:DBUnit,Junit,Jmock和Canoon’s Web Test。AppFuse中集成了XDoclet,并應用它自動生成代碼和相關的配置文件。
Appfuse實現代碼自動生成的核心就是應用XDoclet引擎按照代碼模板文件進行代碼生成。Appfuse要支持很多不同的框架和技術,所以其中的代碼模板就要做到最通用。代碼模板通用性的提高,在一定程度上降低了其功能和效率。而且,Appfuse中代碼自動生成模塊只能生成簡單少量的Spring配置文件,大部分的配置工作沒有實現自動化。基于此,本文對Appfuse中支持Struts,Hibernate和Spring的代碼自動生成模塊進行了提取,改進了其中的代碼模板文件,增強了該模塊的代碼自動生成能力,并使得Spring配置文件的大部分配置工作實現自動化。
3 基于Struts,Hibernate,Spring框架的J2EE架構的代碼自動生成
3.1 代碼自動生成的任務列表
因為Ant配置文件build.xml是代碼自動生成的控制核心,所以可以通過改寫build.xml文件提取出Appfuse中的相關模塊。修改后的build.xml文件包括:變量配置如項目包的名稱、源文件目錄等,定義相關類的引用路徑,還有一系列的代碼生成任務。任務列表如下:
<target name=\"help\">
<echo message=\"提供以下任務:\" />
<echo message=\"create-dir-->生成工程目錄\"/>
<echo message=\"generate-hbm -->運行HibernateDoclet,生成Hibernate 類的映射文件\" />
<echo message=\"schemaexport -->運行SchemaExport,利用hbm.xml 文件生成數據表\" />
<echo message=\"gen-forms --> 運行xdoclet,生成相應的Form類文件\"/>
<echo message=\"webdoclet -->運行webdoclet,生成Struts配置文件和validation.xml\" />
<echo message=\"gen --> 運行xdoclet生成相應類的dao,daoHibernate,manager等文件\"/>
<echo message=\"move-gens--> 把生成相應類的dao,daoHibernate,manager等java文件移到當前工程文件夾下\"/>
<echo message=\"gen-springxml --> 生成spring的配置文件context-spring.xml\" />
</target>
3.2 對Appfuse中代碼自動生成模塊的改進
使用XDoclet自動生成代碼需要有代碼模板以及相應模板語言的支持,另外改進該模塊時加入了一些通用基類,這些都是代碼自動生成模塊的基本組成部分。代碼模板文件主要應用了Form和Method兩個標簽,其中Form標簽是Appfuse中自定義的,而Method標簽則是在原有XDoclet標簽的基礎上做了擴展。提取出的模塊仍然需要Appfuse中FormTagsHandler和MethodExTagsHandler這兩個標簽類的支持,應把他們置于模塊中WEB-INF的Class目錄下。以下就是對原有模板文件的修改及改進:
(1)對Dao.xdt模板文件進行了改進,添加了兩個常用方法,merge()以及find()方法。前者是用于在一個session中存在兩個相同的對象擁有同一個identifer的情況下,而后者則用于執行HQL查詢語言。兩者在項目開發中使用頻率頗高,所以需要增加。
(2)對相應的DAOHibernate類模板即DAO的實現類進行相應的改進,實現merge()和find()方法。
(3)在相應的DAOTest類模板中添加testMerge()和testFind()方法。
(4)在manager類模板中添加add方法,主要是在添加一個新對象時需要先判斷是否有重復,所以應該與save方法分開。
(5)改進DaoHibernate.xdt文件,原模板文件中的get()只適用于對象的主標示的類型為java.Long.*中的情況,修改模板后使之也適用于long和int的情形。
(6)修改Manager.xdt,去掉了用不到的import語句。
(7)在ManagerImpl.xdt文件中添加 import .service.Manager;在改進DaoHibernate.xdt文件后應該相應的修改ManagerImpl.xdt中的remove()和get()方法。
(8)DaoTest.xdt,添加自己的BaseTestCase,然后修改DaoTest.xdt使所有的DaoTest類繼承BaseTestCase。修改testAdd()中“verify a primary key was assigned”的語句,使其也適用于pirmary key是long 和int 的情形。
(9)ManagerTest.xdt,修改模板使ManagerTest類都繼承MockObjectTestCase,修改模板文件中get()和remove()方法,使之也適用于pirmary key是long 和int 的情形。
(10)去掉了Appfuse框架中context-hibernate.xdt和context-service.xdt模板文件。通過在DaoHibernate.xdt和ManagerImpl.xdt模板文件中添加相應的XDoclet標簽(@spring),利用xdoclet.modules.spring.SpringDocletTask任務可以自動生成spring的配置文件,省去了人工維護。
通過以上的修改和改進,使得這些模板功能更加強大,更符合我們的編程習慣從而更加實用。其中<8><9><10>都是對原有模板文件比較大的改進,在一定程度上比Appfuse中的原有模塊更能提高開發效率。
3.3 代碼自動生成模塊的應用步驟
應用該模塊的步驟如下:
(1)在build.xml中設置項目的程序包、源文件目錄、生成文件的輸出目錄、XDoclet模板文件放置目錄、輸出的Form文件目錄、輸出的測試類文件目錄等一系列變量。
(2)設置各個庫的引用路徑,如Spring,Hibernate的jar文件 的引用。
(3)運行build.xml中的create-dir任務,創建工程詳細目錄。
(4)編寫領域對象類,類文件中要添加詳細的XDoclet標簽;在關系數據庫中建立一個空數據庫文件。
(5)順序執行Ant任務generate-hbm,schemaexport,gen-forms,gen-forms,gen,move-gens,gen-springxml,可以自動的連續執行也可以單步執行。
通過執行以上一系列任務,就會在相應的目錄下自動生成Hibernate配置文件,相應領域對象的Struts Form文件以及在Struts-config.xml中的相關配置,領域對象對應的Dao接口及Hibernate實現類,領域對象對應的Manager接口及簡單實現類,相應DaoTest類和ManagerTest類文件,還有簡單的Spring配置文件。此外,還在已創建的數據庫中產生與領域對象對應的數據表。
3.4 改進后模塊的優勢
這樣在整個架構中,一旦實現領域對象層,以下內容會自動實現:(1)基于Hibernate的對象關系映射層。(2)基于Hibernate的數據持久層。(3)基于Spring的業務層的部分代碼,即Manager接口和Manager實現。對于Manager實現還需要根據不同的業務作相應的修改。(4)基于Struts的表現層的部分代碼,即在應用中可能會用到的Struts中的Form類,對應每一個領域對象先自動生成一個Form,以節省可能的工作量。此外,針對數據持久層和業務層接口的測試用例也會自動生成,大部分可以直接應用,只有小部分需要稍作修改以增強測試效果。
4 基于SSH架構的代碼自動生成模塊在權限管理系統的應用
4.1 RBAC模型
本權限管理系統基于RBAC模型設計。RBAC(Role-Based Access Control)模型的基本思想就是根據安全策略劃分出不同的角色,資源訪問許可被封裝在角色中,用戶被指派到角色,用戶通過角色間接地訪問資源。RBAC 的最大優點在于它能夠靈活表達和實現組織的安全策略,使管理員從訪問控制底層的具體實現機制中脫離出來,十分接近日常的組織管理規則。RBAC 被認為是一種更普遍適用的訪問控制模型,可以有效地表達和鞏固特定事務的安全策略,有效緩解傳統安全管理處理瓶頸問題。其中RBAC96模型如圖1所示。
4.2參照RBAC模型以及實際需求對權限管理系統進行建模
此權限管理系統把權限管理和組織機構管理結合起來,分配給用戶的角色來自于部門,部門和角色之間是一對多的關系。權限許可是針對某一權限資源對象和權限操作,所以權限許可和權限資源對象以及權限操作都是一對一的關系。通過Borland公司的建模工具Together,將權限管理系統模型建立如下:
4.3 利用代碼自動生成模塊進行開發
按照3.3所討論的步驟,先進行(1)到(3)步。然后根據圖2中的模型,開始編寫領域對象層代碼并在代碼中添加XDoclet標簽。再依次執行第(4)、(5)步后,就會在相應的目錄下自動生成了Hibernate配置文件,User等領域對象的Struts Form文件以及在Struts-config.xml中的相關配置,對應的Dao接口及Hibernate實現類,對應的Manager接口及簡單實現類,相應DaoTest類和ManagerTest類文件,還有簡單的Spring配置文件。此外,還在已創建的數據庫中產生與領域對象對應的數據表。在該系統開發完畢后,將利用該模塊自動生成的代碼與已經完成的代碼進行了比較,經估算可以節省近40%的代碼量,于是就節省出了大量的時間用于核心業務邏輯的處理。
5 總結
改進后的自動化模塊可以在相對穩定的對象關系映射層和數據持久層實現完全的自動化,而在業務層和表現層也可以減少一部分代碼量,并且測試方面的代碼量也會大大減少。 所以,在類似基于Struts,Hibernate,Spring的輕量級J2EE架構的系統的開發中應用該自動化模塊會大大提高工作效率,縮短項目周期,提高對需求變化的快速響應速度。
參考文獻:
[1] Rod Johnson.J2EE Development Frameworks[J].Computer,2005(01)107-110.
[2] 汪厚祥,李卉.基于角色的訪問控制研究[J].計算機應用研究,2005(4):125-127.
[3] Eric Evans.Domain-Driven Design Tacking Complexity in the Heart of Software[M].Pearson Education,2004:48-49.
注:“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文。”