數(shù)據(jù)服務(wù)空間組合實(shí)現(xiàn)_第1頁
數(shù)據(jù)服務(wù)空間組合實(shí)現(xiàn)_第2頁
數(shù)據(jù)服務(wù)空間組合實(shí)現(xiàn)_第3頁
數(shù)據(jù)服務(wù)空間組合實(shí)現(xiàn)_第4頁
數(shù)據(jù)服務(wù)空間組合實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩82頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

摘要隨著計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)的飛速發(fā)展,互聯(lián)網(wǎng)上可用的數(shù)據(jù)資源劇增。數(shù)據(jù)在數(shù)據(jù)模型和數(shù)據(jù)模式上存在很大差異,形成了大量的異構(gòu)數(shù)據(jù)源。如何構(gòu)建一個(gè)便捷的數(shù)據(jù)集成平臺(tái),集成各種異構(gòu)的數(shù)據(jù)源中的數(shù)據(jù),滿足用戶個(gè)性化的數(shù)據(jù)集成需求,成為一個(gè)亟待解決的問題。數(shù)據(jù)服務(wù)空間(DataServiceSpace,簡稱DSS)系統(tǒng)是一個(gè)可以將網(wǎng)頁、WebAPI以及主流關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)封裝為服務(wù)并通過服務(wù)組合實(shí)現(xiàn)異構(gòu)數(shù)據(jù)集成的系統(tǒng)。本文在DSS系統(tǒng)的基礎(chǔ)上進(jìn)行了改進(jìn),優(yōu)化了創(chuàng)建服務(wù)的過程,增添了登錄注冊、用戶權(quán)限管理、多條件服務(wù)查詢、服務(wù)刪除、用戶個(gè)人信息管理、服務(wù)推送以及百度地圖功能。系統(tǒng)實(shí)現(xiàn)中采用的主要技術(shù)有AJAX、GWT、DWR等,其中,利用AJAX實(shí)現(xiàn)數(shù)據(jù)的無刷新提交,利用GWT實(shí)現(xiàn)Java代碼到JavaScript的快速轉(zhuǎn)換,利用DWR實(shí)現(xiàn)服務(wù)器端數(shù)據(jù)的推送。系統(tǒng)采用B/S架構(gòu)設(shè)計(jì),界面簡潔,方便操作,可以滿足普通用戶對各種異構(gòu)數(shù)據(jù)源中的數(shù)據(jù)的集成需求,為異構(gòu)數(shù)據(jù)源的集成帶來極大的便利。關(guān)鍵詞:數(shù)據(jù)服務(wù)空間;數(shù)據(jù)服務(wù)管理;地圖服務(wù)

AbstractWiththerapiddevelopmentofcomputernetworktechnology,availabledataresourcesontheInternetincreasedynamically.Thereisaenormousdifferenceintheirdatamodelsandpatterns,thusmanyheterogeneousdatasourcescomeinbeing.Formingaconvenientdataintegrationplatformtoimprovetheeffectiveuseofinformationdatatomeettheindividualneedsofdataintegrationhasbecomeanurgentproblemtobesolved.DataServiceSpace(DSSforshort)isasystemthatcanintegratedataasaservicefromtheWebPages,WebAPIs,andpopularRDBMSandalsocancombinetheseservicestointegratetheheterogeneousdatasources.BasedontheDSS,wemakeanimprovementinoptimizingtheprocessofcreatingaservice,addingthefunctionoflogin,registration,userrights’management,searchingserviceswithmultipleconditions,deletingservices,users'personalinformationmanagement,pushingservice,andanapplicationoftheBaiduMap.ThemaintechnologiesusedareAJAX,GWT,andDWR.AJAXisusedtosubmitdatawithoutrefresh,andGWTisusedtoconverttheJavacodetoJavaScriptcoderapidly.Inaddition,weuseDWRtopushmessagesoftheserver.ThesystemisdesignedwiththeB/Sarchitecturedesign.Itisveryeasytooperatebecauseofsimpleinterface.Itcanmeettheneedsofenduserstointegratedatafromheterogeneoussources,andbringgreatconvenienceinintegratingtheheterogeneousdatasources.Keywords:DataServiceSpace;DataServiceManagement;mapservice

目錄TOC\o"1-2"\h\z\u第一章緒論 51.1課題背景和意義 51.2研究開發(fā)現(xiàn)狀分析 51.3系統(tǒng)總體介紹 71.4論文組織 7第二章相關(guān)工具與技術(shù) 92.1相關(guān)工具 92.2相關(guān)技術(shù) 9第三章需求分析 133.1業(yè)務(wù)分析 133.2系統(tǒng)功能分析 183.3系統(tǒng)非功能分析 26第四章系統(tǒng)設(shè)計(jì) 294.1體系架構(gòu) 294.2功能模塊 294.3數(shù)據(jù)庫設(shè)計(jì) 314.4系統(tǒng)詳細(xì)設(shè)計(jì) 35第五章系統(tǒng)實(shí)現(xiàn) 405.1系統(tǒng)物理結(jié)構(gòu) 405.2系統(tǒng)物理部署 405.3主要功能的實(shí)現(xiàn) 425.4遇到的問題和解決方法 67第六章總結(jié)與展望 696.1總結(jié) 696.2展望 69參考文獻(xiàn) 70致謝辭 71附錄一英文原文 72附錄二中文翻譯 82

