陳景霞,李 萌
CHEN Jing-xia,LI Meng
(陜西科技大學(xué) 電氣與信息工程學(xué)院,西安 710021)
隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展和普及,越來越多的復(fù)雜動(dòng)態(tài)空間非線性分析系統(tǒng)的軟件工具開始使用基于Web的網(wǎng)絡(luò)平臺(tái)實(shí)現(xiàn)用戶界面、科學(xué)分析、信息處理、分發(fā)數(shù)據(jù)結(jié)果、行業(yè)專家跨地域信息交換和共享等功能。其中,對(duì)非線性分析模擬系統(tǒng)軟件基于web平臺(tái)的實(shí)時(shí)訪問正成為網(wǎng)絡(luò)應(yīng)用系統(tǒng)中很重要的一部分。飛速發(fā)展的網(wǎng)絡(luò)硬件和軟件技術(shù)為web應(yīng)用開發(fā)提供了更多的選擇方案。因而,合理的選擇和開發(fā)web平臺(tái)對(duì)于非線性分析系統(tǒng)及其應(yīng)用顯得越來越重要。Web開發(fā)現(xiàn)階段涌現(xiàn)出了許多優(yōu)秀的開源框架,將web開發(fā)提升到一個(gè)更高的水平[1]。但是在某些情況下,開源框架并不能直接為常見的問題提供解決辦法,開發(fā)者往往需要在開源框架基礎(chǔ)上構(gòu)建自己的開發(fā)框架。在分析現(xiàn)有幾種開源框架特性和用法的基礎(chǔ)上,本文研究一種新型的基于J2EE的開源框架組合,并定義了加強(qiáng)幾種開源框架協(xié)同工作的技術(shù)體系和方法,有效的提高了web系統(tǒng)定制開發(fā)與集成的效率。
開發(fā)web應(yīng)用項(xiàng)目時(shí),通常有一些共同的設(shè)計(jì)問題需要考慮,如表現(xiàn)層、業(yè)務(wù)層、數(shù)據(jù)訪問層的設(shè)計(jì)以及系統(tǒng)測(cè)試等等,甚至圍繞個(gè)別獨(dú)特功能性需求也會(huì)使用一些共同的設(shè)計(jì)模式,這就不可避免的會(huì)出現(xiàn)開發(fā)框架與設(shè)計(jì)模式的重用[2]。本文描述一種定制的J2EE框架(Customized J2EE Web-based Framework,簡稱CJW架構(gòu)),它能夠識(shí)別一般web應(yīng)用開發(fā)的共同設(shè)計(jì)要素,提供從用戶表現(xiàn)層到數(shù)據(jù)層一整套web應(yīng)用開發(fā)模式、工具和實(shí)踐方法。該框架基于Struts、Spring、Hibernate和JUnit等開源框架和工具進(jìn)行構(gòu)建和開發(fā),可以進(jìn)行靈活定制以滿足各種Web項(xiàng)目的開發(fā)需求。
Web應(yīng)用程序的設(shè)計(jì)需要考慮諸如表現(xiàn)層、業(yè)務(wù)邏輯、數(shù)據(jù)存取和安全性等多個(gè)層面的因素,將不同的設(shè)計(jì)任務(wù)分解到不同的層次能夠有效降低系統(tǒng)代碼的耦合度,提高系統(tǒng)的可維護(hù)性,也便于采用好的設(shè)計(jì)模式,為特定設(shè)計(jì)層選擇專用的開發(fā)工具和技術(shù)。同時(shí),將一個(gè)項(xiàng)目進(jìn)行層次劃分會(huì)導(dǎo)致各層之間存在相互依賴。例如,一個(gè)簡單的包含數(shù)據(jù)輸入和查詢功能的用例,只有將表現(xiàn)層的用戶界面、查詢邏輯代碼和數(shù)據(jù)庫存取代碼結(jié)合起來才能實(shí)現(xiàn)所需要的功能,因此,需要定義一種好的策略來管理各層之間的依賴關(guān)系。
本文開發(fā)的CJW架構(gòu)使用Spring框架將設(shè)計(jì)模式、可復(fù)用的代碼和配置文件結(jié)合起來[3],通過控制反轉(zhuǎn)(IOC)技術(shù)實(shí)現(xiàn)系統(tǒng)各層的松耦合,通過IOC容器管理各個(gè)對(duì)象之間的依賴關(guān)系,能夠有效避免硬性編碼造成的耦合過于緊密的狀況;使用依賴注入(Dependency Injection,DI)技術(shù)實(shí)現(xiàn)邏輯相關(guān)代碼的松耦合,依賴注入是由框架或容器將被調(diào)用類注入給調(diào)用對(duì)象,以此來消除對(duì)象和被調(diào)用類之間的依賴關(guān)系,具體實(shí)現(xiàn)形式包括構(gòu)造函數(shù)注入,設(shè)值方法注入和接口注入[4]。同時(shí),Spring框架提供的面向切面編程(AOP)方法,通過方法攔截可以輕松的實(shí)現(xiàn)諸如事務(wù)管理、日志管理、性能監(jiān)控、安全檢測(cè)等關(guān)注點(diǎn)編程。方法攔截是Spring AOP的一個(gè)重要概念,通過JDK動(dòng)態(tài)代理機(jī)制實(shí)現(xiàn),使開發(fā)人員能夠更加專注于業(yè)務(wù)邏輯的實(shí)現(xiàn)[5]。
CJW架構(gòu)包括兩個(gè)部分:代碼和配置信息。代碼在特別的應(yīng)用層中負(fù)責(zé)解決某個(gè)特定的問題,如與數(shù)據(jù)庫的連接和交互、屏幕端的數(shù)據(jù)顯示等。而配置文件則負(fù)責(zé)將應(yīng)用的各個(gè)層連接起來。將配置信息從代碼中分離出來不僅可以單獨(dú)對(duì)配置信息進(jìn)行管理,也可以靈活地將不同的配置信息應(yīng)用于相同的底層代碼。例如,一個(gè)數(shù)據(jù)庫訪問對(duì)象(DAO)能夠使用JDBC接口通過某個(gè)數(shù)據(jù)源連接數(shù)據(jù)庫,但它并不清楚這個(gè)數(shù)據(jù)源的連接信息究竟是從JNDI上下文中獲取的,還是通過數(shù)據(jù)庫驅(qū)動(dòng)管理器獲取的,該數(shù)據(jù)源可以連接遠(yuǎn)程數(shù)據(jù)庫,也可以連接本地?cái)?shù)據(jù)庫。無論這個(gè)數(shù)據(jù)源如何定義,DAO都能以相同的方式調(diào)用它。同樣,一個(gè)服務(wù)對(duì)象(Service)可以用相同的模式調(diào)用一個(gè)DAO而不必知道該DAO是使用Hibernate或是Web服務(wù)實(shí)現(xiàn),還是直接通過JDBC實(shí)現(xiàn)的。
CJW架構(gòu)通過一組XML文件描述、管理整個(gè)應(yīng)用的上下文配置信息,這些配置文件的邏輯集合就構(gòu)成了整個(gè)應(yīng)用的配置集合。在基于J2EE的企業(yè)級(jí)應(yīng)用開發(fā)過程中,系統(tǒng)框架對(duì)數(shù)據(jù)源和JNDI等外部資源的使用通常在標(biāo)準(zhǔn)配置中定義,但可能會(huì)遇到如下問題:1)數(shù)據(jù)庫的數(shù)據(jù)還沒有被完全加載時(shí),開發(fā)人員想要測(cè)試其中某種類型數(shù)據(jù)的顯示結(jié)果,導(dǎo)致這部分測(cè)試工作無法進(jìn)行。2)某些Service服務(wù)類或DAO還沒有完成開發(fā),那么與此相關(guān)的代碼集成和測(cè)試就會(huì)阻礙整個(gè)開發(fā)的進(jìn)程。
針對(duì)上述問題,本文提出的CJW架構(gòu)采用一種專門面向開發(fā)的配置集合代替?zhèn)鹘y(tǒng)的配置方法,使開發(fā)人員不必?fù)?dān)心那些與緊迫開發(fā)需求無關(guān)的外部系統(tǒng)是否可用。CJW架構(gòu)定義了兩個(gè)配置集合:默認(rèn)配置和模塊配置,基于這兩種配置和特定的項(xiàng)目需求,開發(fā)者也可以增加額外的配置文件來定制自己的應(yīng)用架構(gòu)。默認(rèn)配置使用JNDI定義的數(shù)據(jù)源與開發(fā)數(shù)據(jù)庫建立連接,并且調(diào)用已經(jīng)完全開發(fā)好的Service和DAO對(duì)象。而靈活的開發(fā)環(huán)境則是由模塊配置集合搭建的,這些配置集合具備以下功能:1)可以連接本地?cái)?shù)據(jù)庫,或是通過DriverManagerDataSource驅(qū)動(dòng)程序管理器連接開發(fā)數(shù)據(jù)庫;2)使用Spring框架的DataSourceTransactionManager進(jìn)行本地事務(wù)管理;3)調(diào)用完全開發(fā)好的應(yīng)用Service和DAO對(duì)象;4)使整個(gè)基于Spring框架的應(yīng)用上下文能夠在應(yīng)用服務(wù)器外部進(jìn)行完整的運(yùn)行和測(cè)試。
CJW架構(gòu)的配置集合包括service和Web兩部分:Service部分定義各種服務(wù)接口和實(shí)現(xiàn)(即services)、數(shù)據(jù)庫訪問對(duì)象接口和實(shí)現(xiàn)(即DAOs)以及服務(wù)和整合層用到的各種資源;Web部分主要為表現(xiàn)層定義各種顯示組件。這兩部分對(duì)于一個(gè)完整的配置集合缺一不可。CJW架構(gòu)的配置集合由Spring框架的beanRefContext.xml和applicationContextMapping.properties等配置文件化合而成。其中,beanRefContext.xml文件定義了所有配置集合的services,它通常位于項(xiàng)目的src/config目錄下,不同配置集合共享的應(yīng)用上下文文件也位于這個(gè)目錄下。此外,每一個(gè)模塊配置集合都有自己的子目錄,其下包含自己的相關(guān)文件。在XML文件中使用 配置好上述CJW架構(gòu)之后,接下來的編碼與整體構(gòu)造工作包括:開發(fā)相應(yīng)的用戶端界面;設(shè)計(jì)相應(yīng)的Action類、ActionForm類和validation.xml輸入校驗(yàn)組件;設(shè)計(jì)服務(wù)層service接口和實(shí)現(xiàn)類;設(shè)計(jì)數(shù)據(jù)訪問層DAO接口和實(shí)現(xiàn)類;管理各個(gè)類之間的依賴關(guān)系。在開發(fā)一個(gè)實(shí)際用例時(shí),弄清楚上述這些類的詳細(xì)需求和彼此之間的依賴關(guān)系非常重要。 測(cè)試應(yīng)該是整個(gè)開發(fā)過程中不可或缺的一部分。對(duì)于本文提出的CJW框架而言,單元測(cè)試是指基于JUnit框架[6]實(shí)現(xiàn)的對(duì)服務(wù)層或整合層中每個(gè)類所進(jìn)行的測(cè)試,其目的是確保類中封裝的方法結(jié)合其它組件運(yùn)行時(shí)能實(shí)現(xiàn)預(yù)期的功能。表現(xiàn)層的Action類通常不需要進(jìn)行單元測(cè)試。與單元測(cè)試不同,集成測(cè)試需要代碼之間的相互依賴,其目的是確保不同開發(fā)者開發(fā)的類聯(lián)合運(yùn)行時(shí)能實(shí)現(xiàn)預(yù)期的功能。而功能測(cè)試的重點(diǎn)則要針對(duì)每種可能出現(xiàn)的情況設(shè)計(jì)測(cè)試數(shù)據(jù),并用這些數(shù)據(jù)測(cè)試應(yīng)用的功能性,包括使用不同的數(shù)據(jù)對(duì)服務(wù)層的類進(jìn)行功能測(cè)試,或者用真實(shí)的依賴關(guān)系對(duì)用戶界面層進(jìn)行功能測(cè)試。 為了進(jìn)行不同類型的測(cè)試,首先要確保開發(fā)的應(yīng)用程序是可測(cè)試的,一個(gè)可測(cè)試的應(yīng)用需要具備以下基本特征:1)系統(tǒng)開發(fā)要便于進(jìn)行單元測(cè)試和集成測(cè)試,應(yīng)該在沒有必須數(shù)據(jù)源或創(chuàng)建隊(duì)列的情況下就能進(jìn)行單元測(cè)試,測(cè)試時(shí)應(yīng)該能夠模擬代碼之間的依賴性。2)為了進(jìn)行功能測(cè)試,應(yīng)用設(shè)計(jì)要便于模擬各種可能的測(cè)試情況。3)便于在應(yīng)用的整個(gè)生命周期反復(fù)的運(yùn)行所有測(cè)試。4)測(cè)試代碼和應(yīng)用代碼劃分清楚,互不干擾。將表現(xiàn)層、服務(wù)層和數(shù)據(jù)訪問層的設(shè)計(jì)相分離的良好系統(tǒng)架構(gòu),對(duì)于設(shè)計(jì)一個(gè)可測(cè)試的應(yīng)用非常重要。本文開發(fā)的CJW架構(gòu)將更有利于設(shè)計(jì)出可測(cè)試的應(yīng)用系統(tǒng):首先提供了測(cè)試模板類有助于創(chuàng)建單元測(cè)試;整個(gè)應(yīng)用的配置更加靈活便于適應(yīng)各種測(cè)試需要;能夠像任何JUnit測(cè)試那樣進(jìn)行單元測(cè)試,簡單方便。CJW架構(gòu)中還專門開發(fā)了默認(rèn)的Ant編譯腳本,在生成EAR文件時(shí)可以被調(diào)用對(duì)系統(tǒng)進(jìn)行單元測(cè)試,也可以單獨(dú)運(yùn)行完成單元測(cè)試。 本文開發(fā)的CJW架構(gòu)使用Struts框架和JavaScript技術(shù)實(shí)現(xiàn)系統(tǒng)的表現(xiàn)層邏輯,處理應(yīng)用程序與客戶端的交互問題,并且為項(xiàng)目的擴(kuò)展提供附加的技術(shù)支持。應(yīng)用Struts框架進(jìn)行開發(fā)時(shí),首先要在web.xml文件中建立Action Servlet,然后在struts-config.xml文件中設(shè)置action mappings、formbeans以及頁面重定向;最后在validation.xml文件中設(shè)置數(shù)據(jù)校驗(yàn)規(guī)則,對(duì)用戶輸入數(shù)據(jù)的合法性進(jìn)行檢查。為了使開發(fā)者不必頻繁的編輯struts-config.xml或者validation.xml,CJW架構(gòu)對(duì)上述方法進(jìn)行了改進(jìn),使開發(fā)者在Action類和ActionForm類中應(yīng)用XDoclet注釋進(jìn)行配置說明,注釋信息在運(yùn)行Ant腳本時(shí)能自動(dòng)轉(zhuǎn)換成strutsconfig.xml和validation.xml配置文件。 CJW架構(gòu)設(shè)計(jì)了一個(gè)默認(rèn)的Action模板類,使表現(xiàn)層的設(shè)計(jì)達(dá)到以下目標(biāo):1)每個(gè)JSP頁面都對(duì)應(yīng)一個(gè)唯一的Action處理類,一個(gè)Action類負(fù)責(zé)對(duì)一個(gè)單一的web頁面進(jìn)行處理。2)在Action類和ActionForm類中使用XDoclet注釋對(duì)類之間的依賴關(guān)系及合法性校驗(yàn)規(guī)則進(jìn)行說明。3)盡量避免或減少使用session會(huì)話對(duì)象,否則會(huì)降低系統(tǒng)的可伸縮性。然后,遵循以下步驟開發(fā)一個(gè)web頁面:1)創(chuàng)建一個(gè)新的JSP頁面,其中包含一個(gè)名為“actionType”的默認(rèn)隱藏域,用來表示用戶希望對(duì)該頁面進(jìn)行的處理類型。2)通過繼承Action模板類創(chuàng)建一個(gè)新的Action類,必須說明該Action類與ActionForm中“actionType”隱藏域所表示處理方法的對(duì)應(yīng)關(guān)系,然后在Spring配置文件中聲明訪問這個(gè)Action類的條件。3)創(chuàng)建一個(gè)新的ActionForm類并使用XDoclet注釋說明表單數(shù)據(jù)的有效性校驗(yàn)規(guī)則。一旦JSP、Action以及ActionForm創(chuàng)建完成,必須運(yùn)行Ant腳本重新生成struts-config.xml配置文件。 基于CJW架構(gòu)開發(fā)的應(yīng)用程序支持直接使用JDBC和Hibernate框架與關(guān)系數(shù)據(jù)庫建立持久連接和數(shù)據(jù)通信,在必要的Spring上下文文件中進(jìn)行配置即可。直接使用JDBC訪問數(shù)據(jù)庫的DAO類必須繼承Spring框架的JdbcDaoSupport.java類;使用Hibernate框架訪問數(shù)據(jù)庫的DAO類必須繼承Spring框架的HibernateDaoSupport.java類。 CJW架構(gòu)使用Spring框架來維護(hù)代碼之間的依賴性。例如,Action類和ActionForm之間的依賴性在struts-config.xml文件中配置,而Service類和DAO類之間的依賴性在Spring應(yīng)用上下文文件applicationContext.xml中配置。在同一個(gè)開發(fā)小組中這些配置文件被所有開發(fā)者共享,這可能導(dǎo)致配置文件的版本沖突。CJW架構(gòu)提供了一種新型有效的方法,即XDoclet注釋來說明類之間的依賴性,這種注釋的方法不僅簡化了系統(tǒng)的配置,而且能有效避免配置文件的版本沖突。 本文開發(fā)的CJW架構(gòu)提出使用簡單的JavaBeans(即POJOs)實(shí)現(xiàn)業(yè)務(wù)邏輯,而業(yè)務(wù)邏輯必須以接口的形式進(jìn)行聲明,所有的Service實(shí)現(xiàn)類必須實(shí)現(xiàn)一個(gè)或多個(gè)業(yè)務(wù)接口,并且建議當(dāng)服務(wù)層出現(xiàn)業(yè)務(wù)邏輯錯(cuò)誤時(shí)能拋出定制的異常。CJW架構(gòu)采用基于Spring框架的面向方面編程(AOP)的方式實(shí)現(xiàn)事務(wù)管理。同時(shí),CJW架構(gòu)很好地將面向服務(wù)用戶的部署接口與面向業(yè)務(wù)邏輯的服務(wù)接口相分離。部署接口是一種可以用Web服務(wù)定義語言(WSDL)描述的外部接口,這類接口的實(shí)現(xiàn)類通常必須將請(qǐng)求委托給實(shí)現(xiàn)服務(wù)接口的類。服務(wù)接口則是表示業(yè)務(wù)邏輯的Java接口,這樣能確保所有的業(yè)務(wù)邏輯在業(yè)務(wù)層的一個(gè)固定類中進(jìn)行定義和維護(hù)。部署接口中通常會(huì)包含服務(wù)接口中的若干方法。 Apache Axis 1.2.4框架是目前流行的標(biāo)準(zhǔn)Web服務(wù)架構(gòu)。開發(fā)Web服務(wù)有兩種不同的方法[7]:契約在前和契約在后,這兩者之間的區(qū)別在于WSDL是在編碼之前創(chuàng)建的,還是從寫好的代碼中產(chǎn)生的。如果服務(wù)的消費(fèi)者和提供者都是使用各自不同技術(shù)(如.NET或Java)去實(shí)現(xiàn)Web服務(wù)的供應(yīng)商,那就適合采用契約在前的方法開發(fā)Web 服務(wù)[10]。 CJW架構(gòu)在業(yè)務(wù)邏輯中間層采用相關(guān)技術(shù)實(shí)現(xiàn)與數(shù)據(jù)庫、Web服務(wù)等外部資源的整合,其整合的目標(biāo)在于:1)將基于JDBC或Hibernate的數(shù)據(jù)庫訪問操作封裝在數(shù)據(jù)訪問對(duì)象(DAO)中;2)盡可能簡化對(duì)Web服務(wù)的調(diào)用;3)所有外部數(shù)據(jù)向應(yīng)用域?qū)ο蟮霓D(zhuǎn)換操作應(yīng)該限制在這一層進(jìn)行;4)這一層中的單元測(cè)試類要設(shè)計(jì)簡單且易于執(zhí)行。 CJW架構(gòu)支持使用Spring框架的JdbcTemplate和HibernateTemplate模板類訪問關(guān)系數(shù)據(jù)庫。當(dāng)直接使用JDBC訪問關(guān)系數(shù)據(jù)庫時(shí),應(yīng)用中的DAO對(duì)象可以繼承Spring框架的JdbcDaoSupport類,該類管理著訪問數(shù)據(jù)庫要用到的各種資源(例如預(yù)處理語句對(duì)象PreparedStatement等)。CJW架構(gòu)可以通過應(yīng)用配置文件將數(shù)據(jù)源插入到DAO類中。當(dāng)使用Hibernate時(shí),同樣可以通過應(yīng)用配置文件將Hibernate的SessionFactory注入到DAO類中。 本文開發(fā)的CJW框架結(jié)構(gòu)也明確定義了應(yīng)用開發(fā)小組的人員角色及各自的作用:1)前端開發(fā)者主要負(fù)責(zé)設(shè)計(jì)開發(fā)JSP頁面、Action/ActionForm類以及對(duì)外的Web服務(wù)接口;2)中間服務(wù)層的開發(fā)者則負(fù)責(zé)開發(fā)各種應(yīng)用服務(wù),并將這些服務(wù)相關(guān)的應(yīng)用模塊進(jìn)行集成;3)底層開發(fā)者主要負(fù)責(zé)開發(fā)各種DAO類以及密集型Web服務(wù)。各個(gè)角色之間的相互配合對(duì)整個(gè)應(yīng)用開發(fā)的成敗將起決定性的作用。 開發(fā)中經(jīng)常會(huì)遇到的一個(gè)基本問題是當(dāng)代碼相關(guān)的組件不可用時(shí)如何對(duì)代碼進(jìn)行開發(fā)和集成。針對(duì)這個(gè)問題,CJW架構(gòu)提供了一種以聲明方式注入“模擬對(duì)象”的結(jié)構(gòu),這些“模擬對(duì)象”隨著開發(fā)周期的推進(jìn)將被實(shí)際的對(duì)象所取代。同時(shí),編寫、運(yùn)行JUnit測(cè)試也使得測(cè)試工作成為開發(fā)過程不可缺少的一部分,CJW架構(gòu)重點(diǎn)測(cè)試應(yīng)用的服務(wù)以及服務(wù)之間的依賴關(guān)系。應(yīng)用程序以EAR企業(yè)歸檔文件的形式進(jìn)行部署,EAR文件可以通過手工運(yùn)行Ant腳本生成,也可以通過調(diào)度程序周期性的執(zhí)行Ant腳本生成。建議在生成EAR文件之前完成所有的JUnit測(cè)試。 本文提出了一個(gè)基于J2EE的web信息系統(tǒng)開發(fā)架構(gòu)CJW,重點(diǎn)論述了開發(fā)J2EE項(xiàng)目應(yīng)該考慮的系統(tǒng)架構(gòu)、相關(guān)技術(shù)和開發(fā)步驟。該架構(gòu)取自于真實(shí)的項(xiàng)目經(jīng)驗(yàn),目的是幫助開發(fā)者們以此為參考,更快、更好的構(gòu)建J2EE系統(tǒng)并設(shè)計(jì)出滿足自己需求的定制框架。不過,這只是冰山一角,只此一篇論文并不能描述清楚J2EE的技術(shù)細(xì)節(jié)以及J2EE在科學(xué)和企業(yè)應(yīng)用中的潛在影響,尤其是在基于Web的非線性分析模擬軟件方面,作者將進(jìn)一步研究該CJW架構(gòu)在此方面的應(yīng)用和優(yōu)化。 [1] 李成嚴(yán),馮慧靈. 基于開源技術(shù)的Web應(yīng)用架構(gòu)研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2009,19(8): 27-30. [2] 曾亮,齊歡,王小平等.基于J2EE核心模式的組合Web框架研究[J]. 華中科技大學(xué)學(xué)報(bào)(自然科學(xué)版),2007,35(6):43-46. [3] 袁華強(qiáng),王亞強(qiáng),朱君. 利用J2EE輕量級(jí)框架構(gòu)建Web應(yīng)用研究[J]. 計(jì)算機(jī)工程與設(shè)計(jì),2007,28(1): 22-25. [4] The Spring Framework official website: http://www.springframework.org/. [5] Martin Fowler discusses details of the dependency injection pattern and how spring injects dependen cies: http://www.martinfowler.com/. [6] JUnit framework: http://www.junit.org/. [7] A.S. Boranbayev,Optimal methods for java web services,News of the National Academy of Science of the Republic of Kazakhstan 5 (2007) 38-43.1.2 類與依賴關(guān)系的設(shè)計(jì)
1.3 測(cè)試技術(shù)
1.4 Web表現(xiàn)層的設(shè)計(jì)
1.5 數(shù)據(jù)庫存取
1.6 通過注釋進(jìn)行配置
2 CJW架構(gòu)的服務(wù)體系
3 中間層的整合
4 開發(fā)生命周期
5 結(jié)論