4系統(tǒng)的技術(shù)實(shí)現(xiàn)
在本文的系統(tǒng)構(gòu)架與分層設(shè)計(jì)中,已經(jīng)清楚地闡述了系統(tǒng)的總體技術(shù)構(gòu)架與分層設(shè)計(jì),下面就實(shí)現(xiàn)框架的具體技術(shù)展開敘述。
4.1表現(xiàn)層框架實(shí)現(xiàn)技術(shù)-STRUTS
STRUTS作為一種比較優(yōu)秀的MVC模式實(shí)現(xiàn)框架技術(shù)應(yīng)用已久,STRUTS框架技術(shù)主要的實(shí)現(xiàn)目的在于:①實(shí)現(xiàn)顯示層、控制層、業(yè)務(wù)層的分離;②攔截用戶的業(yè)務(wù)請(qǐng)求,代理業(yè)務(wù)邏輯層的業(yè)務(wù)功能,并將結(jié)果組織返回給客戶;③組織和控制頁面的流轉(zhuǎn)。如前文中圖(圖3-2 MVC三層結(jié)構(gòu)圖) 和(圖3-3:Struts的處理序列圖)所描述,下面我們舉例來說明相應(yīng)的實(shí)現(xiàn):
1) 配置WEB.XML文件
WEB.XML主要配置STRUTS 的CONGFIG文件注入以及相應(yīng)的TAG 文件配置,如圖1:
圖1 WEB.XML配置STRUTS示例
2) 配置struts-config.xml文件
struts-config.xml主要配置ACTION FORM 與ACTION 之間的對(duì)應(yīng)關(guān)系以及JSP頁面提交表單到ACTION的對(duì)應(yīng),如下例:
圖2 struts-config.xml配置示例
3) LOGIN.JSP頁面代碼實(shí)例
根據(jù)以上配置所示:客戶從登錄頁面:LOGIN.JSP 登錄提交表單,可以看到相應(yīng)的表單為LoginForm,相應(yīng)的處理ACTION為 loginFormAction;那么LOGIN.JSP頁面代碼如圖3
圖3 login.jsp代碼示例
4)LoginFormAction代碼實(shí)例
loginFormAction截取JSP客戶端提交的請(qǐng)求信息以后,開始調(diào)用相應(yīng)的業(yè)務(wù)邏輯層中的業(yè)務(wù)處理類來進(jìn)行相應(yīng)的客戶驗(yàn)證等業(yè)務(wù)操作,然后根據(jù)返回的結(jié)果進(jìn)行相應(yīng)的頁面跳轉(zhuǎn);如下例:
圖4 LoginFormAction代碼示例
4.2業(yè)務(wù)層框架實(shí)現(xiàn)技術(shù)-SPRING
表現(xiàn)層(Action)在獲取客戶端請(qǐng)求以后,開始調(diào)用業(yè)務(wù)邏輯層所提供的公開接口來處理用戶的請(qǐng)求。這樣,用戶請(qǐng)求數(shù)據(jù)在表現(xiàn)層經(jīng)過數(shù)據(jù)驗(yàn)證、過濾、包裝以后開始通過將客戶請(qǐng)求數(shù)據(jù)打包成數(shù)據(jù)傳遞對(duì)象(DT0)給業(yè)務(wù)邏輯層進(jìn)行業(yè)務(wù)邏輯處理。本系統(tǒng)的業(yè)務(wù)邏輯層實(shí)現(xiàn)框架為SPRING,以下就接上面例子繼續(xù)給出SPRING的實(shí)現(xiàn)實(shí)例圖5:
1) SPRING基礎(chǔ)內(nèi)容文件的配置
圖5 SPRING基礎(chǔ)配置文件示例
2)SPRING的AOP與IOC技術(shù)
IOC: IOC也即反轉(zhuǎn)控制,其基本的原理是反向?qū)EAN從配置文件中依賴注入,由容器來生成和管理其生命周期,其最大的優(yōu)點(diǎn)在于最大程度地實(shí)現(xiàn)代碼之間的松散耦合。SPRING中的Core 封裝包是框架的最基礎(chǔ)部分,提供IOC和依賴注入特性。這里的基礎(chǔ)概念是BeanFactory,它提供對(duì)Factory模式的經(jīng)典實(shí)現(xiàn)來消除對(duì)程序性單例模式的需要,并真正地允許你從程序邏輯中分離出依賴關(guān)系和配置。構(gòu)建于Core封裝包基礎(chǔ)上的 Context封裝包,提供了一種框架式的對(duì)象訪問方法,有些象JNDI注冊(cè)器。Context封裝包的特性得自于Beans封裝包,并添加了對(duì)國際化(I18N)的支持(例如資源綁定),事件傳播,資源裝載的方式和Context的透明創(chuàng)建,比如說通過Servlet容器。參考(圖4-1:SPRING IOC容器)
AOP:Spring的 AOP 封裝包提供了符合 AOP Alliance規(guī)范的面向方面的編程(aspect-oriented programming)實(shí)現(xiàn),讓你可以定義,例如方法攔截器(method-interceptors)和切點(diǎn)(pointcuts),從邏輯上講,從而減弱代碼的功能耦合,清晰的被分離開。而且,利用source-level的元數(shù)據(jù)功能,還可以將各種行為信息合并到你的代碼中,這有點(diǎn)像.Net的attribute的概念。
在Spring中,bean就是由Spring容器初始化、裝配及被管理的對(duì)象。org.springframework.beans.factory.BeanFactory是Spring IOC容器的實(shí)際代表者,IoC容器負(fù)責(zé)容納此前所描述的bean,并對(duì)bean進(jìn)行管理。在Spring中,BeanFactory是IOC容器的核心接口。它的職責(zé)包括:實(shí)例化、定位、配置應(yīng)用程序中的對(duì)象及建立這些對(duì)象間的依賴。Spring為我們提供了許多易用的BeanFactory實(shí)現(xiàn),XmlBeanFactory就是最常用的一個(gè)。該實(shí)現(xiàn)將以XML方式描述組成應(yīng)用的對(duì)象以及對(duì)象間的依賴關(guān)系。XmlBeanFactory類將持有此XML配置元數(shù)據(jù),并用它來構(gòu)建一個(gè)完全可配置的系統(tǒng)或應(yīng)用。
圖6 SPRING IOC容器
從圖6可以看到,Spring IOC容器將讀取配置元數(shù)據(jù);并通過它對(duì)應(yīng)用中各個(gè)對(duì)象進(jìn)行實(shí)例化、配置以及組裝。通常情況下我們使用簡(jiǎn)單直觀的XML來作為配置元數(shù)據(jù)的描述格式。在XML配置元數(shù)據(jù)中我們可以對(duì)那些我們希望通過Spring IOC容器管理的bean進(jìn)行定義。
那么在本例中請(qǐng)參考(例4-4:SPRING基礎(chǔ)配置文件示例)對(duì)相應(yīng)的bean的定義。接下來就是如何在代碼中實(shí)現(xiàn)對(duì)BEAN的實(shí)例化。Spring IOC容器的實(shí)例化非常簡(jiǎn)單,如圖7:
圖7 獲取SPRING基礎(chǔ)配置文件bean的base action文件
4.3持久層框架實(shí)現(xiàn)技術(shù)-HIBERNATE與IBATIS
本系統(tǒng)數(shù)據(jù)持久層的采用的技術(shù)主要有HIBERNATE 和IBATIS,通過上文對(duì)SPRING基礎(chǔ)的配置,SPRING業(yè)務(wù)框架類基本上實(shí)現(xiàn)了數(shù)據(jù)持久層需要獲得支持的事務(wù)控制類和其他相關(guān)幫助實(shí)體。通過對(duì)SPRING框架組合,持久層的DAO實(shí)體需要實(shí)現(xiàn)的就更加清晰:僅僅主要關(guān)注業(yè)務(wù)SQL語句的編寫就可以,其他比如事務(wù)控制、數(shù)據(jù)庫連接、連接池管理就交給SPRING框架容器去管理了。下面我們以IBATIS中的配置為例來解釋一下數(shù)據(jù)持久層的實(shí)現(xiàn)。
1) SQL MAP 文件的配置
SQL MAP 文件主要定義用戶SQL方法定義文件的映射, 利用SQL MAP 可以實(shí)現(xiàn)將sql語句和相應(yīng)的方法寫作XML文件中,而不要象傳統(tǒng)的JDBC程序,寫在java代碼中。
2) 具體的SQL 文件的配置
具體的SQL 文件主要實(shí)現(xiàn)SQL語句的編寫和方法、參數(shù)的說明,具體的用法如下例:
以LoginQuery.xml為例, 其中主要定義了查詢結(jié)果ResultMap 節(jié)點(diǎn) , Insert節(jié)點(diǎn) ,Select 節(jié)點(diǎn), Update 節(jié)點(diǎn),以及Delete節(jié)點(diǎn). SQL MAP文件實(shí)現(xiàn)了代碼與數(shù)據(jù)庫操作的分離, 使得系統(tǒng)更具靈活性, 這與傳統(tǒng)的JDBC數(shù)據(jù)編碼方式有著根本的區(qū)別。如圖8示:
圖8 LoginQuery.xml SQL配置文件實(shí)例
3)代碼中調(diào)用SQL MAP 實(shí)現(xiàn)數(shù)據(jù)持久化
根據(jù)上述SPRING對(duì)IBITAS的配置以及IBATIS SQL 映射文件的配置, 我們可以輕松地在代碼層中實(shí)現(xiàn)對(duì)數(shù)據(jù)的持久化,極大地提升了系統(tǒng)的擴(kuò)展性、柔韌性、靈活性以及松耦合性。利用SPRING框架提供的方法,程序員幾乎可以在零編碼狀態(tài)下實(shí)現(xiàn)對(duì)數(shù)據(jù)的持久化。如圖9示。
圖9 LoginDaoImpl數(shù)據(jù)持久代碼文件實(shí)例
至此我們不難總結(jié)從用戶發(fā)出請(qǐng)求的JSP頁面開始到SPRING 調(diào)用相應(yīng)的DAO實(shí)現(xiàn)數(shù)據(jù)持久層的操作,這一整個(gè)業(yè)務(wù)流程的實(shí)現(xiàn)其實(shí)是非常清晰的,我們來看看這個(gè)例子的技術(shù)實(shí)現(xiàn)流程:圖10所示可以清晰地表達(dá)本系統(tǒng)處理業(yè)務(wù)流程的技術(shù)實(shí)現(xiàn),以用戶登錄為一個(gè)典型例子:1 用戶瀏覽頁面LOGIN.JSP,填寫用戶帳戶以及密碼 2 JSP頁面提交用戶請(qǐng)求 3基于STRUTS的ACTION 類截取用戶請(qǐng)求, ACTION請(qǐng)求調(diào)用基于SPRING框架的SERVICE類 4 SERVICE類相應(yīng)ACTION請(qǐng)求 ,調(diào)用 數(shù)據(jù)持久層的相應(yīng)DAO實(shí)例 5數(shù)據(jù)持久層框架IBATIS通過相應(yīng)的DAO實(shí)例,訪問目標(biāo)數(shù)據(jù)庫系統(tǒng)6 將獲取的用戶信息返回給SPRING中的SERVICE對(duì)象 7 SERVICE對(duì)象將用戶信息返回給ACTION 8 ACTION 獲取用戶信息比較客戶端提交過來的表單信息,根據(jù)比較結(jié)果的異同,分派跳轉(zhuǎn)下一個(gè)處理頁面 9 用戶獲取驗(yàn)證結(jié)果,進(jìn)入下一頁面流程。詳細(xì)請(qǐng)看下面流程圖示:
圖10 用戶登錄序列圖
基于篇幅本文不再對(duì)數(shù)據(jù)傳輸實(shí)現(xiàn)技術(shù)(WEB SERVICE)和報(bào)表統(tǒng)計(jì)分析實(shí)現(xiàn)技術(shù)(JREPORT和JFreeChart)進(jìn)行展開敘述。
5總結(jié)與展望
項(xiàng)目總結(jié)的目的和意義不僅僅在于總結(jié)經(jīng)驗(yàn)教訓(xùn)、防止犯同樣的錯(cuò)誤、評(píng)估項(xiàng)目團(tuán)隊(duì)、為持續(xù)開發(fā)積累技術(shù)經(jīng)驗(yàn)和原始數(shù)據(jù),而且也會(huì)對(duì)其他項(xiàng)目和企業(yè)的項(xiàng)目管理體系建設(shè)和項(xiàng)目文化起到不可或缺的作用。那么以此為目的讓我們分別從項(xiàng)目管理、技術(shù)選型這兩個(gè)方面來分析和總結(jié)一下本次項(xiàng)目的開發(fā)經(jīng)驗(yàn)和教訓(xùn)。
5.1 項(xiàng)目管理
常言“三分技術(shù),七分管理”,此話言不為過。完善科學(xué)的項(xiàng)目管理體系是一切項(xiàng)目成功的基礎(chǔ)和必要的條件。本項(xiàng)目從項(xiàng)目的發(fā)起、項(xiàng)目的前期調(diào)查期間就科學(xué)地制定了項(xiàng)目管理的七個(gè)基本管理計(jì)劃:項(xiàng)目范圍計(jì)劃、項(xiàng)目進(jìn)度計(jì)劃、項(xiàng)目成本計(jì)劃、項(xiàng)目質(zhì)量計(jì)劃、項(xiàng)目團(tuán)隊(duì)計(jì)劃、項(xiàng)目風(fēng)險(xiǎn)計(jì)劃。根據(jù)項(xiàng)目的特點(diǎn)和團(tuán)隊(duì)自身的條件,有效采用XP快速開發(fā)模式并建立起核心項(xiàng)目管理體系:在項(xiàng)目范圍計(jì)劃制定和實(shí)施中,我們時(shí)刻保持與客戶的良好溝通并且每一個(gè)重要的、具體的需求確定都經(jīng)過與客戶的多次討論并經(jīng)權(quán)威教育領(lǐng)域?qū)<铱隙ǎ员WC項(xiàng)目需求的正確性和完備性,從而有效地限定了項(xiàng)目的范圍,明確應(yīng)該作什么和不應(yīng)該作什么。為了能保證按時(shí)交付符合需求的產(chǎn)品,項(xiàng)目組制定了嚴(yán)格的進(jìn)度計(jì)劃并劃分了科學(xué)的里程碑式階段任務(wù),每個(gè)階段定義了明確的階段任務(wù)和要達(dá)到的目標(biāo),避免、杜絕出現(xiàn)大而空、不可控、不切實(shí)際的任務(wù)進(jìn)度。在項(xiàng)目成本、范圍、時(shí)間和質(zhì)量控制中,項(xiàng)目組采用了科學(xué)的時(shí)間、成本、范圍的質(zhì)量三角形理論,時(shí)間、成本、范圍作為組成三角形的三條邊(可以表達(dá)為:F(a,b,c)=d,a、b、c、d分別為時(shí)間、成本、范圍、質(zhì)量),項(xiàng)目質(zhì)量是三角形的面積,這樣三個(gè)因素互相制約、互相平衡,在動(dòng)態(tài)變化中和限定條件下追求三角形面積(項(xiàng)目質(zhì)量)的最大值。在風(fēng)險(xiǎn)管理中,無時(shí)不刻地給項(xiàng)目成員灌輸引發(fā)項(xiàng)目風(fēng)險(xiǎn)的各種因素,通過頭腦風(fēng)暴法、模型分析法來預(yù)測(cè)風(fēng)險(xiǎn)發(fā)生的可能性并制定完備的風(fēng)險(xiǎn)應(yīng)對(duì)手冊(cè)。
通過對(duì)上述七個(gè)方面的項(xiàng)目計(jì)劃管理,有效地保證了項(xiàng)目在非技術(shù)層面的按時(shí)、按量、按質(zhì)地進(jìn)展并最終獲得了項(xiàng)目的預(yù)期成果和市場(chǎng)的一致認(rèn)可。
5.2 技術(shù)選型
一個(gè)項(xiàng)目的好壞固然跟很多因素有關(guān),但是正確、先進(jìn)的技術(shù)實(shí)現(xiàn)卻是成功項(xiàng)目的堅(jiān)實(shí)基礎(chǔ)。信息技術(shù)的發(fā)展是一日千里,確實(shí)不能要求我們時(shí)時(shí)刻刻利用最新的技術(shù)、最新的設(shè)備和環(huán)境,但是技術(shù)的模型、實(shí)現(xiàn)的模式和構(gòu)架思想?yún)s是能夠存在很長時(shí)間甚至有時(shí)如同藝術(shù)品一樣可以成為永恒的經(jīng)典。因此一個(gè)成熟、成功的系統(tǒng)應(yīng)該具有很強(qiáng)的擴(kuò)展性、松散的耦合性和無縫的集成性,所以從一開始規(guī)劃設(shè)計(jì)項(xiàng)目的時(shí)候,從技術(shù)選型上我們就看得比較遠(yuǎn):在需求建模階段我們采用了業(yè)界比較領(lǐng)先的領(lǐng)域模型驅(qū)動(dòng)(Domain Model Driver),解決了用戶需求捕獲的問題,明確和定義了項(xiàng)目的問題集;在系統(tǒng)建模和技術(shù)分析階段,我們采用了面向服務(wù)的體系結(jié)構(gòu)(SOA)和基于J2EE、Struts、Spring、Hibernate/IBitas的分層框架技術(shù),有效地解決復(fù)雜的業(yè)務(wù)邏輯問題,成功地構(gòu)建了一個(gè)擴(kuò)展性強(qiáng)、靈活度高、復(fù)用性好的軟件系統(tǒng)。
通過理性、科學(xué)的技術(shù)選型和熟練地應(yīng)用各種主流開發(fā)技術(shù),從技術(shù)層面上我們提供了一份解決實(shí)際問題的滿意的答卷,為系統(tǒng)的順利實(shí)施和穩(wěn)定地運(yùn)行奠定了基礎(chǔ)。
5.3 持續(xù)改進(jìn)
在特定條件、有限的資源和存在客戶需求差異性的情況下,在項(xiàng)目的實(shí)施過程中我們也看到了很多的問題和需要持續(xù)改進(jìn)的地方:①教學(xué)儀器配標(biāo)各地的差異化;②各地學(xué)?;A(chǔ)設(shè)施和人員素質(zhì)的參差不齊;③開發(fā)過程的CMM標(biāo)準(zhǔn)流程化;④團(tuán)隊(duì)建設(shè)和持續(xù)開發(fā)能力的培養(yǎng)等等,這一切都是我們需要面對(duì)和未來需要解決的問題。