第一章緒論1.1課題背景和意義21世紀(jì)以來,隨著互聯(lián)網(wǎng)的快速普及和迅猛發(fā)展,信息以前所未有的速度不斷地增長,人們通過各種途徑產(chǎn)生了各式各樣的數(shù)據(jù),這些數(shù)據(jù)不僅量大而且結(jié)構(gòu)各異,有結(jié)構(gòu)化的數(shù)據(jù),如數(shù)據(jù)庫;半結(jié)構(gòu)化的數(shù)據(jù),如郵件、HTML等;以及非結(jié)構(gòu)化的數(shù)據(jù),如文本、音頻、視頻、圖像等。由于不同企業(yè)和部門對信息的需求不同,處理方式不同,所使用的信息系統(tǒng)也各不相同,使得不同數(shù)據(jù)源中的數(shù)據(jù)無法相互關(guān)聯(lián),形成了一個(gè)個(gè)的“信息孤島”。如何將這些孤立的數(shù)據(jù)信息集成起來,形成一個(gè)數(shù)據(jù)集成平臺(tái),方便人們有效的對這些數(shù)據(jù)進(jìn)行個(gè)性化的分析和利用,實(shí)現(xiàn)資源信息的有效共享,就成為一個(gè)迫切需要解決的問題。本課題設(shè)計(jì)實(shí)現(xiàn)了數(shù)據(jù)服務(wù)空間(DataServiceSpace,簡稱DSS)系統(tǒng)的用戶管理和數(shù)據(jù)服務(wù)管理模塊。DSS是北方工業(yè)大學(xué)云計(jì)算研究中心設(shè)計(jì)開發(fā)的一個(gè)面向最終用戶的數(shù)據(jù)集成系統(tǒng),可以將來自網(wǎng)頁、WebAPI以及主流關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)封裝為服務(wù),并可以通過服務(wù)的組合實(shí)現(xiàn)異構(gòu)數(shù)據(jù)的集成。本文系統(tǒng)開發(fā)的目的是為了進(jìn)一步改進(jìn)DSS系統(tǒng)。系統(tǒng)采用B/S架構(gòu),對界面進(jìn)行優(yōu)化,方便用戶使用,更好地滿足用戶的數(shù)據(jù)集成需求。本課題主要完善DSS的系統(tǒng)功能,完善后的系統(tǒng)將參加中國計(jì)算機(jī)學(xué)會(huì)舉辦的2013年“軟件研究成果原型競賽”。1.2研究開發(fā)現(xiàn)狀分析1.2.1研發(fā)現(xiàn)狀近年來,隨著Web2.0的發(fā)展,各種新技術(shù)不斷涌現(xiàn),這些新技術(shù)完全可以滿足本課題所要實(shí)現(xiàn)的功能。其中,系統(tǒng)為減少用戶等待需要利用AJAX技術(shù)實(shí)現(xiàn)各種表單數(shù)據(jù)的無刷新提交,如登錄、注冊表單的提交;系統(tǒng)為方便調(diào)試前端的AJAX程序需要利用GWT實(shí)現(xiàn)Java代碼到JavaScript代碼的快速轉(zhuǎn)換,使用Java編寫服務(wù)創(chuàng)建的后臺(tái)代碼后利用GWT編譯器將其編譯為前端的JavaScript代碼,再利用GWT的開發(fā)者模式可以方便的進(jìn)行調(diào)試;系統(tǒng)為實(shí)現(xiàn)服務(wù)的即時(shí)推送功能需要利用DWR的反向AJAX功能來實(shí)現(xiàn),如可以實(shí)現(xiàn)創(chuàng)建刪除服務(wù)的服務(wù)器端數(shù)據(jù)的及時(shí)推送等。綜上對國內(nèi)外研究現(xiàn)狀的調(diào)查,我們有以下結(jié)論:(1)通過使用AJAX,運(yùn)行于網(wǎng)頁上的JavaScript代碼直接與服務(wù)器進(jìn)行通信。開發(fā)者可以在不刷新整體頁面的情況下與Web服務(wù)器進(jìn)行數(shù)據(jù)交換。AJAX在瀏覽器與Web服務(wù)器之間使用異步數(shù)據(jù)傳輸(HTTP請求),這樣就可使網(wǎng)頁從服務(wù)器請求少量的信息,而不是整個(gè)頁面,大大降低了服務(wù)器的負(fù)載,最重要的是,這樣的刷新方式更易于被用戶所接受,降低了用戶端瀏覽器的工作量,增強(qiáng)了用戶體驗(yàn)。(2)通過使用GWT,可以用Java編程語言開發(fā)界面,方便的實(shí)現(xiàn)客戶端和服務(wù)器端的通信。如果用傳統(tǒng)的方式JavaScript進(jìn)行AJAX開發(fā)的話,就會(huì)使得應(yīng)用程序非常難以進(jìn)行調(diào)試,從而降低了生產(chǎn)效率。GWT有望為我們解決這個(gè)難題,它使程序員用Java同時(shí)開發(fā)客戶端和服務(wù)器端的代碼。GWT的編譯器會(huì)把用于開發(fā)客戶端的Java代碼轉(zhuǎn)化成JavaScript和HTML,而程序員不用關(guān)心這一轉(zhuǎn)換過程。(3)通過使用DWR,從Java到JavaScript的遠(yuǎn)程功能方法給DWR的用戶帶來非常像傳統(tǒng)的RPC機(jī)制,就像RMI或者SOAP一樣,而且擁有運(yùn)行在Web上但是不需要瀏覽器插件的好處,更加方便服務(wù)器與客戶端之間的通信。1.2.2開發(fā)的必要性DSS系統(tǒng)的缺點(diǎn)是界面操作不友好,創(chuàng)建服務(wù)過程繁瑣,而且沒有登錄注冊、權(quán)限管理、服務(wù)管理、個(gè)人信息管理等功能。因此,要實(shí)現(xiàn)系統(tǒng)面向最終用戶,方便最終用戶操作的目的,需要進(jìn)行改進(jìn)。1.3系統(tǒng)總體介紹本文系統(tǒng)開發(fā)的目的是為了進(jìn)一步改進(jìn)DSS系統(tǒng),增強(qiáng)系統(tǒng)功能,優(yōu)化界面設(shè)計(jì),方便用戶使用,使之更好地滿足用戶個(gè)性化的數(shù)據(jù)集成需求。課題需要完成的功能主要包括:(1)用戶登錄注冊功能。重點(diǎn)是使用郵件激活賬戶和找回密碼功能;(2)用戶權(quán)限管理功能;(3)用戶個(gè)人信息管理功能;(4)對數(shù)據(jù)服務(wù)封裝、組合的界面優(yōu)化。數(shù)據(jù)服務(wù)封裝的界面優(yōu)化又分為封裝網(wǎng)頁為服務(wù)界面的優(yōu)化、封裝WebAPI為服務(wù)界面的優(yōu)化、封裝關(guān)系型數(shù)據(jù)庫為服務(wù)界面的優(yōu)化;(5)數(shù)據(jù)服務(wù)管理功能,主要包括:1)數(shù)據(jù)服務(wù)的刪除;2)定時(shí)刷新同步數(shù)據(jù);3)服務(wù)種類動(dòng)態(tài)顯示;4)新建與刪除服務(wù)的推送功能等;5)數(shù)據(jù)服務(wù)的多條件檢索功能。包括按服務(wù)名稱檢索、按服務(wù)描述檢索、按服務(wù)類型檢索、按服務(wù)創(chuàng)建者檢索;(6)數(shù)據(jù)服務(wù)空間典型應(yīng)用:封裝的點(diǎn)評網(wǎng)服務(wù)與百度地圖服務(wù)相結(jié)合的服務(wù)應(yīng)用。1.4論文組織本文第一章介紹論文研究背景,研究開發(fā)現(xiàn)狀以及主要研究內(nèi)容;第二章介紹本文研究內(nèi)容的相關(guān)技術(shù)與工具;第三章介紹了系統(tǒng)的需求分析,包括業(yè)務(wù)分析、系統(tǒng)功能分析、系統(tǒng)非功能分析;第四章介紹系統(tǒng)的設(shè)計(jì)過程,包括總體架構(gòu)設(shè)計(jì)、靜態(tài)結(jié)構(gòu)設(shè)計(jì)、業(yè)務(wù)用例的實(shí)現(xiàn)、數(shù)據(jù)庫的設(shè)計(jì)以及類的設(shè)計(jì);第五章介紹系統(tǒng)的實(shí)現(xiàn)過程,包括物理結(jié)構(gòu)的實(shí)現(xiàn)、物理部署的實(shí)現(xiàn)、主要類的實(shí)現(xiàn)、主要功能的實(shí)現(xiàn)以及實(shí)現(xiàn)中遇到的問題和解決方法;第六章總結(jié)全文,并展望下一步的工作。

