




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
PAGE第23頁共=NUMPAGES27-423頁學(xué)位論文SMART系統(tǒng)-系統(tǒng)框架設(shè)計(jì)與開發(fā)論文作者姓名:申請(qǐng)學(xué)位專業(yè):申請(qǐng)學(xué)位類別:論文提交日期:SMART系統(tǒng)-系統(tǒng)框架設(shè)計(jì)與開發(fā)摘要SMART系統(tǒng)是一個(gè)新型智能在線考試信息管理系統(tǒng),該系統(tǒng)主要實(shí)現(xiàn)了學(xué)生在線考試與評(píng)估以及教師對(duì)學(xué)生在線考試信息的管理和維護(hù)。本文按照SMART系統(tǒng)的非功能性需求,基于Struts、Spring、Hibernate三種開源技術(shù),構(gòu)建了一個(gè)具有良好的可擴(kuò)展性、可維護(hù)性、可靠性的系統(tǒng)框架。整個(gè)系統(tǒng)的框架分為三層,分別為表現(xiàn)層、業(yè)務(wù)層和持久層。本系統(tǒng)的表現(xiàn)層是基于Struts作擴(kuò)展設(shè)計(jì),結(jié)合本系統(tǒng)的需求完成了自定義標(biāo)簽的封裝,基本action接口的編寫。在業(yè)務(wù)層則是采用單例模式設(shè)計(jì)與Spring的IoC模式相結(jié)合,實(shí)現(xiàn)了公共代理類的編寫,各業(yè)務(wù)邏輯接口的封裝。而在持久層的設(shè)計(jì)中則是采用基于現(xiàn)有持久層框架的實(shí)現(xiàn)模式,實(shí)現(xiàn)了對(duì)產(chǎn)生Session實(shí)例的封裝,對(duì)常用數(shù)據(jù)庫(kù)操作的封裝。這樣設(shè)計(jì)減少了耦合性且避免了生成大量的臨時(shí)對(duì)象。該系統(tǒng)框架能達(dá)到良好的可拓展性和維護(hù)性。它不僅僅適用這個(gè)系統(tǒng)的開發(fā),可以應(yīng)用于J2EE領(lǐng)域中基于SSH來架構(gòu)的大部分B/S系統(tǒng)。關(guān)鍵詞:設(shè)計(jì)模式;開源;領(lǐng)域建模;系統(tǒng)框架SMARTSystem–TheDesignandDevelopmentofTheFrameworkAbstractTheSMARTsystemisanewtypeofintelligentinformationmanagementsystemforonlineexamination.ThesystemhasmostlyrealizedthefunctionthatthestudentscandotheonlineexamandtheteacherscanmanageandmaintaintheexaminformationofstudentsonSMARTSystem.Inthispaper,howtoconstructasystemframeworkofgoodexpansibility,maintainability,andreliabilityisdiscussingindetailaccordingtothenon-functionalityneedoftheSmartsystem,whichisbasedonStruts,Spring,andHibernate.Thesystemframeworkisdividedintothreelayers,andtheyareviewlayer,businesslayer,andpersistentlayer.Wecandoexpansion-designingofStrutsintheprocessoftheframeworkdesigningwhichbasesontheviewlayer,alsotheencapsulationofthecustomtagandthecompiledlanguageforthebasicinterfaceofactionarefinishedaccordingtotherequestofthesystem.Inthissystem,thebusinesslayerisacomboofsingle-examplemodeandIoCmode,sothecompiledlanguageforthecommondeputizeandtheencapsulationofthebusinesslogicinterfacehavebeenrealized.Therealizedmodethatisappliedtotheframeworkdesignofthepersistentlayerisbasedontheframeworkofthepersistentlayerinexistence,alsotheencapsulationofcreatingexampleforSessionandtheencapsulationofdatabaseforcommonusearerealized.Asaresult,itwillreducethecoupling,andalotoftemporaryobjectscreatedinthisprocesswillbeavoided.Favorableexpansibilityandmaintainabilitycanbeachievedinthissystemframework.ThisframeisnotonlyappliedtothesystemicdevelopmentbutalsocanbeappliedtothemostB/SsystemwhichbasesontheframeofSSHinthefieldofJ2EE.Keywords:DesignPattern;OpenSource;DomainModeling;TheframeworkofSystem目錄論文總頁數(shù):25頁TOC\o"1-2"\h\z\u1 引言 11.1 課題背景 11.2 國(guó)內(nèi)外研究現(xiàn)狀 11.3 本課題研究的意義 12 系統(tǒng)需求分析 22.1 可擴(kuò)展性要求 22.2 可維護(hù)性要求 22.3 可伸縮性要求 22.4 可靠性要求 23 系統(tǒng)開發(fā)環(huán)境及實(shí)現(xiàn)關(guān)鍵技術(shù) 33.1 硬件環(huán)境 33.2 軟件環(huán)境 33.3 系統(tǒng)實(shí)現(xiàn)的關(guān)鍵技術(shù) 34 系統(tǒng)總體框架設(shè)計(jì) 74.1 總體結(jié)構(gòu)說明 74.2 總體結(jié)構(gòu)設(shè)計(jì)與建模 105 系統(tǒng)總體框架具體實(shí)現(xiàn) 185.1 各層具體實(shí)現(xiàn) 186 測(cè)試與分析 216.1 測(cè)試環(huán)境 216.2 測(cè)試結(jié)果 216.3 結(jié)果分析 22結(jié)論 22參考文獻(xiàn) 23致謝 24聲明 25引言課題背景隨著計(jì)算機(jī)技術(shù)的發(fā)展及計(jì)算機(jī)的日益普及,基于Web的在線考試與無紙化辦公已成為大勢(shì)所趨。特別是在大興數(shù)字化校園建立的今天,基于WEB在線考試系統(tǒng)也已經(jīng)成為學(xué)校信息化建設(shè)中不可缺少的一部分,它的優(yōu)勢(shì)不但體現(xiàn)在人力上也體現(xiàn)在物力上,基于WEB的在線考試系統(tǒng)的自動(dòng)評(píng)閱、計(jì)分、成績(jī)存檔功能將有效地避免資源的浪費(fèi),有利于環(huán)保,減少人員投入,大大的提高了效率。相比傳統(tǒng)的考試方式,基于WEB的在線考試系統(tǒng)的主要好處是一方面可以動(dòng)態(tài)地管理各種考試信息,只要準(zhǔn)備好足夠大的題庫(kù),就可以按照要求自動(dòng)生成各種試卷;另一方面,考試時(shí)間靈活,可以在規(guī)定的時(shí)間段內(nèi)的任意時(shí)間參加考試;另外計(jì)算機(jī)化的考試的最大特點(diǎn)是閱卷快,系統(tǒng)可以在考試結(jié)束時(shí)當(dāng)場(chǎng)給出客觀題考試成績(jī),計(jì)算機(jī)閱卷給了考生最大的公平感。本文中研究了基于Web的在線考試系統(tǒng)―系統(tǒng)框架設(shè)計(jì)與開發(fā)設(shè)計(jì)與實(shí)現(xiàn),包括系統(tǒng)需求分析和系統(tǒng)框架功能設(shè)計(jì)與實(shí)現(xiàn)。國(guó)內(nèi)外研究現(xiàn)狀網(wǎng)絡(luò)考試系統(tǒng)極大地提高了教學(xué)的靈活性,現(xiàn)在在許多領(lǐng)域已經(jīng)有了廣泛的應(yīng)用。在國(guó)外最有影響的案例就是ETS(美國(guó)教育考試中心)舉辦的GRE(美國(guó)研究生入學(xué)考試)的計(jì)算機(jī)化考試,它使考試由原來的每年只能有兩次參加考試的機(jī)會(huì)變成了每個(gè)工作日都可以參加的考試,大大提高了工作的效率。在我國(guó),經(jīng)過這么多年在IT業(yè)的發(fā)展及經(jīng)驗(yàn)的積累,雖然數(shù)字化教育已經(jīng)蓬勃地發(fā)展起來,但是目前學(xué)校與社會(huì)上的各種考試大都采用傳統(tǒng)的考試方式,在此方式下,組織一次考試至少要經(jīng)過五個(gè)步驟,即人工出題、考生考試、人工閱卷、成績(jī)?cè)u(píng)估和試卷分析。然而在這個(gè)過程中人工手動(dòng)出題和試題的選擇是最為復(fù)雜的,顯然,隨著考試類型的不斷增加及考試要求的不斷提高,教師的工作量將會(huì)越來越大,并且其工作將是一件十分煩瑣和非常容易出錯(cuò)的事情,可以說傳統(tǒng)的考試方式已經(jīng)不能適應(yīng)現(xiàn)代考試的需要。因此在國(guó)內(nèi)也出現(xiàn)了比較適合自己本國(guó)特色的在線考試系統(tǒng)如:杰佛通用在線考試系統(tǒng),新為在線考試系統(tǒng)等。本課題研究的意義本系統(tǒng)主要用來緩解傳統(tǒng)考試所需要的繁瑣工作流程,組織試題、印刷試卷、組織考試、監(jiān)考防作弊、收卷判分、統(tǒng)計(jì)結(jié)果等,通過本系統(tǒng),可以將以上考試的全部流程,完全借助計(jì)算機(jī)系統(tǒng)來實(shí)現(xiàn),從而減輕教師的工作負(fù)擔(dān)及提高工作效率,與此同時(shí)也提高了考試的質(zhì)量,使考試更趨于公證、客觀、科學(xué)性進(jìn)一步的激發(fā)了學(xué)生的學(xué)習(xí)興趣。系統(tǒng)需求分析SMART系統(tǒng)框架在實(shí)現(xiàn)上要求采用在J2EE領(lǐng)域中比較流行的SSH框架組合方式,并結(jié)合系統(tǒng)自身的一些特點(diǎn)來實(shí)現(xiàn)適合于本系統(tǒng)框架設(shè)計(jì),該系統(tǒng)的一些非功能性的需求如下:可擴(kuò)展性要求一般來說,軟件的可擴(kuò)展性決定著其適應(yīng)變更能力的大小。事后我們總是可以很容易地評(píng)價(jià)某個(gè)程序是可擴(kuò)展的還是不可擴(kuò)展的,但是要想使這個(gè)系統(tǒng)在今后真正派上用場(chǎng),我們必須事先就對(duì)它有個(gè)判斷。一個(gè)系統(tǒng)一般都是要在不斷升級(jí)的過程中去結(jié)合用戶的需求來完善自身功能,因此該系統(tǒng)要求采用清晰的接口把對(duì)象的實(shí)現(xiàn)與它的交互分離開來,特定的實(shí)現(xiàn)就可以獨(dú)立于應(yīng)用的其他部分,各個(gè)實(shí)現(xiàn)也可以在將來很方便地修改、升級(jí)甚至徹底替換。這時(shí)的應(yīng)用不再是一個(gè)單獨(dú)的東西,而是一個(gè)系統(tǒng)中半獨(dú)立的組件。多個(gè)開發(fā)者可以在相互不破壞彼此成果或者甚至在不了解全局場(chǎng)景的情況下協(xié)同開發(fā)。組件提供了特定的功能,允許獨(dú)立地測(cè)試,也可以重用于多個(gè)應(yīng)用中。如果組件之間工作分配及接口是很清晰的,這樣的軟件就很容易擴(kuò)展??删S護(hù)性要求系統(tǒng)在開發(fā)完成以后,后期的維護(hù)也是一個(gè)項(xiàng)目中重要的一環(huán),包括為了滿足用戶的使用體驗(yàn)對(duì)代碼所作的修改;對(duì)上線后長(zhǎng)時(shí)間運(yùn)行過程中所出現(xiàn)的BUG所作的修改等等這些需求,都是要求一個(gè)系統(tǒng)是具有可維護(hù)性的特性的??缮炜s性要求可伸縮性和性能是緊密相關(guān)的,但是它們并不完全相同??缮炜s性可以廣義地定義為應(yīng)用在請(qǐng)求數(shù)目增長(zhǎng)時(shí)維護(hù)性能的能力。在SMART系統(tǒng)中要求達(dá)到一個(gè)地市州級(jí)地區(qū)教育系統(tǒng)內(nèi)的全體學(xué)生提供在線考試服務(wù),并發(fā)數(shù)應(yīng)在10000人以上。在本系統(tǒng)架構(gòu)的中是采用分層的技術(shù),這將可以很好的滿足可擴(kuò)展性與可維護(hù)性的要求,但是各層之間的通信又反過來制約了伸縮性。因此,就要求我們?cè)诩軜?gòu)設(shè)計(jì)的時(shí)候使用有成效的實(shí)踐經(jīng)驗(yàn)來連接這些層次??煽啃砸罂煽康能浖谒袝r(shí)刻都會(huì)按照預(yù)期的那樣執(zhí)行。與可伸縮性類似,一個(gè)可靠的系統(tǒng)取決于對(duì)其底層組件的可預(yù)測(cè)性。從一個(gè)用戶的角度來看,可靠性是對(duì)整個(gè)系統(tǒng)的判斷,包括硬件、軟件和網(wǎng)絡(luò)元素。如果一個(gè)單獨(dú)的組件發(fā)生故障了,并且用戶無法訪問應(yīng)用或者應(yīng)用工作不正確了,那么整個(gè)系統(tǒng)就是不可靠的。在SMART系統(tǒng)中的需求中,可靠性是首當(dāng)其沖的,特別體現(xiàn)在考試的過程中。如果在考試的過程中系統(tǒng)出問題了,或者在考試后的閱卷中系統(tǒng)算錯(cuò)分了,這都將是災(zāi)難性的錯(cuò)誤,從而導(dǎo)致嚴(yán)重的后果。因此,保證SMART系統(tǒng)的可靠性的至關(guān)重要的。系統(tǒng)開發(fā)環(huán)境及實(shí)現(xiàn)關(guān)鍵技術(shù)硬件環(huán)境CPU:AMDSempron(tm)2500+內(nèi)存:1G硬盤:80G軟件環(huán)境操作系統(tǒng):MicrosoftWindowsServer2003顯示設(shè)置:SAMSUNGSyncMaster795MB應(yīng)用軟件:SQLServer2000+Eclipse3.1.2+JDK1.5+ApacheTomcat5.5.15系統(tǒng)實(shí)現(xiàn)的關(guān)鍵技術(shù)AJAX技術(shù)AJAX全稱為“AsynchronousJavaScriptandXML”(異步JavaScript和XML),該技術(shù)并不是一種新的技術(shù),實(shí)際上是多種技術(shù)的綜合,包括JavaScript、XHML和CSS、DOM、XMLXSL和XMLHttpRequest。其中使用XHML和CSS作為標(biāo)準(zhǔn)化的呈現(xiàn),使用XMLHttpRequest作為異步數(shù)據(jù)的讀取,使用JavaScript綁定和處理所有數(shù)據(jù)。在AJAX提出之前,業(yè)界對(duì)于上述技術(shù)都只是單獨(dú)的使用,沒有綜合使用,也是由于之前的技術(shù)需求所決定的。與傳統(tǒng)的Web應(yīng)用不同,AJAX采用異步交互過程。AJAX在用戶與服務(wù)器之間引入一個(gè)中間媒介,從而消除了網(wǎng)絡(luò)交互過程中的處理-等待-處理-等待缺點(diǎn)。用戶的瀏覽器在執(zhí)行任務(wù)時(shí)即裝載了AJAX引擎。AJAX引擎用JavaScript語言編寫,通常藏在一個(gè)隱藏的框架中。它負(fù)責(zé)編譯用戶界面及與服務(wù)器之間的交互。AJAX引擎允許用與應(yīng)用軟件之間的交互過程異步進(jìn)行,獨(dú)立于用戶與網(wǎng)絡(luò)服務(wù)器間的交流?,F(xiàn)在,可以用JavaScript調(diào)用AJAX引擎來代替產(chǎn)生一個(gè)HTTP的用戶動(dòng)作,內(nèi)存中的數(shù)據(jù)編輯、頁面導(dǎo)航、數(shù)據(jù)校驗(yàn)這些不需要重新載入整個(gè)頁面的需求可以交給AJAX來執(zhí)行。圖1Ajax的web應(yīng)用模型單例模式單例模式作為設(shè)計(jì)模式中的創(chuàng)建模式類型中的一種,從其名字可以看出該模式確保了一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。這類稱為單例類。單例模式具有以下的特點(diǎn):?jiǎn)卫愔豢捎幸粋€(gè)實(shí)例。單例類必須自己創(chuàng)建自己這惟一的實(shí)例。單例類必須給所有其他對(duì)象提供這一實(shí)例。在Java中單例模式一般有三種實(shí)現(xiàn)其分別為:餓漢式單例類;懶漢式單例類;登記式單例類。餓漢式單例類:餓漢式單例類是在Java語言里實(shí)現(xiàn)得最為簡(jiǎn)便的單例類,下面所示的類圖描述了一個(gè)餓漢式單例類的典型實(shí)現(xiàn)。圖2餓漢式單例類類圖從類圖中可以看出,在這個(gè)類被加載時(shí),靜態(tài)變量m_instance會(huì)被初始化,此時(shí)類的私有構(gòu)造子會(huì)被調(diào)用。這時(shí)候,單例類的惟一實(shí)例就被創(chuàng)建出來了。Java語言中單例類的一個(gè)最重要的特點(diǎn)是類的構(gòu)造子是私有的,從而避免外界利用構(gòu)造子直接創(chuàng)建出任意多的實(shí)例。值得指出的是,由于構(gòu)造子是私有的,因此,此類不能被繼承。懶漢式單例類:與餓漢式單例類相同之處是,類的構(gòu)造子是私有的。與餓漢式單例類不同的是,懶漢式單例類在第一次被引用時(shí)將自己實(shí)例化。如果加載器是靜態(tài)的,那么在懶漢式單例類被加載時(shí)不會(huì)將自己實(shí)例化。如圖3所示,類圖中給出了一個(gè)典型的懶漢式單例類實(shí)現(xiàn)。圖3懶漢式單例類類圖登記式單例類:登記式單例類是GoF為了克服餓漢式單例類及懶漢式單例類均不可繼承的缺點(diǎn)而設(shè)計(jì)的。在本例中把他們的例子翻譯為Java語言,并將它自己實(shí)例化的方式從懶漢式改為餓漢式。只是它的子類實(shí)例化的方式只能是懶漢式的,這是無法改變的。如圖4所示是登記式單例類的一個(gè)例子,圖中的關(guān)系線表明,此類已將自己實(shí)例化。圖4登記式單例類IoC模式IoC(InversionofControl)模式又稱DI(依賴注入),從GoF設(shè)計(jì)模式中,我們已經(jīng)習(xí)慣一種思維編程方式:InterfaceDrivenDesign接口驅(qū)動(dòng),接口驅(qū)動(dòng)有很多好處,可以提供不同靈活的子類實(shí)現(xiàn),增加代碼穩(wěn)定和健壯性等等,但是接口一定是需要實(shí)現(xiàn)的,也就是如下語句遲早要執(zhí)行:AInterfacea=newAInterfaceImp();AInterfaceImp是接口AInterface的一個(gè)子類,IoC模式可以延緩接口的實(shí)現(xiàn),根據(jù)需要實(shí)現(xiàn),打個(gè)比喻:接口如同空的模型套,在必要時(shí),需要向模型套注射石膏,這樣才能成為一個(gè)模型實(shí)體,因此,將人為控制接口的實(shí)現(xiàn)成為“注射”。其實(shí)IoC模式也是解決調(diào)用者和被調(diào)用者之間的一種關(guān)系,上述AInterface實(shí)現(xiàn)語句表明當(dāng)前是在調(diào)用被調(diào)用者AInterfaceImp,由于被調(diào)用者名稱寫入了調(diào)用者的代碼中,這產(chǎn)生了一個(gè)接口實(shí)現(xiàn)的原罪:彼此聯(lián)系,調(diào)用者和被調(diào)用者有緊密聯(lián)系,在UML中是用依賴Dependency表示。但是這種依賴在分離關(guān)注的思維下是不可忍耐的,必須切割,實(shí)現(xiàn)調(diào)用者和被調(diào)用者解耦,新的IoC模式DependencyInjection模式由此產(chǎn)生了,DependencyInjection模式是依賴注射的意思,也就是將依賴先剝離,然后在適當(dāng)時(shí)候再注射進(jìn)入。JAVA反射機(jī)制“反射”是Java程序開發(fā)語言的特征之一,它允許運(yùn)行中的Java程序?qū)ψ陨磉M(jìn)行檢查,或者說“自審”,并能直接操作程序的內(nèi)部屬性。Java的反射機(jī)制是使其具有動(dòng)態(tài)特性的非常關(guān)鍵的一種機(jī)制,這個(gè)機(jī)制允許程序在運(yùn)行時(shí)透過ReflectionAPIs取得任何一個(gè)已知名稱的class的內(nèi)部信息,包括其modifiers(諸如public,static等等)、superclass(例如Object)、實(shí)現(xiàn)之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于運(yùn)行時(shí)改變fields內(nèi)容或喚起methods。JSP自定義標(biāo)簽要在JSP中實(shí)現(xiàn)自定義標(biāo)簽,那么要求必須實(shí)現(xiàn)一個(gè)相應(yīng)的標(biāo)簽處理類及寫該標(biāo)簽的TLD文件,在JSP中一個(gè)自定義的action也就是對(duì)tag處理類,是基于一個(gè)bean類型的類,該類里面伴隨的getter/setter方法對(duì)應(yīng)于tag中的屬性。另外這個(gè)taghandler類還必須要實(shí)現(xiàn)JSP規(guī)范中與tag相關(guān)的三個(gè)接口中的一個(gè)。這三個(gè)接口如下所示:TagIterationTagBodyTagIterationTag繼承了Tag,BodyTag繼承了IterationTag在API中提供的兩個(gè)類使開發(fā)自定義的標(biāo)簽變得容易,它們分別為TagSupport、BodyTagSupport。TagSupport實(shí)現(xiàn)了Tag與IterationTag的接口,而BodyTagSupport除了實(shí)現(xiàn)了那兩個(gè)接口外還實(shí)現(xiàn)了BodyTag接口。圖5展現(xiàn)了整個(gè)標(biāo)簽處理過程:圖5標(biāo)簽處理的生命周期系統(tǒng)總體框架設(shè)計(jì)總體結(jié)構(gòu)說明圖6系統(tǒng)總體框架示意圖表現(xiàn)層如圖1所示,在整個(gè)SMART系統(tǒng)的總體框架中表現(xiàn)層是結(jié)合J2EE領(lǐng)域的開源框架Struts來實(shí)現(xiàn)的,Struts能充分滿足應(yīng)用開發(fā)的需求,簡(jiǎn)單易用,該框架是基于MVC模式的來構(gòu)建的,該模式將表達(dá)層分解為自包含的和可重用的幾個(gè)部分,當(dāng)用戶通過瀏覽器發(fā)起HTTP請(qǐng)求時(shí),該框架將利用其ActionForm將請(qǐng)求頁面的非對(duì)象化的數(shù)據(jù)轉(zhuǎn)化為對(duì)象,交由其對(duì)應(yīng)Action來處理?;贛VC模式的整個(gè)交互的序列圖如圖7所示:圖7MVC模式中的交互開發(fā)人員利用該框架進(jìn)行開發(fā)時(shí),不用再自己實(shí)現(xiàn)全套MVC模式,節(jié)省了大量的開發(fā)時(shí)間。業(yè)務(wù)層如圖1所示,在表現(xiàn)層與業(yè)務(wù)層之間利用一個(gè)公共代理類來完成交互,該代理類采用單例模式設(shè)計(jì)開發(fā),在整個(gè)框架中起到了如下幾點(diǎn)作用:減少耦合性避免生成大量的臨時(shí)對(duì)象在該代理類,實(shí)現(xiàn)一個(gè)對(duì)相應(yīng)業(yè)務(wù)邏輯的處理方法,該方法的參數(shù)為一個(gè)封裝好相應(yīng)的頁面數(shù)據(jù)對(duì)象、要調(diào)用的業(yè)務(wù)類的名稱及該業(yè)務(wù)類中相應(yīng)的處理方法名的類。在該層中利用了Spring框架中的IoC模式(英文全名為InversionofControl即反轉(zhuǎn)模式),該模式類似于著名的好萊塢原則:“Don'tcallus,we'llcallyou”,后被MartinFowler改名為DependencyInjection依賴注射,也就是將類之間的關(guān)系通過第三方進(jìn)行注射,不需要類自己去解決調(diào)用關(guān)系,實(shí)現(xiàn)了調(diào)用者和被調(diào)用者之間的解耦分離。IoC的引入并沒有消除接口與實(shí)現(xiàn)類之間的聯(lián)系,它的實(shí)質(zhì)在于只是將這種聯(lián)系轉(zhuǎn)移了。在Spring的IoC實(shí)現(xiàn)中這關(guān)系被轉(zhuǎn)移到相應(yīng)的XML配置文件中,由Spring框架來提供對(duì)這種關(guān)系的依賴注入。其原理如圖8所示:圖8IoC模式在Spring中的依賴注入持久層在SMART系統(tǒng)的整體框架中的持久層,是采用基于現(xiàn)有持久層框架的實(shí)現(xiàn)模式,在這種模式中,將最為繁瑣的基于JDBC的OR映射工作,交由第三方組件(本框架中采用開源的Hibernate)來完成,這樣就會(huì)在對(duì)數(shù)據(jù)訪問對(duì)象進(jìn)行編碼時(shí),大大的簡(jiǎn)化了一些繁瑣而又復(fù)雜的編碼工作,只需要利用Hibernate提供的API,對(duì)持久化對(duì)象進(jìn)行操作。在該持久層框架提供了優(yōu)秀的性能優(yōu)化機(jī)制,如內(nèi)置的數(shù)據(jù)庫(kù)連接池支持,PreparedStatement緩存、數(shù)據(jù)緩存等。這些優(yōu)化機(jī)制的綜合使用大大提升了系統(tǒng)的性能。在SMART系統(tǒng)的持久層中,對(duì)一些常用的添加、刪除、更新數(shù)據(jù)庫(kù)操作進(jìn)行了抽象封裝。并在Hibernate中配置相應(yīng)的數(shù)據(jù)庫(kù)連接池實(shí)現(xiàn)。圖9基于現(xiàn)有持久層框架的實(shí)現(xiàn)模式總體結(jié)構(gòu)設(shè)計(jì)與建模公共代理機(jī)制的設(shè)計(jì)在大部分采用B/S結(jié)構(gòu)的web應(yīng)用中,用戶與系統(tǒng)的交互都是要涉及到相應(yīng)的交互數(shù)據(jù)、業(yè)務(wù)邏輯,因此在本系統(tǒng)的框架設(shè)計(jì)中考慮到將這些交互中涉及到的因素全部封裝到一個(gè)Carrier類中,再通過一個(gè)單例類來實(shí)現(xiàn)表現(xiàn)層與業(yè)務(wù)層的交互,這樣用戶操作時(shí)不用每次都去new一個(gè)臨時(shí)的對(duì)象,也實(shí)現(xiàn)各功能模塊中子程序之間的解耦。系統(tǒng)接口設(shè)計(jì)Java程序設(shè)計(jì)語言提供了兩種機(jī)制,可以用來定義一個(gè)允許多個(gè)實(shí)現(xiàn)的類型:接口和抽象類。兩種機(jī)制之間最明顯的區(qū)別是,抽象類允許包含某些方法的實(shí)現(xiàn),但是接口是不允許的。一個(gè)更為重要的不同之處在于,為了實(shí)現(xiàn)一個(gè)由抽象類定義的類型,它必須成為抽象類的一個(gè)子類。任何一個(gè)類,只要它定義了所有要求的方法,并且遵守通用約定,那么它就允許實(shí)現(xiàn)一個(gè)接口,不管這個(gè)類位于類層次的哪個(gè)地方。因?yàn)镴ava只允許單繼承,所以,抽象類作為類型定義受到了極大的限制。接口使得我們可以構(gòu)造出非層次結(jié)構(gòu)的類型框架。例如:假設(shè)有一個(gè)接口代表一個(gè)singer(歌唱家),另一個(gè)接口代表一個(gè)songwriter(作曲家):publicinterfaceSinger{AudioClipSing(Songs);}publicinterfaceSongWriter{Songcompose(booleanhit);}在現(xiàn)實(shí)生活中,有些歌唱家本身也是作曲家。因?yàn)槭鞘褂媒涌诙怀橄箢悂矶x這些類型,所以對(duì)于一個(gè)類而言,它同時(shí)實(shí)現(xiàn)Singer和Songwriter是完全允許的。實(shí)際上還可以定義第三個(gè)接口,它同時(shí)擴(kuò)展了Singer和Songwriter,并且加入一些適合于這種組合的新方法:publicinterfaceSingerSongwriterextendsSinger,Songwriter{AudioClipstrum();VoidactSensitive();}如果要滿足這樣的一種靈活性,抽象類是不可能完成的。雖然接口不允許包含方法的實(shí)現(xiàn),但是,使用接口定義類型并不妨礙你為程序員提供實(shí)現(xiàn)上的幫助,在本系統(tǒng)的接口設(shè)計(jì)與實(shí)現(xiàn)中借鑒了JavaAPI中的將接口類與抽象類的優(yōu)點(diǎn)結(jié)合起來,將期望導(dǎo)出的每一個(gè)重要接口,都提供一個(gè)抽象類的骨架實(shí)現(xiàn)(skeletalimplementation)類。按照慣有編碼命名習(xí)慣,將該骨架實(shí)現(xiàn)類命名為AbstractInterface在該系統(tǒng)中采用這種方式的來設(shè)計(jì)的接口有Business(業(yè)務(wù))接口,DAO(數(shù)據(jù)訪問對(duì)象)接口。自定義標(biāo)簽的設(shè)計(jì)在對(duì)系統(tǒng)的實(shí)現(xiàn)中,由于在表現(xiàn)層使用的是基于MVC的Struts框架,該框架中為了在表現(xiàn)層的JSP頁面中不混合大量的Java代碼,及保持JSP頁面的程序的容易讀性而提供了相應(yīng)的Struts自己的一套標(biāo)簽,但是考慮到本系統(tǒng)的實(shí)際應(yīng)用的功能實(shí)現(xiàn)。且這些功能實(shí)現(xiàn)又是Struts標(biāo)簽沒法滿足要求的,因此在該系統(tǒng)框架中實(shí)現(xiàn)了自己的一套標(biāo)簽,主要有<smart:submit></smart:submit>,<smart:select></smart:select>。<smart:submit>標(biāo)簽:設(shè)計(jì)意圖:在一般的基于B/S結(jié)構(gòu)的web應(yīng)用系統(tǒng)中,在頁面上經(jīng)常是會(huì)涉及到添加、編輯、刪除幾種常用的功能,在早期的一些開發(fā)編碼中,相當(dāng)一部分人是將這幾種功能分為多個(gè)頁面來實(shí)現(xiàn),例如:添加用一個(gè)add.jsp頁面,編輯用一個(gè)edit.jsp頁面,刪除用一個(gè)delete.jsp頁面。而這些的頁面的代碼80%以上都基本上是一樣的,只不過是上顯示的按鈕及在點(diǎn)擊相應(yīng)的提交給后臺(tái)處理方法不一樣。為了達(dá)到在一個(gè)頁面上面實(shí)現(xiàn)添加、編輯、刪除功能,并且要保持頁面代碼的清晰可讀性,因此,在本系統(tǒng)框架中,封裝了自定義的提交標(biāo)簽。表1<smart:submit>標(biāo)簽屬性列表屬性名稱屬性描述備注Id該標(biāo)簽元素的id。Name該標(biāo)簽元素的名稱。Property當(dāng)點(diǎn)擊該標(biāo)簽所顯示的內(nèi)容后所提交的參數(shù)名稱Message該標(biāo)簽在頁面上所顯示的值,等同于html標(biāo)簽組里面的input標(biāo)簽的value屬性。displayControl是否要對(duì)該標(biāo)簽的內(nèi)容是否在頁面上顯示出來作控制。只有兩種值true/falseImage該標(biāo)簽在頁面顯示的內(nèi)容的背景圖片。onClick當(dāng)點(diǎn)擊該標(biāo)簽所展現(xiàn)的內(nèi)容后所觸發(fā)的事件。<smart:select>標(biāo)簽:設(shè)計(jì)意圖:在一般的基于B/S結(jié)構(gòu)的web應(yīng)用系統(tǒng)中,在頁面上經(jīng)常要用到下拉框,且在JSP頁面加載出來時(shí)就有一組相應(yīng)的值,為了在加載該頁面時(shí)動(dòng)態(tài)的、帶條件的取其標(biāo)簽相應(yīng)的鍵/值對(duì),因此,在本系統(tǒng)框架中,封裝了自定義的下拉菜單。表2<smart:select>標(biāo)簽屬性列表屬性名稱屬性描述備注name該標(biāo)簽元素的名稱。property該標(biāo)簽元素屬性名稱,與Struts中的html標(biāo)簽的property元素是一樣的含義,對(duì)應(yīng)于FormBean里面的一個(gè)域。content該標(biāo)簽屬性為標(biāo)簽取值的業(yè)務(wù)代碼。multiple該屬性同html標(biāo)簽組中的select標(biāo)簽的multiple屬性。size該屬性同html標(biāo)簽組中的select標(biāo)簽的size屬性。style該屬性同html標(biāo)簽組中的select標(biāo)簽的style屬性。relationValue該屬性為在加載該標(biāo)簽相應(yīng)的值時(shí)的條件?;赟truts表現(xiàn)層設(shè)計(jì)大部分基于B/S結(jié)構(gòu)的web應(yīng)用系統(tǒng)中,在頁面上經(jīng)常會(huì)出現(xiàn)一個(gè)以上的功能按鈕,而這些功能按鈕基本上都是對(duì)應(yīng)于后臺(tái)的一個(gè)操作實(shí)現(xiàn),由于在本系統(tǒng)中的表現(xiàn)層選用較為成熟Struts框架,該框架中最為核心的部分要屬控制器控制轉(zhuǎn)發(fā)相應(yīng)的HttpRequest,其中的LookupDispatchAction類是允許你指定一個(gè)具有多個(gè)方法的類,每一個(gè)方法的調(diào)用都基于配置文件中指定的一個(gè)特殊請(qǐng)求參數(shù)值,利用該參數(shù)值反向查詢資源綁定,并將它與類中的一個(gè)方法進(jìn)行匹配。從這些功能可以看出Struts是滿足對(duì)系統(tǒng)頁面上多個(gè)功能按鈕與實(shí)現(xiàn)的綁定。因此,在對(duì)本系統(tǒng)進(jìn)行架構(gòu)設(shè)計(jì)的時(shí)候,考慮建立一個(gè)抽象的BaseAction類,該類繼承LookupDispatchAction,實(shí)現(xiàn)LookupDispatchAction類中的getKeyMethodMap方法,在方法中返回本系統(tǒng)中請(qǐng)求參數(shù)值與資源文件中參數(shù)值的鍵/值對(duì)。實(shí)現(xiàn)一些對(duì)于所有的Action都是有可能用到的公共方法,包括從session中得到用戶的信息;對(duì)頁面上按鈕是否顯示的控制;檢查用戶權(quán)限;對(duì)公共業(yè)務(wù)邏輯接口的調(diào)用等等。在涉及到系統(tǒng)的具體開發(fā)實(shí)現(xiàn)的時(shí)候,要求所有開發(fā)人員在寫自己的Action的時(shí)候統(tǒng)一繼承BaseAction。基于Hibernate持久層設(shè)計(jì)本系統(tǒng)的持久層是基于開源的Hibernate來實(shí)現(xiàn)的,在了解到相關(guān)的Hibernate特性后,在本系統(tǒng)的框架中,從如下幾個(gè)方面對(duì)其進(jìn)行了進(jìn)一步的封裝。對(duì)產(chǎn)生Session實(shí)例進(jìn)行封裝設(shè)計(jì)意圖:Session是Hibernate持久化操作的基礎(chǔ)。注意這里Session的含義,它與傳統(tǒng)意義上的Web層的HttpSession并沒有什么關(guān)系。HibernateSession之與Hibernate,相當(dāng)于JDBCConnection與JDBC。Session作為貫穿Hibernate的持久化管理器核心,提供了眾多持久化方法,如save、update、delete,find等。通過這些方法即可透明地完成對(duì)象的增刪改查(CRUD)。但是值得注意的是,HibernateSession的設(shè)計(jì)是非線程安全的,也就是說,一個(gè)Session實(shí)例同時(shí)只可由一個(gè)線程使用,同一個(gè)Session實(shí)例的多線程并發(fā)調(diào)用將導(dǎo)致難以預(yù)知的錯(cuò)誤。因此在本框架中對(duì)通過SessionFactory所產(chǎn)生的Session。進(jìn)行了線程安全性的處理,在實(shí)現(xiàn)的HibernateSessionFactory類新建一個(gè)Java中的ThreadLocal類,將每次產(chǎn)生Session放入該類中,這樣就達(dá)到了線程安全性的效果了。當(dāng)產(chǎn)生Session而創(chuàng)建SessionFactory實(shí)例時(shí),也要注意對(duì)SessionFactory重用的問題,因?yàn)镾essionFactory中保存了對(duì)應(yīng)當(dāng)前數(shù)據(jù)庫(kù)配置的所有映射關(guān)系,同時(shí)也負(fù)責(zé)維護(hù)當(dāng)前的二級(jí)緩存和StatementPool。由此可見,SessionFactory的創(chuàng)建過程必然非常復(fù)雜、代價(jià)高昂,而這也意味,在系統(tǒng)設(shè)計(jì)中要充分考慮到SessionFactory的重用策略。由于SessionFactory采取了線程安全的設(shè)計(jì),可由多個(gè)線程并發(fā)調(diào)用,大多數(shù)情況下,一個(gè)應(yīng)用中針對(duì)一個(gè)數(shù)據(jù)庫(kù)共享一個(gè)SessionFactory實(shí)例即可。對(duì)通常的數(shù)據(jù)庫(kù)操作進(jìn)行封裝設(shè)計(jì)意圖: 在系統(tǒng)的設(shè)計(jì)架構(gòu)中考慮到代碼的重用性,因此對(duì)一些通用的數(shù)據(jù)庫(kù)的操作都將其封裝到一個(gè)公共類中,這樣就減少了系統(tǒng)開發(fā)人員的代碼編寫工作量,也避免了同功能代碼的重復(fù)編寫。類圖圖10公共數(shù)據(jù)傳輸類圖11公共代理類圖12表現(xiàn)層基于Ajaxtags的servlet實(shí)現(xiàn)類圖13表現(xiàn)層的基本Action類圖14持久化對(duì)象接口圖15表現(xiàn)層自定義標(biāo)簽相關(guān)實(shí)現(xiàn)類圖16系統(tǒng)相關(guān)異常處理類圖17異常處理工具類圖18數(shù)據(jù)訪問對(duì)象、業(yè)務(wù)相關(guān)接口及其實(shí)現(xiàn)類、對(duì)數(shù)據(jù)庫(kù)操作及日志類圖19日期工具類序列圖圖20用戶與系統(tǒng)交互的序列圖系統(tǒng)總體框架具體實(shí)現(xiàn)各層具體實(shí)現(xiàn)表現(xiàn)層在本系統(tǒng)中的表現(xiàn)層實(shí)現(xiàn)了一個(gè)抽象的BaseAction類,該類繼承LookupDispatchAction,實(shí)現(xiàn)LookupDispatchAction類中的getKeyMethodMap方法,在方法中返回本系統(tǒng)中請(qǐng)求參數(shù)值與資源文件中參數(shù)值的鍵/值對(duì)。實(shí)現(xiàn)一些對(duì)于所有的Action都是有可能用到的公共方法。部分代碼如下所示:publicabstractclassBaseActionextendsLookupDispatchAction{//實(shí)現(xiàn)父類的方法 protectedMapgetKeyMethodMap(){ Mapmap=newHashMap(); map.put("button.save","save"); map.put("button.cancel","cancel"); ….. returnmap; }//統(tǒng)一的業(yè)務(wù)邏輯調(diào)用方法 protectedObjectcall(Carriervo){PublicProxyproxy=PublicProxy.getInstance();Objectobj=null;try{obj=cess(vo);}catch(ApplicationExceptionex){throwex;}returnobj;}//顯示頁面按鈕 protectedvoidshowButton(StringbuttonName){MapbtnMap=getButtonMap();btnMap.put(buttonName,"true");}//隱藏頁面按鈕protectedvoidhideButton(StringbuttonName){MapbtnMap=getButtonMap();btnMap.put(buttonName,"false");}…………………}業(yè)務(wù)層在本系統(tǒng)中的業(yè)務(wù)層實(shí)現(xiàn)了一個(gè)單例的PublicProxy類,系統(tǒng)中所有的表現(xiàn)層與業(yè)務(wù)層的交互都要通過這個(gè)類來實(shí)現(xiàn)。該類結(jié)合了Spring框架的相應(yīng)的API對(duì)業(yè)務(wù)接口與其實(shí)現(xiàn)的對(duì)應(yīng)關(guān)系的xml文件進(jìn)行了解析,詳見下面的類中的process方法中對(duì)xml文件的讀取。publicclassPublicProxy{privatestaticPublicProxyinstance=null;privatestaticObjectlock=newObject();privatePublicProxy(){}//返回唯一的實(shí)例publicstaticPublicProxygetInstance(){if(instance==null){synchronized(lock){if(instance==null){instance=newPublicProxy();}}}returninstance;}//相應(yīng)的業(yè)務(wù)處理公共接口publicObjectprocess(Carrieraop){Businessbusiness=null;ApplicationContextcontext=newClassPathXmlApplicationContext("beans/*.xml");business=(Business)context.getBean(aop.getBusiness());returncess(aop);}}持久層本系統(tǒng)的持久層是基于開源的Hibernate來實(shí)現(xiàn)的,結(jié)合Hibernate提供的API提供相應(yīng)實(shí)現(xiàn)的部分代碼如下所示:publicclassHibernateSessionFactory{…privatestaticfinalThreadLocalthread=newThreadLocal();//打開一個(gè)新的sessionpublicstaticSessionopenSession(booleanuseCurrent){Sessionsession=null;if(useCurrent&&thread.get()!=null){session=(Session)thread.get();}if(session==null){try{if(factory==null){factory=newConfiguration().configure(CONFIG_FILE_LOCATION).buildSessionFactory();}session=factory.openSession();//將session放入ThreadLocal中實(shí)現(xiàn)線程安全性設(shè)計(jì)thread.set(session);}catch(HibernateExceptionex){ex.printStackTrace();}}returnsession;}………………}測(cè)試與分析測(cè)試環(huán)境本次測(cè)試的環(huán)境的硬件環(huán)境與系統(tǒng)的開發(fā)環(huán)境中的硬件環(huán)境相一致,只是在軟件環(huán)境中用了開源的ApacheJmeter,它是一個(gè)100%的純java桌面應(yīng)用,用于壓力測(cè)試和性能測(cè)量。它最初被設(shè)計(jì)用于Web應(yīng)用測(cè)試但后來擴(kuò)展到其他測(cè)試領(lǐng)域。測(cè)試結(jié)果在本次測(cè)試中,用Jmeter作了相應(yīng)的壓力測(cè)試,其他的測(cè)試都是通過手工寫程序完成各層的功能測(cè)試,在通過對(duì)Jmeter的在用戶數(shù)、循環(huán)次數(shù)的配置,對(duì)本系統(tǒng)框架作的幾次壓力測(cè)試。壓力測(cè)試部分結(jié)果如下:用Jmeter模擬了1000個(gè)用戶并發(fā)一次請(qǐng)求,循環(huán)5次后的結(jié)果圖如下:圖21JMeter測(cè)試結(jié)果圖用Jmeter模擬了5000個(gè)用戶并發(fā)一次請(qǐng)求,循環(huán)5次后的結(jié)果圖如下:圖22JMeter測(cè)試結(jié)果圖結(jié)果分析在對(duì)本系統(tǒng)進(jìn)行的各層的功能測(cè)試中,在分層測(cè)試的時(shí)候,各層程序功能運(yùn)行正常,對(duì)各層功能的銜接測(cè)試也達(dá)到了很好運(yùn)行效果,從功能上、性能上都能夠滿足系統(tǒng)需求分析中的要求。在對(duì)本系統(tǒng)進(jìn)行的壓力測(cè)試中,從JMeter測(cè)試結(jié)果圖顯示的樣本數(shù)目、平均、偏離、吞吐量、中值的數(shù)值可以看出本系統(tǒng)是滿足可伸縮性、可靠性要求的。結(jié)論通過本次課題的研究,在結(jié)合J2EE領(lǐng)域比較優(yōu)秀成熟
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 貴州2025年貴州省農(nóng)業(yè)科學(xué)院招聘47人筆試歷年參考題庫(kù)附帶答案詳解
- 銅陵2025年安徽銅陵郊區(qū)周潭鎮(zhèn)招聘鄉(xiāng)村振興專干和村級(jí)后備干部5人筆試歷年參考題庫(kù)附帶答案詳解
- 貴州2025年貴州六盤水師范學(xué)院招聘3人筆試歷年參考題庫(kù)附帶答案詳解
- 福建2025年福建師范大學(xué)招聘具有博士學(xué)位教學(xué)科研輔助等崗位工作人員4人筆試歷年參考題庫(kù)附帶答案詳解
- 白銀2025年甘肅白銀市靖遠(yuǎn)縣公安局招聘輔警30人筆試歷年參考題庫(kù)附帶答案詳解
- 甘肅2025年甘肅省地礦局所屬事業(yè)單位引進(jìn)高層次人才5人筆試歷年參考題庫(kù)附帶答案詳解
- 濰坊2025年山東濰坊市精神衛(wèi)生中心高層次人才和急需緊缺專業(yè)人才招聘12人筆試歷年參考題庫(kù)附帶答案詳解
- 濰坊2025年山東濰坊市精神衛(wèi)生中心校園招聘17人筆試歷年參考題庫(kù)附帶答案詳解
- 海南2025年海南省健康宣傳教育中心招聘事業(yè)編制人員筆試歷年參考題庫(kù)附帶答案詳解
- 安徽省阜陽市潁州區(qū)阜陽市第三中學(xué)2024-2025學(xué)年高二上學(xué)期1月期末英語試題(原卷版)
- 光儲(chǔ)充車棚技術(shù)方案設(shè)計(jì)方案
- 中建支吊架專項(xiàng)施工方案
- 維修驗(yàn)收單完
- 人員備案表模板
- 立法學(xué) 第五版 課件 第1-8章 緒論-立法準(zhǔn)備
- 手動(dòng)報(bào)警按鈕(建筑消防設(shè)施檢測(cè)原始記錄)
- XX學(xué)校初高貫通銜接培養(yǎng)實(shí)施方案
- 《蟬》虞世南課件
- 私募股權(quán)投資業(yè)務(wù)激勵(lì)管理辦法
- 礦山三級(jí)安全教育培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論