第二章相關(guān)工具與技術(shù)2.1相關(guān)工具本平臺(tái)應(yīng)用基于JavaEE平臺(tái),使用EclipseJavaEEIDE在32位WindowsXP桌面系統(tǒng)環(huán)境下開發(fā)完成。系統(tǒng)開發(fā)使用EclipseHeliosServiceRelease2作為開發(fā)工具,應(yīng)用服務(wù)器前期使用Jetty作為服務(wù)器,后期改用Tomcat6.0.323作為服務(wù)器;關(guān)系數(shù)據(jù)庫采用MySQL5.5.15-win32;前端頁面主要使用JSP+GWT2.1進(jìn)行開發(fā)。2.2相關(guān)技術(shù)2.2.1XML可擴(kuò)展標(biāo)記語言(ExtensibleMarkupLanguage,XML),用于標(biāo)記電子文件使其具有結(jié)構(gòu)性的標(biāo)記語言,可以用來標(biāo)記數(shù)據(jù)、定義數(shù)據(jù)類型,是一種允許用戶對自己的標(biāo)記語言進(jìn)行定義的源語言。XML是標(biāo)準(zhǔn)通用標(biāo)記語言(SGML)的子集,非常適合Web傳輸。XML提供統(tǒng)一的方法來描述和交換獨(dú)立于應(yīng)用程序或供應(yīng)商的結(jié)構(gòu)化數(shù)據(jù)。XML設(shè)計(jì)用來傳送及攜帶數(shù)據(jù)信息,不用來表現(xiàn)或展示數(shù)據(jù),HTML語言則用來表現(xiàn)數(shù)據(jù),所以XML主要用途的焦點(diǎn)是它說明數(shù)據(jù)是什么,以及攜帶數(shù)據(jù)信息。主要用途如下:(1)豐富文件(RichDocuments):自定文件描述并使其更豐富;(2)屬于文件為主的XML技術(shù)應(yīng)用;(3)標(biāo)記是用來定義一份資料應(yīng)該如何呈現(xiàn);(4)元數(shù)據(jù)(Metadata):描述其它文件或網(wǎng)絡(luò)資訊;(5)屬于資料為主的XML技術(shù)應(yīng)用;(6)標(biāo)記是用來說明一份資料的意義;(7)配置文檔(ConfigurationFiles):描述軟件設(shè)置的參數(shù)。本系統(tǒng)將各種異構(gòu)數(shù)據(jù)源中的數(shù)據(jù)轉(zhuǎn)化為XML,并結(jié)合相關(guān)的前臺(tái)呈現(xiàn)技術(shù),最終使用嵌套表格來展現(xiàn)服務(wù)所提供的數(shù)據(jù)。2.2.XPath即為XML路徑語言(XMLPathLanguage),它是一種用來確定XML文檔中某部分位置的語言。XPath基于XML的樹狀結(jié)構(gòu),提供在數(shù)據(jù)結(jié)構(gòu)樹中找尋節(jié)點(diǎn)的能力。起初XPath的提出的初衷是將其作為一個(gè)通用的、介于XPointer與XSL間的語法模型。但是XPath很快的被開發(fā)者采用來當(dāng)作小型查詢語言。XPath是一門在XML文檔中查找信息的語言。XPath用于在XML文檔中通過元素和屬性進(jìn)行導(dǎo)航。XPath使用路徑表達(dá)式在XML文檔中進(jìn)行導(dǎo)航;XPath包含一個(gè)標(biāo)準(zhǔn)函數(shù)庫;XPath是XSLT中的主要元素;XPath是一個(gè)W3C標(biāo)準(zhǔn)。最常見的XPath表達(dá)式是路徑表達(dá)式(XPath這一名稱的另一來源)。路徑表達(dá)式是從一個(gè)XML節(jié)點(diǎn)(當(dāng)前的上下文節(jié)點(diǎn))到另一個(gè)節(jié)點(diǎn)、或一組節(jié)點(diǎn)的書面步驟順序。這些步驟以“/”字符分開,每一步有三個(gè)構(gòu)成成分:(1)軸描述(用最直接的方式接近目標(biāo)節(jié)點(diǎn));(2)節(jié)點(diǎn)測試(用于篩選節(jié)點(diǎn)位置和名稱);(3)節(jié)點(diǎn)描述(用于篩選節(jié)點(diǎn)的屬性和子節(jié)點(diǎn)特征)。2.2.3AJAXAJAX即“AsynchronousJavaScriptandXML”(異步JavaScript和XML),AJAX并非縮寫詞,而是由JesseJamesGaiiett創(chuàng)造的名詞,是指一種創(chuàng)建交互式網(wǎng)頁應(yīng)用的網(wǎng)頁開發(fā)技術(shù)。AJAX不是一種新的編程語言,而是一種用于創(chuàng)建更好更快以及交互性更強(qiáng)的Web應(yīng)用程序的技術(shù)。通過AJAX,運(yùn)行于網(wǎng)頁上的JavaScript代碼可以使用XMLHttpRequest對象來直接與服務(wù)器進(jìn)行通信。通過這個(gè)對象,開發(fā)者可以在不刷新整體頁面的情況下與Web服務(wù)器進(jìn)行數(shù)據(jù)交換。AJAX在瀏覽器與Web服務(wù)器之間使用異步數(shù)據(jù)傳輸(HTTP請求),這樣就可使網(wǎng)頁從服務(wù)器請求少量的信息,而不是整個(gè)頁面,大大降低了服務(wù)器的負(fù)載,最重要的是,這樣的刷新方式更易于被用戶所接受,降低了用戶端瀏覽器的工作量,增強(qiáng)了用戶體驗(yàn)。今天,AJAX技術(shù)已經(jīng)廣泛應(yīng)用于各種Web應(yīng)用當(dāng)中,通過AJAX,因特網(wǎng)應(yīng)用程序可以變得更完善,更友好。本系統(tǒng)在頁面中使用AJAX向服務(wù)器發(fā)送各種請求,實(shí)現(xiàn)頁面無刷新并自動(dòng)響應(yīng)結(jié)果。2.2.4GoogleWebToolkit的縮寫,有了GWT就可以使用Java編程語言編寫AJAX前端,然后GWT會(huì)交叉編譯到優(yōu)化的JavaScript中,而JavaScript可以自動(dòng)在所有主要瀏覽器上運(yùn)行。GWT允許開發(fā)人員使用Java編程語言快速構(gòu)建和維護(hù)復(fù)雜但性能高的JavaScript前端應(yīng)用程序,從而降低了開發(fā)難度,尤其是與EclipseGoogle插件結(jié)合使用時(shí),優(yōu)勢更明顯。目前GWT的應(yīng)用還不是特別廣泛,包括Google自己的Gmail等系統(tǒng)都不是用GWT開發(fā)。但是在這一些電子領(lǐng)域里GWT已經(jīng)有廠商使用GWT開發(fā)設(shè)備上的用戶界面,從而實(shí)現(xiàn)遠(yuǎn)程本地一套代碼的效果。本系統(tǒng)使用GWT構(gòu)建各個(gè)服務(wù)封裝和組合的主要界面,同樣實(shí)現(xiàn)無刷新提交請求并進(jìn)行響應(yīng)。2.2.5DWR(DirectWebRemoting)是一個(gè)用于改善Web頁面與Java類交互的遠(yuǎn)程服務(wù)器端AJAX開源框架,可以幫助開發(fā)人員開發(fā)包含AJAX技術(shù)的網(wǎng)站。它可以允許在瀏覽器里的代碼使用運(yùn)行在Web服務(wù)器上的Java函數(shù),就像它在瀏覽器里一樣。它包含兩個(gè)主要的部分:允許JavaScript從Web服務(wù)器上一個(gè)遵循了AJAX原則的Servlet中獲取數(shù)據(jù).另外一方面一個(gè)JavaScript庫可以幫助網(wǎng)站開發(fā)人員輕松地利用獲取的數(shù)據(jù)來動(dòng)態(tài)改變網(wǎng)頁的內(nèi)容.DWR采取了一個(gè)類似AJAX的新方法來動(dòng)態(tài)生成基于Java類的JavaScript代碼。這樣Web開發(fā)人員就可以在JavaScript里使用Java代碼,就像它們是瀏覽器的本地代碼(客戶端代碼)一樣;但是Java代碼運(yùn)行在Web服務(wù)器端而且可以自由訪問Web服務(wù)器的資源。出于安全的理由,Web開發(fā)者必須適當(dāng)?shù)嘏渲媚男㎎ava類可以安全的被外部使用。這個(gè)從Java到JavaScript的遠(yuǎn)程功能方法給DWR的用戶帶來非常像傳統(tǒng)的RPC機(jī)制,就像RMI或者SOAP一樣,而且擁有運(yùn)行在Web上但是不需要瀏覽器插件的好處。本系統(tǒng)使用DWR來實(shí)現(xiàn)創(chuàng)建與刪除服務(wù)的及時(shí)推送功能。

第三章需求分析本系統(tǒng)并不像傳統(tǒng)軟件開發(fā)一樣有明確的需求,所有的功能依據(jù)系統(tǒng)的應(yīng)用場景分析得出。3.1業(yè)務(wù)分析3.1.1業(yè)務(wù)范圍系統(tǒng)用戶主要分為兩類:普通用戶和管理員。業(yè)務(wù)用例圖如圖3.1所示:圖3.1業(yè)務(wù)用例圖本文系統(tǒng)完成的普通用戶的功能主要包括:登錄、創(chuàng)建服務(wù)(部分功能)、檢索服務(wù)、使用服務(wù)、編輯刪除自己的服務(wù)、管理個(gè)人信息以及使用百度地圖應(yīng)用的功能。管理員除了具有普通用戶的一切功能之外,還能夠編輯刪除所有人發(fā)布構(gòu)造的服務(wù)。游客只能瀏覽本系統(tǒng)的幫助界面以及進(jìn)行注冊。3.1.2業(yè)務(wù)領(lǐng)域模型本系統(tǒng)的業(yè)務(wù)領(lǐng)域模型圖中主要包括用戶、服務(wù)兩類實(shí)體,而服務(wù)又分為四類,它們之間的關(guān)系如圖3.2所示:圖3.2業(yè)務(wù)領(lǐng)域模型圖3.1.3核心業(yè)務(wù)流程活動(dòng)圖游客的注冊活動(dòng)圖,如圖3.3所示。圖3.3注冊活動(dòng)圖(2)已注冊用戶的登錄活動(dòng)圖,如圖3.4所示。圖3.4登錄活動(dòng)圖(3)創(chuàng)建服務(wù)活動(dòng)圖,這里以創(chuàng)建封裝WebAPI的服務(wù)為例,如圖3.5所示。圖3.5創(chuàng)建服務(wù)的活動(dòng)圖(4)刪除服務(wù)活動(dòng)圖,如圖3.6所示。其中結(jié)束1指的是用戶刪除服務(wù)操作活動(dòng)的結(jié)束,結(jié)束2指的是系統(tǒng)整個(gè)刪除活動(dòng)流程的結(jié)束。圖3.6刪除服務(wù)的活動(dòng)圖(5)瀏覽服務(wù)活動(dòng)圖,如圖3.7所示。圖3.7瀏覽服務(wù)的活動(dòng)圖流程圖:用戶登錄流程圖,如圖3.8所示:圖3.8用戶登錄流程圖用戶注冊流程圖,如圖3.9所示:圖3.9用戶注冊流程圖創(chuàng)建服務(wù)的流程圖,這里以創(chuàng)建封裝WebAPI的服務(wù)為例,如圖3.10所示:圖3.10創(chuàng)建服務(wù)的流程圖3.2系統(tǒng)功能分析3.2.1普通用戶的用例圖如圖3.11所示:圖3.11普通用戶功能用例圖3.2.2用例規(guī)約下面是主要用例的詳細(xì)描述。(1)登錄用例名稱登錄參與者普通用戶前置條件用戶訪問該網(wǎng)站且未登錄后置條件進(jìn)入網(wǎng)站服務(wù)展示界面事件流基本路徑:(1)用戶點(diǎn)擊登錄按鈕,用例開始(2)用戶個(gè)人登錄信息錄入到系統(tǒng)中,確認(rèn)提交(3)系統(tǒng)查找用戶表,并返回登錄結(jié)果,用例結(jié)束??蛇x路徑:(1)在提交請求前的任何時(shí)候,都可以選擇取消,該用戶不會(huì)被登錄(2)在基本路徑(2)中,如果輸入的信息不正確,系統(tǒng)將提示修改這些信息(3)在基本路徑(3)中,如果用戶登錄失敗,系統(tǒng)將給出失敗提示(2)創(chuàng)建封裝網(wǎng)頁的服務(wù)用例名稱創(chuàng)建封裝網(wǎng)頁的服務(wù)參與者普通用戶前置條件用戶訪問該網(wǎng)站且已成功登錄后置條件成功創(chuàng)建該服務(wù)事件流基本路徑:(1)用戶點(diǎn)擊CreateClippers鏈接,用例開始(2)用戶將網(wǎng)頁地址錄入到系統(tǒng)中,點(diǎn)擊Open按鈕(3)系統(tǒng)根據(jù)用戶輸入的網(wǎng)址進(jìn)行處理,打開響應(yīng)的網(wǎng)頁(4)用戶選取數(shù)據(jù)或鏈接,點(diǎn)擊AddProperty添加相應(yīng)的名稱(5)用戶點(diǎn)擊Create按鈕,系統(tǒng)彈出服務(wù)信息輸入界面(6)用戶輸入創(chuàng)建的服務(wù)所需信息,確認(rèn)提交(7)系統(tǒng)提示用戶創(chuàng)建結(jié)果,用例結(jié)束??蛇x路徑:(1)在提交創(chuàng)建服務(wù)請求前的任何時(shí)候,都可以選擇取消,該服務(wù)不會(huì)被創(chuàng)建(2)在基本路徑(2)、(6)中,如果輸入的信息不正確,系統(tǒng)將提示修改這些信息(3)在基本路徑(7)中,如果服務(wù)創(chuàng)建失敗,系統(tǒng)將給出失敗提示(3)創(chuàng)建封裝WebAPI的服務(wù)用例名稱創(chuàng)建封裝WebAPI的服務(wù)參與者普通用戶前置條件用戶訪問該網(wǎng)站且已成功登錄后置條件成功創(chuàng)建該服務(wù)事件流基本路徑:(1)用戶點(diǎn)擊CreateDataServiceWrapper鏈接,用例開始(2)用戶將WebAPI地址錄入到系統(tǒng)中,點(diǎn)擊Load按鈕(3)系統(tǒng)根據(jù)用戶輸入的WebAPI進(jìn)行處理,返回響應(yīng)的數(shù)據(jù)(4)用戶點(diǎn)擊Create按鈕,系統(tǒng)彈出服務(wù)信息輸入界面(5)用戶輸入創(chuàng)建的服務(wù)所需信息,確認(rèn)提交(6)系統(tǒng)提示用戶創(chuàng)建結(jié)果,用例結(jié)束。可選路徑:(1)在提交創(chuàng)建服務(wù)請求前的任何時(shí)候,都可以選擇取消,該服務(wù)不會(huì)被創(chuàng)建(2)在基本路徑(2)、(5)中,如果輸入的信息不正確,系統(tǒng)將提示修改這些信息(3)在基本路徑(6)中,如果服務(wù)創(chuàng)建失敗,系統(tǒng)將給出失敗提示(4)創(chuàng)建封裝關(guān)系型數(shù)據(jù)庫用例名稱創(chuàng)建封裝數(shù)據(jù)庫的服務(wù)參與者普通用戶前置條件用戶訪問該網(wǎng)站且已成功登錄后置條件成功創(chuàng)建該服務(wù)事件流基本路徑:(1)用戶點(diǎn)擊CreateDataServiceWrapper鏈接,用例開始(2)用戶點(diǎn)擊Connect按鈕,系統(tǒng)彈出信息輸入框(3)用戶輸入所需鏈接的數(shù)據(jù)庫的信息,點(diǎn)擊輸入框中的Connect按鈕(4)系統(tǒng)根據(jù)用戶輸入的信息進(jìn)行處理,返回響應(yīng)的數(shù)據(jù)庫表列表(5)用戶選擇想要封裝的表,系統(tǒng)自動(dòng)加載表中的數(shù)據(jù)(7)用戶點(diǎn)擊Create按鈕,系統(tǒng)彈出服務(wù)信息輸入界面(8)用戶輸入創(chuàng)建的服務(wù)所需信息,確認(rèn)提交(9)系統(tǒng)提示用戶創(chuàng)建結(jié)果,用例結(jié)束。可選路徑:(1)在提交創(chuàng)建服務(wù)請求前的任何時(shí)候,都可以選擇取消,該服務(wù)不會(huì)被創(chuàng)建(2)在基本路徑(3)、(7)中,如果輸入的信息不正確,系統(tǒng)將提示修改這些信息(3)在基本路徑(3)、(8)中,如果服務(wù)創(chuàng)建失敗,系統(tǒng)將給出失敗提示(5)創(chuàng)建組合服務(wù)用例名稱創(chuàng)建服務(wù)組合參與者普通用戶前置條件用戶訪問該網(wǎng)站且已成功登錄后置條件成功創(chuàng)建該服務(wù)事件流基本路徑:(1)用戶點(diǎn)擊CreateMashUp鏈接,用例開始(2)用戶在網(wǎng)頁工具欄中選擇操作(3)用戶點(diǎn)擊SaveAs按鈕,系統(tǒng)彈出信息輸入框(4)用戶輸入創(chuàng)建的服務(wù)所需信息,確認(rèn)提交(5)系統(tǒng)提示用戶創(chuàng)建結(jié)果,用例結(jié)束。可選路徑:(1)在提交創(chuàng)建服務(wù)請求前的任何時(shí)候,都可以選擇取消,該服務(wù)不會(huì)被創(chuàng)建(2)在基本路徑(4)中,如果輸入的信息不正確,系統(tǒng)將提示修改這些信息(3)在基本路徑(5)中,如果服務(wù)創(chuàng)建失敗,系統(tǒng)將給出失敗提示(6)編輯服務(wù)用例名稱編輯服務(wù)參與者普通用戶前置條件用戶訪問該網(wǎng)站且已成功登錄后置條件成功修改該服務(wù)事件流基本路徑:(1)用戶點(diǎn)擊相應(yīng)服務(wù)的Edit鏈接,用例開始(2)用戶在網(wǎng)頁工具欄中選擇操作(3)用戶點(diǎn)擊Save按鈕,確認(rèn)提交(4)系統(tǒng)提示用戶編輯結(jié)果,用例結(jié)束。可選路徑:(1)在提交Save請求前的任何時(shí)候,都可以選擇取消,該服務(wù)不會(huì)被修改(2)在基本路徑(4)中,如果服務(wù)修改失敗,系統(tǒng)將給出失敗提示(7)刪除服務(wù)用例名稱刪除服務(wù)參與者普通用戶前置條件用戶訪問該網(wǎng)站且已成功登錄后置條件成功刪除該服務(wù)事件流基本路徑:(1)用戶點(diǎn)擊相應(yīng)服務(wù)的Remove鏈接,用例開始(2)系統(tǒng)接收到需要?jiǎng)h除的服務(wù)的相關(guān)信息,進(jìn)行刪除(3)系統(tǒng)返回結(jié)果,此服務(wù)刪除,對用戶不可見,用例結(jié)束可選路徑:(4)在基本路徑(2)中,如果服務(wù)刪除失敗,系統(tǒng)將給出失敗提示(8)檢索服務(wù)用例名稱檢索服務(wù)參與者普通用戶前置條件用戶訪問該網(wǎng)站且已成功登錄后置條件系統(tǒng)將檢錯(cuò)結(jié)果返回給用戶事件流基本路徑:(1)用戶點(diǎn)擊Browse鏈接,用例開始(2)用戶在DiscoverDataServices下面的信息輸入框中選擇自己的檢索條件,點(diǎn)擊FindDataService按鈕(3)系統(tǒng)進(jìn)行相應(yīng)的查找,并返回查找結(jié)果,用例結(jié)束可選路徑:(1)在基本路徑(1)中,用戶可以點(diǎn)擊MyDataService鏈接進(jìn)行同樣的操作(2)在基本路徑(2)中,用戶也可以直接點(diǎn)擊BrowsebyDomain下面的服務(wù)種類鏈接進(jìn)行檢索(9)使用服務(wù)用例名稱使用服務(wù)參與者普通用戶前置條件用戶獲得相應(yīng)服務(wù)的訪問接口后置條件系統(tǒng)將服務(wù)的數(shù)據(jù)內(nèi)容返回給用戶事件流基本路徑:(1)用戶通過網(wǎng)頁或者API同步訪問,用例開始(2)系統(tǒng)返回相應(yīng)服務(wù)的數(shù)據(jù),用例結(jié)束可選路徑:(1)在基本路徑(2)中,如果用戶訪問的服務(wù)不存在,系統(tǒng)將返回錯(cuò)誤提示(10)個(gè)人信息管理用例名稱個(gè)人信息管理參與者普通用戶前置條件用戶訪問該網(wǎng)站且已成功登錄后置條件系統(tǒng)提示修改成功事件流基本路徑:(1)用戶點(diǎn)擊user鏈接,用例開始(2)系統(tǒng)返回相應(yīng)服務(wù)的數(shù)據(jù),呈現(xiàn)給用戶(3)用戶在相應(yīng)的信息框中修改跟個(gè)人信息,確定提交(4)系統(tǒng)返回修改結(jié)果,用例結(jié)束可選路徑:(1)在提交修改請求前的任何時(shí)候,都可以選擇取消,該信息不會(huì)被修改(2)在基本路徑(3)中,如果輸入的信息不正確,系統(tǒng)將提示修改這些信息(3)在基本路徑(4)中,如果信息修改失敗,系統(tǒng)將給出失敗提示 除去注冊功能用例及其描述,系統(tǒng)管理員的功能用例圖以及用例描述與普通用戶基本一致。目前,系統(tǒng)普通用戶與系統(tǒng)管理員的主要區(qū)別是:普通用戶僅能對自己創(chuàng)建的服務(wù)進(jìn)行刪除編輯,管理員對所有服務(wù)都可以刪除和編輯。3.3系統(tǒng)非功能分析3.3.1運(yùn)行環(huán)境需求系統(tǒng)采用B/S結(jié)構(gòu)設(shè)計(jì),部署在ApacheTomcat上運(yùn)行,與客戶端采用HTTP通信協(xié)議進(jìn)行通信。 客戶機(jī):外圍設(shè)備:鼠標(biāo),鍵盤,顯示器;

操作系統(tǒng):裝有指定瀏覽器的各種操作系統(tǒng);

服務(wù)器:外圍設(shè)備:鼠標(biāo),鍵盤,顯示器;

操作系統(tǒng):Linux或Windows2000以上操作系統(tǒng);

數(shù)據(jù)庫支持:MySQL5.0以上;

3.3.2系統(tǒng)接口需求(1)用戶接口

用戶界面要求簡潔明了,而且表單操作要求盡量避免使用鼠標(biāo)。所以數(shù)據(jù)的填寫,控件焦點(diǎn)的轉(zhuǎn)換要自動(dòng)進(jìn)行。不同種類數(shù)據(jù)填寫的順序—即Tab的順序要符合實(shí)際操作的習(xí)慣。(2)硬件接口

對于服務(wù)器端,應(yīng)該具有較快的執(zhí)行速度,較大的存儲(chǔ)容量與高速的網(wǎng)絡(luò)訪問速度,因此對此的硬件基本需求如下:服務(wù)器端:CPU:1GHz以上硬盤:項(xiàng)目部署后占用磁盤約200M,因此除去系統(tǒng)和各種必須軟件所需空間,空閑空間不得少于300M;內(nèi)存:512M以上。客戶端:能夠正常運(yùn)行火狐瀏覽器且訪問網(wǎng)絡(luò)。(3)軟件接口

系統(tǒng)軟件的選取是發(fā)揮系統(tǒng)功能的關(guān)鍵,好的軟件可以增強(qiáng)系統(tǒng)的穩(wěn)定性、安全性、運(yùn)行效率。服務(wù)器端:JDK1.6以上,Tomcat6.0以上或者Jetty7.0以上,MySQL5.0以上客戶端:FireFox3.6.8瀏覽器,gwt-dev-plugin.xpi火狐插件,foxtidy.xpi火狐插件3.3.3(1)靜態(tài)數(shù)據(jù)

在軟件開發(fā)過程中不可改變的數(shù)據(jù),包括用戶賬號注冊時(shí)間,用戶名,用戶郵箱等。(2)動(dòng)態(tài)數(shù)據(jù)

在軟件開發(fā)過程中可以改變的數(shù)據(jù),除開靜態(tài)數(shù)據(jù)以外的數(shù)據(jù)。要求數(shù)據(jù)符合以下兩點(diǎn):1)錄入處理的準(zhǔn)確性及容錯(cuò)性;2)數(shù)據(jù)的一致性和完整性。3.3.4性能需求平臺(tái)支持多用戶同時(shí)正常操作。采用軟件默認(rèn)配置,ApacheTomcat默認(rèn)最大并發(fā)量150個(gè),MySQL默認(rèn)最大連接數(shù)100個(gè)。3.3.5質(zhì)量(1)可靠性。系統(tǒng)應(yīng)保證在規(guī)定的條件和規(guī)定的時(shí)間內(nèi),用戶所進(jìn)行的操作能夠順利完成,如果遇到意外情況,應(yīng)及時(shí)回滾操作,保證系統(tǒng)的可靠性。(2)可用性。系統(tǒng)應(yīng)具有良好的圖形化界面,方便用戶操作,以面向最終用戶為主。(3)安全性。系統(tǒng)應(yīng)保證不泄露用戶個(gè)人信息。

第四章系統(tǒng)設(shè)計(jì)4.1體系架構(gòu)系統(tǒng)采用基于B/S結(jié)構(gòu)的三層體系架構(gòu),如圖4.1所示:圖4.1系統(tǒng)體系結(jié)構(gòu)圖(1)表示層:用于該平臺(tái)的用戶進(jìn)行交互以及顯示根據(jù)特定業(yè)務(wù)規(guī)則進(jìn)行計(jì)算后的結(jié)果。本系統(tǒng)采用B/S架構(gòu),即用戶可以直接通過瀏覽器訪問系統(tǒng)。(2)業(yè)務(wù)邏輯層:負(fù)責(zé)平臺(tái)的業(yè)務(wù)邏輯處理和表示邏輯生成,支持諸如響應(yīng)客戶請求以及查詢等功能。中間層進(jìn)行邏輯處理,再將處理的結(jié)果反饋給客戶或者發(fā)送到數(shù)據(jù)庫中。(3)數(shù)據(jù)訪問層:數(shù)據(jù)訪問層用于訪問底層的數(shù)據(jù)庫系統(tǒng),這里的數(shù)據(jù)庫系統(tǒng)是指關(guān)系數(shù)據(jù)庫系統(tǒng)。4.2功能模塊該平臺(tái)的用戶主要有2類:管理員、普通用戶。各用戶在登錄界面進(jìn)行登錄進(jìn)入網(wǎng)頁,完成各種操作。平臺(tái)的功能如圖4.2所示。圖4.2系統(tǒng)功能模塊圖模塊描述:注冊模塊:實(shí)現(xiàn)用戶注冊功能;登錄模塊:實(shí)現(xiàn)用戶的登錄、找回密碼、激活賬戶的功能;用戶信息管理模塊:實(shí)現(xiàn)用戶個(gè)人信息的管理;服務(wù)管理模塊:實(shí)現(xiàn)服務(wù)的添加、刪除、查找、編輯、使用功能;檢索服務(wù)模塊:實(shí)現(xiàn)服務(wù)的多條件檢索以及服務(wù)的增加與刪除的推送功能;創(chuàng)建服務(wù)模塊:實(shí)現(xiàn)用戶對四種服務(wù)的創(chuàng)建,包括封裝網(wǎng)頁的服務(wù)、封裝WebAPI的服務(wù),封裝數(shù)據(jù)庫的服務(wù)以及服務(wù)組合;本文系統(tǒng)完成的是對四種服務(wù)的創(chuàng)建頁面的優(yōu)化以及存儲(chǔ)的優(yōu)化;編輯服務(wù)模塊:實(shí)現(xiàn)用戶對服務(wù)的編輯功能;本文系統(tǒng)完成的是對服務(wù)編輯頁面優(yōu)化以及對可編輯服務(wù)的顯示“編輯”功能;刪除服務(wù)模塊:實(shí)現(xiàn)用戶對服務(wù)的刪除功能;使用服務(wù)模塊:實(shí)現(xiàn)用戶對服務(wù)的使用功能,包括通過網(wǎng)頁同步訪問和通過API同步訪問;本文系統(tǒng)完成的是定時(shí)刷新訪問的服務(wù),真正做到同步訪問。4.3數(shù)據(jù)庫設(shè)計(jì)本小節(jié)介紹系統(tǒng)的數(shù)據(jù)庫設(shè)計(jì),包括數(shù)據(jù)庫邏輯結(jié)構(gòu)設(shè)計(jì)和數(shù)據(jù)庫物理結(jié)構(gòu)設(shè)計(jì)。4.3.數(shù)據(jù)庫的邏輯結(jié)構(gòu)設(shè)計(jì)是把概念結(jié)構(gòu)設(shè)計(jì)階段設(shè)計(jì)的基本E-R圖轉(zhuǎn)換為與選用的DBMS產(chǎn)品所支持的數(shù)據(jù)模型相符合的邏輯結(jié)構(gòu)。下圖4.3圖和4.4為主要實(shí)體的數(shù)據(jù)庫邏輯結(jié)構(gòu)圖。圖4.3服務(wù)實(shí)體與用戶實(shí)體之間的E-R圖本系統(tǒng)中存在用戶、服務(wù)、Clipper服務(wù)、DB服務(wù)、WebAPI服務(wù)及APP服務(wù)五個(gè)實(shí)體,所有的功能都是圍繞這五個(gè)實(shí)體所進(jìn)行的操作。Clippers服務(wù)、DB服務(wù)、WebAPI服務(wù)及APP服務(wù)繼承自服務(wù),它們之間的關(guān)系都是一對一;用戶與服務(wù)之間的關(guān)系是一對多,即一個(gè)用戶可以擁有多個(gè)服務(wù)。4.3.2物理數(shù)據(jù)庫是邏輯數(shù)據(jù)庫的物理實(shí)現(xiàn),它描述了數(shù)據(jù)庫中基本表的物理結(jié)構(gòu)和完整性約束等信息。物理數(shù)據(jù)庫的設(shè)計(jì)依賴于具體的DBMS,本系統(tǒng)使用MySQL數(shù)據(jù)庫。(1)用戶表。只有注冊用戶才能使用本系統(tǒng)的主要功能。非注冊用戶只能瀏覽幫助界面。圖4.4展示了用戶表的物理結(jié)構(gòu)設(shè)計(jì)。圖4.4用戶表(2)服務(wù)表。用戶創(chuàng)建的任何服務(wù)的基本信息都在此表中。圖4.5展示了服務(wù)表的物理結(jié)構(gòu)設(shè)計(jì)。圖4.5服務(wù)表(3)封裝網(wǎng)頁為服務(wù)的表。用戶創(chuàng)建的封裝網(wǎng)頁數(shù)據(jù)為服務(wù)的特有信息存放在此表中。圖4.6展示了此表的物理結(jié)構(gòu)設(shè)計(jì)。圖4.6網(wǎng)頁封裝服務(wù)表(4)封裝WebAPI為服務(wù)的表。用戶創(chuàng)建的封裝WebAPI為服務(wù)的特有信息存放在此表中。圖4.7展示了此表的物理結(jié)構(gòu)設(shè)計(jì)。圖4.7WebAPI封裝服務(wù)表(5)封裝數(shù)據(jù)庫為服務(wù)的表。用戶創(chuàng)建的封裝數(shù)據(jù)庫為服務(wù)的特有信息存放在此表中。圖4.8展示了此表的物理結(jié)構(gòu)設(shè)計(jì)。圖4.8數(shù)據(jù)庫封裝服務(wù)表(6)組合服務(wù)的表。用戶創(chuàng)建的組合服務(wù)的特有信息存放在此表中。圖4.9展示了此表的物理結(jié)構(gòu)設(shè)計(jì)。圖4.9組合服務(wù)表(7)服務(wù)類型表。用戶創(chuàng)建的服務(wù)類型信息存放在此表中。圖4.10展示了此表的物理結(jié)構(gòu)設(shè)計(jì)。圖4.10服務(wù)類型表4.4.3數(shù)據(jù)庫訪問采用JDBC與JPA相結(jié)合的方法訪問數(shù)據(jù)庫,實(shí)現(xiàn)對象的讀寫。利用JDBC中提供的數(shù)據(jù)庫訪問API直接編寫SQL語句實(shí)現(xiàn)數(shù)據(jù)庫的訪問;利用JPA通過JDK5.0注解描述對象-關(guān)系表的映射關(guān)系,并將實(shí)體對象持久化到數(shù)據(jù)庫中。4.4系統(tǒng)詳細(xì)設(shè)計(jì)4.4.1業(yè)務(wù)用例的實(shí)現(xiàn)主要用時(shí)序圖方式實(shí)現(xiàn)。(1)用戶查詢服務(wù)的時(shí)序圖如圖4.11所示:圖4.11用戶查詢服務(wù)的時(shí)序圖(2)用戶刪除服務(wù)的時(shí)序圖如圖4.12所示:圖4.12用戶刪除服務(wù)的時(shí)序圖(3)用戶查看個(gè)人信息的時(shí)序圖如圖4.13所示:圖4.13用戶查看個(gè)人信息的時(shí)序圖4.4圖4.14展示了與用戶登錄有關(guān)的類及其之間的聯(lián)系。圖4.14與用戶登錄有關(guān)的類圖用戶登錄時(shí)前臺(tái)與服務(wù)器之間的請求與響應(yīng)均是通過控制器loginServlet類來進(jìn)行的。首先用戶登錄時(shí)給loginServlet類發(fā)送請求,loginServlet類將請求中的用戶數(shù)據(jù)封裝成User對象,然后調(diào)用UserDaoImpl類里的login(User)方法,然后在login(User)類中調(diào)用userExists(String)方法判斷用戶名是否存在,如果用戶名已存在,系統(tǒng)通過loginServlet類返回給用戶提示,否則在數(shù)據(jù)庫User表中進(jìn)行相應(yīng)的查詢,然后查詢返回結(jié)果給loginServlet類,loginServlet類根據(jù)返回結(jié)果進(jìn)行判斷,將最終結(jié)果響應(yīng)給用戶。期間,UserDaoImpl類使用DBUtils中的getConnection()方法創(chuàng)建與數(shù)據(jù)庫之間的鏈接。四個(gè)主要服務(wù)及其父類服務(wù)之間的關(guān)系,如圖4.15所示。圖4.15四個(gè)主要服務(wù)類及其父類服務(wù)類的類圖Db類、WebApi類、App類、Clipper類均繼承自父類dataservicetype類,其中每個(gè)子類代表著一種服務(wù),其服務(wù)的基本信息繼承自dataservicetype類,而各自有具有屬于自己服務(wù)的特有信息。封裝網(wǎng)頁的服務(wù)類圖如圖4.16所示。圖4.16封裝網(wǎng)頁的服務(wù)類圖其中,ClipperService類為服務(wù)方法定義接口,ClipperServiceAsyc類為異步調(diào)用接口,ClipperServiceImpl類為服務(wù)器方法實(shí)現(xiàn)類,它實(shí)現(xiàn)ClipperService接口。GWT中client包中的任何類想要使用非GWT配置文件中聲明的其它類中的方法必須通過異步調(diào)用接口來間接的調(diào)用。

第五章系統(tǒng)實(shí)現(xiàn)5.1系統(tǒng)物理結(jié)構(gòu)系統(tǒng)的物理結(jié)構(gòu)主要有用戶注冊單元、用戶登錄單元、個(gè)人信息管理單元、創(chuàng)建服務(wù)單元、瀏覽服務(wù)單元、編輯服務(wù)單元、刪除服務(wù)單元、使用服務(wù)單元以及百度地圖應(yīng)用單元構(gòu)成,如圖5.1所示。圖5.1系統(tǒng)組件圖5.2系統(tǒng)物理部署系統(tǒng)的物理部署由客戶端瀏覽器、應(yīng)用服務(wù)器Tomcat以及數(shù)據(jù)庫服務(wù)器MySQL組成,部署圖如圖5.2所示。圖5.2系統(tǒng)部署圖項(xiàng)目參加的2013年“軟件研究成果原型競賽”(相關(guān)鏈接地址:/contest2013.html),需要部署到北京大學(xué)的云平臺(tái)SASE上,如圖5.3、5.4、5.5所示:圖5.3SASE用戶登錄圖圖5.4應(yīng)用提交界面圖5.5查看應(yīng)用界面5.3主要功能的實(shí)現(xiàn)5.3.1用戶界面(1)首頁界面,如圖5.6所示。圖5.6首頁(2)登錄界面,如圖5.7所示。圖5.7登錄界面(3)注冊界面,如圖5.8所示。圖5.8注冊界面(4)登錄后進(jìn)入的主頁,如圖5.9所示。圖5.9登錄后進(jìn)入的主頁界面(5)服務(wù)瀏覽查詢刪除界面,如圖5.10所示。圖5.10服務(wù)瀏覽查詢刪除界面(6)用戶個(gè)人信息頁面,如圖5.11所示。圖5.11用戶個(gè)人信息頁面(7)幫助頁面,如圖5.12所示。圖5.12幫助頁面界面(8)封裝WebAPI為服務(wù)的頁面,如圖5.13所示。圖5.13封裝WebAPI為服務(wù)的頁面(9)封裝數(shù)據(jù)庫為服務(wù)的頁面,如圖5.14所示。圖5.14封裝數(shù)據(jù)庫為服務(wù)的頁面(10)服務(wù)組合的頁面,如圖5.15所示。圖5.15服務(wù)組合的頁面(11)百度地圖頁面,分別如圖5.16、5.17、5.18所示。圖5.16地址設(shè)定界面圖5.17組合信息顯示界面圖5.18地圖路線顯示界面界面代碼實(shí)現(xiàn):用戶界面整體上采用JSP開發(fā),兼用GWT。用戶在頁面中向服務(wù)器提交請求統(tǒng)一使用AJAX技術(shù)來實(shí)現(xiàn),并沒有使用傳統(tǒng)的表單提交,這樣可以做到無刷新提交并相應(yīng)。這里以登錄界面圖5.19代碼示例如下:圖5.19登錄界面登錄頁面的代碼:<divclass="color_border"> <pclass="margin"> <a>Username:</a> <inputid="login_username"type="text"class="input"onkeypress="enterClick(event)"></input> </p> <p> <a>Password:</a> <inputid="login_password"type="password"class="input"onkeypress="enterClick(event)"></input> </p> <p> <buttonclass="button"onclick="login_null();"onkeypress="enterClick(event)">LOGIN</button> </p></div>登錄調(diào)用的Javascript代碼如下://頁面中調(diào)用的方法functionlogin_null(){ varusername=document.getElementById("login_username").value; varpassword=document.getElementById("login_password").value; if(username==""||password==""){ if(username==""){ alert("usernameisempty!"); returnfalse; }else{ alert("passwordisempty!"); returnfalse; } }else{ sendRequest("loginServlet?service=login&username="+username+"&password="+password); }}//下面為使用AJAX的過程varXMLHttpReq;//根據(jù)不同瀏覽器創(chuàng)建請求對象XMLHttpRequestfunctioncreateXMLHttpRequest(){if(window.XMLHttpRequest){XMLHttpReq=newXMLHttpRequest();}elseif(window.ActiveXObject){try{XMLHttpReq=newActiveXObject("MSXML2.XMLHTTP");}catch(e){try{XMLHttpReq=newActiveXObject("Mircsoft.XMLHTTP");}catch(e1){}}}}//發(fā)送請求functionsendRequest(url){ createXMLHttpRequest(); XMLHttpReq.open("GET",url+"&time="+newDate().getTime(),true); XMLHttpReq.onreadystatechange=processResponse; XMLHttpReq.send(null);}//響應(yīng)函數(shù)functionprocessResponse(){ if(XMLHttpReq.readyState==4){ if(XMLHttpReq.status==200){ varres=XMLHttpReq.responseXML.getElementsByTagName("result")[0].firstChild.data; if(res=="commonuser"||res=="admin"){ window.location.href="index/core/myindex.jsp"; }else{ window.alert(res); return; } }else{ window.alert("Thepageyourequestisabnormal!"); } }}關(guān)于用戶登錄的后臺(tái)代碼??刂破饔蒷oginServlet類進(jìn)行處理,代碼如下protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{ resp.setContentType("text/xml;charset=utf-8"); resp.setHeader("Cache-Control","no-cache"); PrintWriterout=resp.getWriter(); Stringservice=req.getParameter("service"); UserDaoImpluserdao=newUserDaoImpl(); HttpSessionsession=req.getSession(); if("login".equals(service)){ out.println("<response>"); Stringusername=req.getParameter("username"); Stringpassword=req.getParameter("password"); Useruser=newUser(); user.setUsername(username); user.setPassword(password); intresult=userdao.login(user);//-2:賬號未激活 if(result==-2){ out.println("<result>"+"Theaccountisnotactive!"+"</result>"); }//-1:用戶名不存在 elseif(result==-1){ out.println("<result>"+"Theusernamedoesnotexist!"+"</result>"); }//0:用戶密碼錯(cuò)誤 elseif(result==0){ out.println("<result>"+"Thepasswordiswrong!"+"</result>"); }//1:普通用戶成功登錄 elseif(result==1){ intisallowed=userdao.getIsAllowed(username); CSessioncs=newCSession(); cs.setUsername(username); cs.setUsertype("0"); session.setAttribute("C_SESSION",cs); session.setAttribute("username",username); session.setAttribute("isallowed",isallowed); out.println("<result>commonuser</result>"); }else{//管理員成功登錄 intisallowed=userdao.getIsAllowed(username); CSessioncs=newCSession(); cs.setUsername(username); cs.setUsertype("1"); session.setAttribute("C_SESSION",cs); session.setAttribute("adminname",username); session.setAttribute("isallowed",isallowed); out.println("<result>admin</result>"); } out.println("</response>"); out.close(); }}在控制器loginServlet類中調(diào)用了數(shù)據(jù)庫層的login(Useruser)方法,對用戶登錄進(jìn)行數(shù)據(jù)庫查詢: /** *驗(yàn)證用戶登錄 *@paramuser用戶*@returnint-2:賬號未激活-1:用戶名不存在0:用戶密碼錯(cuò)誤1:普通用戶成功登錄2:管理員成功登錄 *@exception出現(xiàn)異常則登錄失敗 */ publicintlogin(Useruser){ intlogin_result=0; try{ if(userExists(user.getUsername())==0){ login_result=-1; }else{ sql="SELECTUSERNAME,IS_ADMIN,IS_ACTIVEFROMuserWHEREUSERNAME=?andPASSWORD=?andIS_DEL=0"; conn=DBUtils.getConnection(); ps=conn.prepareStatement(sql); ps.setString(1,user.getUsername()); ps.setString(2,user.getPassword()); rs=ps.executeQuery(); if(rs.next()){ if(rs.getInt("IS_ACTIVE")==0){ login_result=-2; }else{ if(rs.getInt("IS_ADMIN")==0){ login_result=1; }else{ login_result=2; } } }else{ login_result=0; } } }catch(SQLExceptione){ e.printStackTrace(); }finally{ DBUtils.free(rs,ps,conn); } returnlogin_result; }5.3.2多條件查詢的實(shí)現(xiàn)用戶查詢所有服務(wù)或是查詢自己的服務(wù)時(shí)都可以根據(jù)條件進(jìn)行查詢。下圖中的“BrowsebyDomain”以及DiscoverDataServices中的in下拉框中的服務(wù)類型及數(shù)量都是動(dòng)態(tài)實(shí)現(xiàn)的,是隨著數(shù)據(jù)庫中的服務(wù)類型和數(shù)量的變化而變化的。圖5.20多條件查詢服務(wù)圖5.20的功能具體實(shí)現(xiàn)過程如下:當(dāng)頁面剛加載時(shí),首先調(diào)用下面的兩個(gè)方法<bodyonload="initDataServices();initTService();">其中initDataServices()方法是使用AJAX異步請求得到數(shù)據(jù)庫中的所有的服務(wù),然后利用響應(yīng)函數(shù)在頁面中顯示出來并進(jìn)行分頁處理。initTService()方法使控制服務(wù)種類的顯示的方法,代碼如下:functioninitTService(){ varsearchInputdata="Searchdataservicename,ordescription"; varselectDomain="Domain"; varselectRelevance="Relevance"; varshowuser=""; varchecked=false; varurl="browseServlet/browse?cmd=initT&searchInputdata="+searchInputdata+"&selectDomain="+selectDomain+"&selectRelevance="+selectRelevance+"&showuser="+showuser+"&checked="+checked; if(window.XMLHttpRequest){ reqt=newXMLHttpRequest(); }elseif(window.ActiveXObject){ reqt=newActiveXObject("Microsoft.XMLHTTP"); } if(reqt){ reqt.open("post",url,true); reqt.onreadystatechange=initTcomplete; reqt.send(null); } }//響應(yīng)函數(shù)functioninitTcomplete(){ if(reqt.readyState==4){ if(reqt.status==200){ vardomainmap=reqt.responseText;//在這里調(diào)用方法顯示服務(wù)種類和數(shù)量 select_list(domainmap); } }}//顯示服務(wù)種類和數(shù)量functionselect_list(domainmap){ document.getElementById("topnav1").innerHTML="";vardomain=document.getElementById("selectDomain"); domain.innerHTML=""; domain.options.add(newOption("Domain","Domain")); domain.options.add(newOption("AnyDomain","AnyDomain"));vardomains=domainmap.split("##%%");for(varj=0;j<domainmap.length-1;j++){ vartypes=domains[j].split(",");varoption=document.createElement("option");option.value=types[0];option.innerHTML=types[0];domain.appendChild(option);document.getElementById("topnav1").innerHTML+="<li><aclass=\"navlink\"href=\"Javascript:findDomain('"+types[0]+"')\">"+types[0]+"</a><spanclass=\"attibutenumCSS\">("+types[1]+")   </span></li>";}}當(dāng)用戶進(jìn)行刪除時(shí),服務(wù)種類和數(shù)量可以實(shí)現(xiàn)無刷新顯示,實(shí)現(xiàn)代碼如下://刪除服務(wù)的響應(yīng)函數(shù)functionremovecomplete(){ if(req.readyState==4){ if(req.status==200){ varrow=document.getElementById(req.responseText); varindex=row.rowIndex;//rowIndex屬性為tr的索引值,從0開始 theTable.deleteRow(index);//從table中刪除 numberRowsInTable=theTable.rows.length;//在這里重新調(diào)用initTService()方法進(jìn)行是數(shù)據(jù)庫查詢 initTService(); } }}5.3.3封裝WebAPI的界面使用GWT技術(shù)首先要建立的是模塊配置文件(以.gwt.xml結(jié)尾的文件),基本上一個(gè)功能一個(gè)模塊,如封裝網(wǎng)頁為服務(wù)的功能獨(dú)自一個(gè)模塊,封裝WeAPI為服務(wù)的功能獨(dú)自一個(gè)模塊。這里以封裝WebAPI為服務(wù)的模塊來介紹。圖5.21是整個(gè)功能模塊的包以及包內(nèi)的類的圖(GWT對包的命名以及包中部分類的命名有嚴(yán)格的限制)。圖5.21WebAPI功能模塊包結(jié)構(gòu)(1)DataServiceWrapper.gwt.xml模塊配置文件內(nèi)容如下:<module><!—下面是繼承其他模塊,User是必須繼承的一個(gè)模塊。--> <inheritsname="com.google.gwt.user.User"/><!--繼承缺省的GWT樣式表.能夠改變GWT程序的主題--> <inheritsname="com.google.gwt.user.theme.standard.Standard"/><!--指定應(yīng)用的入口點(diǎn)類--> <entry-pointclass="cn.ac.ict.sigsit.webide2.dataservicewrapper.client.DataServiceWrapper"/> <inheritsname="com.extjs.gxt.ui.GXT"/> <stylesheetsrc="/ExtGWT/css/gxt-all.css"/> <inheritsname="cn.ac.ict.sigsit.webide2.gwt.Module"/></module>(2)入口點(diǎn)類擴(kuò)展了入口點(diǎn)接口并提供了一個(gè)方法onModuleLoad(),這個(gè)入口點(diǎn)方法是整個(gè)GWT應(yīng)用程序開始執(zhí)行的地方,在構(gòu)造GWT應(yīng)用程序用戶界面中起作用。入口點(diǎn)類:DataServiceWrapper類實(shí)現(xiàn)GWT的EntryPoint接口publicclassDataServiceWrapperimplementsEntryPoint{ publicvoidonModuleLoad(){ RootLayoutPanelrootLayoutPanel=RootLayoutPanel.get();//在這里創(chuàng)建WrapperUi類的對象,WrapperUi類采用的是UiBinder技術(shù) rootLayoutPanel.add(newWrapperUi()); }}這里使用的是UiBinder,是一種通過XML來進(jìn)行頁面設(shè)計(jì)的技術(shù),相應(yīng)的xml文件WrapperUi.ui.xml如下:<!DOCTYPEui:UiBinderSYSTEM"/gwt/DTD/xhtml.ent"><ui:UiBinderxmlns:ui='urn:ui:com.google.gwt.uibinder'xmlns:g='urn:import:com.google.gwt.user.client.ui'> <g:TabLayoutPanelbarUnit='EM'barHeight='2'> <g:tab> <g:headersize='7'>WebAPI</g:header> <g:DockLayoutPanelunit='EM'> <g:northsize="2.0"> <g:FlowPanel> <g:TextBoxwidth="38em"ui:field="textBoxApiUrl"/> <g:Buttonui:field="buttonApiLoad">Load</g:Button> <g:Buttonui:field="buttonApiCreate"enabled="false">Create</g:Button> </g:FlowPanel> </g:north> <g:center> <g:ScrollPanelui:field="apiNestedTablePanel"/> </g:center> </g:DockLayoutPanel> </g:tab> <g:tab> <g:headersize='7'>Database</g:header> <g:DockLayoutPanelunit='EM'> <g:northsize="2.0"> <g:FlowPanel> <g:Buttonui:field="buttonDbConnect">Connect</g:Button> <g:ListBoxwidth="10em"ui:field="listBoxTableName"enabled="false"/> <g:Buttonenabled="false"ui:field="buttonDbCreate">Create</g:Button> </g:FlowPanel> </g:north> <g:center> <g:ScrollPanelui:field="dbNestedTablePanel"/> </g:center> </g:DockLayoutPanel> </g:tab> </g:TabLayoutPanel>對應(yīng)的界面如圖5.22所示:圖5.22通過UiBinder設(shè)計(jì)的界面(3)客戶端與服務(wù)器端代碼的存放位置使用標(biāo)準(zhǔn)的GWT工程結(jié)構(gòu)可以有效的區(qū)分客戶端和服務(wù)器端的代碼,所以推薦使用標(biāo)準(zhǔn)的GWT工程結(jié)構(gòu)。如表5.1所示:表5.1GWT工程結(jié)構(gòu)表包名作用\工程的根目錄,包含模塊XML文件client\存放客戶端代碼server\存放服務(wù)器端代碼public\存放靜態(tài)資源,如.html,.css,圖片等WrapperService類為服務(wù)方法定義接口,WrapperServiceAsyc類為異步調(diào)用接口,這兩個(gè)類屬于客戶端代碼,必須位于client包中,WrapperServiceImpl類為服務(wù)器方法實(shí)現(xiàn)類,它實(shí)現(xiàn)ClipperService接口,屬于服務(wù)器端代碼,必須位于server包中。GWT中client包中的任何類想要使用非GWT配置文件中聲明的其他類中的方法必須通過異步調(diào)用接口來間接的調(diào)用。(4)主要客戶端與服務(wù)器端代碼:@RemoteServiceRelativePath("WrapperService")publicinterfaceWrapperServiceextendsRemoteService{ publicstaticclassUtil{ privatestaticWrapperServiceAsyncinstance; publicstaticWrapperServiceAsyncgetInstance(){ if(instance==null){ instance=GWT.create(WrapperService.class); } returninstance; } }//此方法負(fù)責(zé)加載用戶WebAPI的內(nèi)容并以嵌套表格的形式在頁面中展現(xiàn)出來 publicLoadDocumentRetloadWebApiDocument(Stringurl)throwsGwtException;//此方法負(fù)責(zé)保存WebAPI服務(wù) publicvoidcreateWebApiWrapper(Stringname,Stringservicetype,Stringdesc,Stringurl,Stringencoding, Map<String,String>urlParams, Map<String,String>paramName2description)throwsGwtException;//此方法用于判斷服務(wù)名是否存在 publicStringserviceNameExists(StringnewName)throwsGwtException;//此方法用于得到數(shù)據(jù)庫中的服務(wù)類型 publicList<String[]>getServiceType(intid)throwsGwtException;}在WrapperService接口中定義的方法必須在WrapperServiceAysc接口中定義類似的方法,返回值統(tǒng)一改為void,添加一個(gè)異步返回的參數(shù)AsyncCallback<String>callback如下:publicinterfaceWrapperServiceAsync{ publicvoidloadWebApiDocument(Stringurl,AsyncCallback<LoadDocumentRet>callback); publicvoidcreateWebApiWrapper(Stringname,Stringservicetype,Stringdesc,Stringurl,Stringencoding, Map<String,String>urlParams, Map<String,String>paramName2description,AsyncCallback<Void>callback); publicvoidserviceNameExists(StringnewName,AsyncCallback<String>callback); publicvoidgetServiceType(intid,AsyncCallback<List<String[]>>callback);}5.3本系統(tǒng)實(shí)現(xiàn)的服務(wù)推送的主要功能是:當(dāng)本登錄用戶或其他登錄用戶創(chuàng)建或者刪除服務(wù)的時(shí)候,只要用戶在創(chuàng)建或者刪除服務(wù)前打開了Home、Browse、MyDataService中的任一頁面并且在沒有關(guān)閉的情況下,頁面中的服務(wù)顯示列表都會(huì)動(dòng)態(tài)的進(jìn)行顯示。(1)首先需要dwr.xml的配置文件,在<allow></allow>標(biāo)簽中可以配置需要公開的方法供頁面中的JavaScript調(diào)用,本系統(tǒng)并沒有公開任何方法,可以不進(jìn)行配置,但是此文件是必須的。<dwr><allow><createcreator="new"Javascript="testClass"><includemethod="testMethod"/></create></allow></dwr>(2)需要在web.xml文件中進(jìn)行配置,如下: <servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>//這個(gè)參數(shù)默認(rèn)是false,如果選擇true,可以通過訪問

http://localhost:port/app/dwr

,看到部署的每個(gè)DWR類,并且可以測試Java代碼的每個(gè)方法是否運(yùn)行正常。 <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param>//下面的配置是啟用DWR的反向AJAX功能,可以實(shí)現(xiàn)服務(wù)器端無刷新更新頁面內(nèi)容。 <init-param> <param-name>activeReverseAjaxEnabled</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>initApplicationScopeCreatorsAtStartup</param-name> <param-value>true</param-value> </init-param> </servlet>

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論