專(zhuān)利名稱(chēng):Wade服務(wù)消息架構(gòu)的設(shè)計(jì)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及的是一種支持企業(yè)IT系統(tǒng)中的數(shù)據(jù)通信與轉(zhuǎn)換的方法技術(shù)領(lǐng)域,具 體是一種WADE服務(wù)消息架構(gòu)的設(shè)計(jì)方法。
背景技術(shù):
1. Java Java是由Sun Microsystems公司于1995年5月推出的Java程序設(shè)計(jì)語(yǔ)言(以 下簡(jiǎn)稱(chēng)Java語(yǔ)言)和Java平臺(tái)的總稱(chēng)。 Java編程語(yǔ)言是一種簡(jiǎn)單的,面向?qū)ο蟮模植际降?,解釋型的,健壯安全的,結(jié)構(gòu)
中立的,可移植的,性能優(yōu)異、多線(xiàn)程的動(dòng)態(tài)語(yǔ)言。 2. JavaScript Javascript是一種由Netsc即e的LiveScript發(fā)展而來(lái)的原型化繼承的面向?qū)?象的動(dòng)態(tài)類(lèi)型的區(qū)分大小寫(xiě)的客戶(hù)端腳本語(yǔ)言,主要目的是為了解決服務(wù)器端語(yǔ)言,比如 Perl,遺留的速度問(wèn)題,為客戶(hù)提供更流暢的瀏覽效果。 JavaScript的正式名稱(chēng)是"ECMAScript"。這個(gè)標(biāo)準(zhǔn)由ECMA組織發(fā)展和維 護(hù)。ECMA-262是正式的JavaScript標(biāo)準(zhǔn)。這個(gè)標(biāo)準(zhǔn)基于JavaScript (Netsc即e)和 JScript (Microsoft) 。 Netscape (Navigator 2.0)的Brendan Eich發(fā)明了這門(mén)語(yǔ)言,從 1996年開(kāi)始,已經(jīng)出現(xiàn)在所有的Netscape和Microsoft瀏覽器中。ECMA-262的開(kāi)發(fā)始于 1996年,在1997年7月,ECMA會(huì)員大會(huì)采納了它的首個(gè)版本。在1998年,該標(biāo)準(zhǔn)成為了國(guó) 際ISO標(biāo)準(zhǔn)(IS0/IEC 16262)。這個(gè)標(biāo)準(zhǔn)仍然處于發(fā)展之中。在2005年12月,ECMA發(fā)布 ECMA-357標(biāo)準(zhǔn)(IS0/IEC 22537)出臺(tái),主要增加對(duì)擴(kuò)展標(biāo)記語(yǔ)言XML的有效支持。
3.月艮務(wù)數(shù)據(jù)對(duì)象(Service Data Objects, SD0) 服務(wù)數(shù)據(jù)對(duì)象(Service Data Objects, SD0)是0RACLE(BEA)禾P IBM最近共同發(fā) 布的一項(xiàng)規(guī)范,正由JSR-235專(zhuān)家組進(jìn)行標(biāo)準(zhǔn)化以通過(guò)JCP(Java Community Process)審 核。SDO是一種數(shù)據(jù)編程架構(gòu)和API,它統(tǒng)一了不同數(shù)據(jù)源類(lèi)型的數(shù)據(jù)編程,提供了對(duì)通用 應(yīng)用程序模式的健壯支持,并使應(yīng)用程序、工具和框架更容易查詢(xún)、讀取、更新和檢查數(shù)據(jù)。 關(guān)于SD0架構(gòu)的高級(jí)概述,請(qǐng)參考白皮書(shū)Next-Generation Data Programming :Service Data 0bjects(pdf)。 WADE框架是基于J2EE體系架構(gòu)的應(yīng)用系統(tǒng)開(kāi)發(fā)框架,可廣泛的做為B/S架構(gòu)下的 應(yīng)用系統(tǒng)的底層開(kāi)發(fā)框架,特別在電信業(yè)務(wù)支撐系統(tǒng)中積累了大量的不同場(chǎng)景下的實(shí)現(xiàn)方 案和豐富的業(yè)務(wù)組件,更適合做為基于B/S架構(gòu)的門(mén)戶(hù)網(wǎng)站和各種業(yè)務(wù)管理系統(tǒng)的底層開(kāi) 發(fā)框架,對(duì)于企業(yè)級(jí)應(yīng)用系統(tǒng)能夠提供更好的使用操作的一致性、應(yīng)用系統(tǒng)的穩(wěn)定可靠性 以及可擴(kuò)展性等。 WADE框架通過(guò)以下四個(gè)層次來(lái)支撐應(yīng)用系統(tǒng)的開(kāi)發(fā)和維護(hù) wade-studio :開(kāi)發(fā)環(huán)境,基于eclipse的插件方式,提供開(kāi)發(fā)向?qū)В_(kāi)發(fā)模板,開(kāi) 發(fā)配置及代碼生成等,最大限度的簡(jiǎn)化開(kāi)發(fā)者的開(kāi)發(fā)效率。
wade-runtime :運(yùn)行環(huán)境,基于配置方式運(yùn)行,提供頁(yè)面流程,操作邏輯,頁(yè)面元素 配置以及豐富的組件庫(kù),最大限度地提高功能的配置化。 wade-console :配置監(jiān)控,基于wade應(yīng)用的配置監(jiān)控,如流程的配置監(jiān)控,頁(yè)面布 局配置,頁(yè)面生成配置以及在線(xiàn)系統(tǒng)版本和升級(jí)的管理等。 wade-helper :輔助使用,基于wade網(wǎng)站及論壇,提供框架版本發(fā)布,開(kāi)發(fā)工具、文 檔等的下載,提供開(kāi)發(fā)溝通交流平臺(tái),解決開(kāi)發(fā)者問(wèn)題。 基于WADE的WEB化應(yīng)用內(nèi)部各層之間都是通過(guò)服務(wù)借助消息進(jìn)行通信,應(yīng)用和應(yīng) 用之間也是如此,就需要統(tǒng)一的服務(wù)消息架構(gòu)成為WEB化應(yīng)用框架需要的基礎(chǔ)類(lèi)庫(kù)。
發(fā)明內(nèi)容
發(fā)明目的為WEB化應(yīng)用所處體系結(jié)構(gòu)及其內(nèi)部層次結(jié)構(gòu)涉及的跨協(xié)議、跨編程 模型等異構(gòu)環(huán)境下服務(wù)通信和消息轉(zhuǎn)換提供統(tǒng)一的消息模型和架構(gòu)支持,具體技術(shù)方案如 下 —種WADE服務(wù)消息架構(gòu)(WSMA)的設(shè)計(jì)方法,具體是包括WSMA的接口 (API)定義 和基本實(shí)現(xiàn)。 1. WSMA API包括動(dòng)態(tài)數(shù)據(jù)API、數(shù)據(jù)類(lèi)型自檢API和數(shù)據(jù)變化跟蹤API,分別定義 于IDataset禾口 IData接口之中。 動(dòng)態(tài)數(shù)據(jù)API是一種常見(jiàn)的技術(shù),JDBC ResultSet和RowSet API是用于關(guān)系數(shù)據(jù) 的動(dòng)態(tài)數(shù)據(jù)API,而DOM API(尤其是節(jié)點(diǎn)和元素)是用于XML數(shù)據(jù)的動(dòng)態(tài)數(shù)據(jù)API。 WSMA 接口是一個(gè)泛化的動(dòng)態(tài)數(shù)據(jù)API,這意味著可以獨(dú)立于任何特定的持久化機(jī)制或串行化格 式而被使用,這樣設(shè)計(jì),可良好處理對(duì)象數(shù)據(jù)、關(guān)系數(shù)據(jù)、表列數(shù)據(jù)和XML,使得更高級(jí)別的 框架(例如WADE)得以處理來(lái)自多個(gè)異構(gòu)數(shù)據(jù)源的數(shù)據(jù)。 本方法設(shè)計(jì)的WSMA為了保持簡(jiǎn)單的結(jié)構(gòu)以獲取較高性能,更為關(guān)注表列數(shù)據(jù)型 消息的承載。 WSMA使用了消息數(shù)據(jù)集和消息數(shù)據(jù)。消息數(shù)據(jù)集是消息數(shù)據(jù)的有序集合,相當(dāng) 于表列數(shù)據(jù)的多行記錄,對(duì)應(yīng)IDataset接口。消息數(shù)據(jù)由若干鍵值對(duì)組成,鍵和值分別對(duì) 應(yīng)消息數(shù)據(jù)的屬性和屬性值,相當(dāng)于表列數(shù)據(jù)的一行記錄,對(duì)應(yīng)IData接口。 IDataset和 IData定義了若干動(dòng)態(tài)數(shù)據(jù)API,包括增加消息數(shù)據(jù)(add)、移除消息數(shù)據(jù)(remove)、獲取消 息數(shù)據(jù)(getData)、設(shè)置屬性值(put)、獲取屬性值(get)、獲取屬性名稱(chēng)集(getNames)等, 用于構(gòu)造和訪(fǎng)問(wèn)服務(wù)消息數(shù)據(jù),支持包括動(dòng)態(tài)查詢(xún)、未知數(shù)據(jù)類(lèi)型和可擴(kuò)展模式等情況的 通用框架。 WSMA接口定義了類(lèi)似getString、getInt等數(shù)據(jù)類(lèi)型自檢API ,用于屬性取值時(shí)類(lèi) 型檢查和轉(zhuǎn)換。消息數(shù)據(jù)的屬性取值默認(rèn)是未知數(shù)據(jù)類(lèi)型(Java. lang. Object),支持包括 String、int等在內(nèi)的基本數(shù)據(jù)類(lèi)型。另外,消息數(shù)據(jù)或消息數(shù)據(jù)集本身也在支持的數(shù)據(jù)類(lèi) 型之列,可以通過(guò)建立層次關(guān)系來(lái)承載對(duì)象數(shù)據(jù)、關(guān)系數(shù)據(jù)、XML。例如服務(wù)通信中某一消息 的內(nèi)容是客戶(hù)信息,則可以創(chuàng)建一個(gè)IData型的實(shí)例。該客戶(hù)的帳戶(hù)信息則定義成IData 實(shí)例的一個(gè)屬性,該屬性的類(lèi)型為IDataset,對(duì)應(yīng)一個(gè)IDataset型實(shí)例,包含該客戶(hù)的若 干帳戶(hù)信息,每一帳戶(hù)信息又都是IData型。 WSMA參照SDO規(guī)范被設(shè)計(jì)成具備記憶能力,數(shù)據(jù)集和數(shù)據(jù)被創(chuàng)建之后的所有更改以通過(guò)數(shù)據(jù)變化跟蹤API來(lái)獲取這些更改。這一點(diǎn)非常有益于富客戶(hù) 端(UI層)實(shí)現(xiàn)用戶(hù)對(duì)數(shù)據(jù)操作的撤銷(xiāo)、重做,以及數(shù)據(jù)持久化時(shí)提供數(shù)據(jù)變更記錄等所有 關(guān)心數(shù)據(jù)變化過(guò)程的應(yīng)用場(chǎng)景。服務(wù)數(shù)據(jù)對(duì)象(Service Data Objects, SD0)規(guī)范問(wèn)世以 后,對(duì)比發(fā)現(xiàn)WSMA同SDO規(guī)范不謀而合,但需要進(jìn)行相關(guān)改造,使之完全符合規(guī)范要求,并 力圖成為標(biāo)準(zhǔn)化組織中的重要成員參與規(guī)范建設(shè)。 2. WSMA的基本實(shí)I見(jiàn)包f舌DatasetList禾口 DataMap,基于Java禾口 Javascript i勻有 實(shí)現(xiàn) 在Java平臺(tái)中,DatasetList是Java. util. ArrayList的重載,DataM即是Java, util. HashMap的重載;在Javascript應(yīng)用環(huán)境中,DatasetList禾口 DataMap是采用面向?qū)?象的私有實(shí)現(xiàn),使用類(lèi)似于Java. util. ArrayList和Java. util. HashM即。充分利用Java 和Javascript的既有特性,盡量避免不必要的學(xué)習(xí)門(mén)檻,做到不但通俗易懂,而且應(yīng)用方 便。使用時(shí)僅僅需要引用相應(yīng)JAR包或JS文件即可,開(kāi)發(fā)人員上手比較快,部署方便,運(yùn)行 時(shí)可靠性也很高。 WSMA接口是一個(gè)泛化的動(dòng)態(tài)數(shù)據(jù)API,泛化是針對(duì)特化的相對(duì)概念,泛化可以理 解為從若干具有共性的類(lèi)中抽取出基類(lèi);相反的,繼承某一個(gè)基類(lèi),去描述某個(gè)特定的業(yè) 務(wù),則屬于特化。同樣,動(dòng)態(tài)也是針對(duì)靜態(tài)的相對(duì)概念,是基于API在使用中輸入輸出參數(shù) 個(gè)數(shù)和類(lèi)型是否可以改變而提出,可變的稱(chēng)為動(dòng)態(tài),不可變稱(chēng)為靜態(tài)。在數(shù)據(jù)模型當(dāng)中,通 常有"強(qiáng)類(lèi)型"和"弱類(lèi)型"的區(qū)分。采用面向?qū)ο蠼7椒ń⒌臄?shù)據(jù)模型被稱(chēng)為"強(qiáng)類(lèi) 型",是針對(duì)具體業(yè)務(wù)場(chǎng)景中各種各樣業(yè)務(wù)對(duì)象的分別建模,期望唯一、準(zhǔn)確地描述特定業(yè) 務(wù)對(duì)象模型特征。"強(qiáng)類(lèi)型"采用"特化的靜態(tài)數(shù)據(jù)API",諸如設(shè)置客戶(hù)姓名、獲取用戶(hù)電話(huà) 號(hào)碼等,都是具體到特定的業(yè)務(wù)屬性,并且輸入輸出參數(shù)個(gè)數(shù)及類(lèi)型都是確定的,不能在使 用中改變。"弱類(lèi)型"是一種事先定義好、不會(huì)隨業(yè)務(wù)場(chǎng)景變化而發(fā)生改變的數(shù)據(jù)模型,使用 中僅僅通過(guò)其承載的數(shù)據(jù)內(nèi)容來(lái)區(qū)分具體屬于哪一個(gè)業(yè)務(wù)對(duì)象。"泛化的動(dòng)態(tài)數(shù)據(jù)API"是 為"弱類(lèi)型"專(zhuān)門(mén)設(shè)計(jì)的,用來(lái)操作業(yè)務(wù)場(chǎng)景中所有業(yè)務(wù)對(duì)象的全部屬性特征描述,同時(shí)也 包括各個(gè)業(yè)務(wù)對(duì)象本身的特征描述。例如同樣是設(shè)置客戶(hù)姓名,"泛化的動(dòng)態(tài)數(shù)據(jù)API"表 述為獲取字段名稱(chēng)為姓名的字段值。"弱類(lèi)型"相比"強(qiáng)類(lèi)型"更加靈活,更適合在復(fù)雜多變 的業(yè)務(wù)場(chǎng)景中被使用。 有益效果是,本方法采用統(tǒng)一的編程模型實(shí)現(xiàn)各種服務(wù)間通信和消息轉(zhuǎn)換,有效 屏蔽了各種服務(wù)協(xié)議和編程模型的差異。提高了通信效率的同時(shí),還降低因異構(gòu)引起的程 序復(fù)雜度。很好地滿(mǎn)足了復(fù)雜環(huán)境中多協(xié)議、大容量、高并發(fā)應(yīng)用的服務(wù)通信需求,特別適 應(yīng)在國(guó)內(nèi)電信行業(yè)快速發(fā)展過(guò)程中IT系統(tǒng)普遍項(xiàng)目工期短、大團(tuán)隊(duì)開(kāi)發(fā)協(xié)作等高負(fù)荷開(kāi) 發(fā)場(chǎng)景。
圖1是基于WADE框架的WEB化應(yīng)用中WSMA的所處位置示意圖;
圖2. 1和2. 2是基于S0A的企業(yè)IT系統(tǒng)中WSMA的所處位置示意圖;其中,
圖2. 1是S0A Foundation中所有服務(wù)都可以使用WSMA客戶(hù)端作為服務(wù)消息基礎(chǔ) 架構(gòu)示意圖; 圖2. 2是以數(shù)據(jù)服務(wù)(Data Access Service)為例詳細(xì)表現(xiàn)了 WSMA在服務(wù)實(shí)現(xiàn)
5中的具體位置示意圖; 圖3是WSMA消息模型示例示意圖。
具體實(shí)施例方式
下面結(jié)合附圖與具體實(shí)施方式
對(duì)本發(fā)明作進(jìn)一步說(shuō)明 —種WADE服務(wù)消息架構(gòu)的設(shè)計(jì)方法,其特征是WADE服務(wù)消息架構(gòu)即WSMA的設(shè)計(jì)
步驟包括API的定義和基本實(shí)現(xiàn); 1)所述WSMA的API定義設(shè)計(jì)包括 所述WSMA的API包括動(dòng)態(tài)數(shù)據(jù)API 、數(shù)據(jù)類(lèi)型自檢API和數(shù)據(jù)變化跟蹤API ,分別 定義于IDataset禾口 IData接口之中; 1. 1)所述WSMA的API定義了動(dòng)態(tài)數(shù)據(jù)API包括JDBC ResultSet和RowSet API以 及DOM API ;所述JDBC ResultSet和RowSet API是用于關(guān)系數(shù)據(jù)的動(dòng)態(tài)數(shù)據(jù)API ;DOMAPI 是用于XML數(shù)據(jù)的動(dòng)態(tài)數(shù)據(jù)API ; 在WSMA中使用了消息數(shù)據(jù)集和消息數(shù)據(jù);所述消息數(shù)據(jù)集是消息數(shù)據(jù)的有序集 合,相當(dāng)于表列數(shù)據(jù)的多行記錄,對(duì)應(yīng)IDataset接口 ;所述消息數(shù)據(jù)由若干鍵值對(duì)組成,鍵 和值分別對(duì)應(yīng)消息數(shù)據(jù)的屬性和屬性值,相當(dāng)于表列數(shù)據(jù)的一行記錄,對(duì)應(yīng)IData接口 ;由 所述IDataset和IData接口定義了多個(gè)動(dòng)態(tài)數(shù)據(jù)API,包括增加消息數(shù)據(jù)add、移除消息 數(shù)據(jù)remove、獲取消息數(shù)據(jù)getData、設(shè)置屬性值put、獲取屬性值get和獲取屬性名稱(chēng)集 getNames,用于構(gòu)造和訪(fǎng)問(wèn)服務(wù)消息數(shù)據(jù),支持包括動(dòng)態(tài)查詢(xún)、未知數(shù)據(jù)類(lèi)型和可擴(kuò)展模式 等情況的通用框架; 1. 2) WSMA的API還定義了類(lèi)似getString、getlnt等數(shù)據(jù)類(lèi)型自檢API,用于屬性 取值時(shí)類(lèi)型檢查和轉(zhuǎn)換;消息數(shù)據(jù)的屬性取值默認(rèn)是未知數(shù)據(jù)類(lèi)型Java. lang. Object,支 持包括String、 int等在內(nèi)的基本數(shù)據(jù)類(lèi)型;消息數(shù)據(jù)或消息數(shù)據(jù)集本身也在支持的數(shù)據(jù) 類(lèi)型之列,可以通過(guò)建立層次關(guān)系來(lái)承載對(duì)象數(shù)據(jù)、關(guān)系數(shù)據(jù)、XML ;
1. 3) WSMA的API還定義了數(shù)據(jù)變化跟蹤API : WSMA參照SDO規(guī)范被設(shè)計(jì)成具備記憶能力,數(shù)據(jù)集和數(shù)據(jù)被創(chuàng)建之后的所有更改 均會(huì)被逐一記錄,可以通過(guò)數(shù)據(jù)變化跟蹤API來(lái)獲取這些更改; 2) WSMA的基本實(shí)現(xiàn)包括DatasetList和DataMap,基于Java和Javascript實(shí)現(xiàn)
在Java平臺(tái)中,DatasetList是Java. util. ArrayList的重載,DataM即是Java, util. HashM即的重載; 在Javascript應(yīng)用環(huán)境中,DatasetList和DataMap是采用面向?qū)ο蟮乃接袑?shí)現(xiàn), 使用類(lèi)似于Java. util. ArrayList禾口 Java. util. HashM即;充分利用Java禾口 Javascript的 既有特性,盡量避免不必要的學(xué)習(xí)門(mén)檻。 本例中,上述的API定義和基本實(shí)現(xiàn)都可以用現(xiàn)有編程語(yǔ)言實(shí)現(xiàn),不再進(jìn)一步限 制,下面是各類(lèi)API的舉例說(shuō)明 IDataset (多列數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)了 List接口的所有方法,并擴(kuò)展以下方法)
1. public Object get (int index);獲取一行數(shù)據(jù) 2. public Object get (int index, String謹(jǐn)e);獲取一行數(shù)據(jù)(IData)中指定 列名的數(shù)據(jù)值
3. public Object get(int index, String n咖e, Object defaultValue);獲取一 行數(shù)據(jù)(IData)中指定列名的數(shù)據(jù)值,如果值為空,取defaultValue默認(rèn)值
4. public IData getData(int index);獲取一行IData結(jié)構(gòu)的數(shù)據(jù)
5. public String[]getNames();獲取列名數(shù)組 6. public int count ();獲取列表總數(shù),如果分頁(yè)中獲取的為分頁(yè)總記錄,否則同 size方法 7. public IData toData();將IDataset轉(zhuǎn)成IData, data的每個(gè)名字放置一 個(gè)List,這種方式適用于傳遞多行數(shù)據(jù)給后臺(tái)調(diào)用,如前臺(tái)拼傳獲取IDataset,然后轉(zhuǎn)成 IData后callTuxedoSvc 8. public IDataset filter (String filter);根據(jù)條件過(guò)濾并獲取符合條件的 數(shù)據(jù)集,如filter為〃 KEY1 = VALUE1〃或〃 KEY1 = VALUE1,KEY2 = VALUE2〃的數(shù)據(jù),多 個(gè)提交用,號(hào)分隔 9. public IDataset distinct (String fieldName);根據(jù)指定列獲取排重(不重 復(fù))的數(shù)據(jù)集,比如傳入fieldName為〃 USER_ID〃時(shí),將過(guò)濾后只獲取數(shù)據(jù)集中USER_ID 值不重復(fù)的數(shù)據(jù) 10.常用實(shí)現(xiàn)類(lèi),DatasetList(適用于自定義構(gòu)造IDataset對(duì)象)、DataFmpMap、 DatasetResult。 11. DatasetList構(gòu)造方式,new DatasetList():(構(gòu)造 一 個(gè)空 DatasetList) 、 newDatasetList (List list):構(gòu)造 一 個(gè)List對(duì)象為DatasetList、 固DatasetList (String str):根據(jù) 一 串文本構(gòu)造DatasetList,文本格式禾口 DatasetList. toString()生成的文本格式一樣。 IData (單列數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)了 M即接口的所有方法,并擴(kuò)展以下方法) 1. public Object get (String name);獲取指定列名的數(shù)據(jù)值 2. public Object get (String謹(jǐn)e, Object defaultValue);獲取指定列名的數(shù)
據(jù)值,如果值為空,取defaultValue默認(rèn)值 3. public String[]getNames();獲取列名數(shù)組 4. public String getString(String name);獲取指定列名的字符型數(shù)據(jù)值,如 果值為空,返回空對(duì)象,不會(huì)自動(dòng)轉(zhuǎn)為空串 5. public String getString (String name, String defaultValue);獲取指定列 名的字符型數(shù)據(jù)值,如果值為空,取defaultValue默認(rèn)值 6. public int getlnt (String name);獲取指定列名的整型數(shù)據(jù)值,如果值為空 或?yàn)榭沾?,取O 7. public int getlnt (String薩e,int defaultValue);獲取指定列名的整型數(shù) 據(jù)值,如果值為空或?yàn)榭沾?,取defaultValue默認(rèn)值 8. public double getDouble (String name);獲取指定列名的浮點(diǎn)型數(shù)據(jù)值,如 果值為空或?yàn)榭沾?,取O 9. public double getDouble (String name, double defaultValue);獲取指定列 名的浮點(diǎn)數(shù)據(jù)值,如果值為空或?yàn)榭沾?,取defaultValue默認(rèn)值 10. public boolean getBoolean(String謹(jǐn)e);獲取指定列名的布爾型數(shù)據(jù)值,如果值為空或?yàn)榭沾?,取false 11. public boolean getBoolean(String name, boolean defaultValue);獲取指
定列名的布爾數(shù)據(jù)值,如果值為空或?yàn)榭沾?,取defaultValue默認(rèn)值 12. public IData getData(String謹(jǐn)e);獲取指定列名的IData數(shù)據(jù)值 13. public IDataset getDataset (String謹(jǐn)e);獲取指定列名的IDataset數(shù)據(jù)
值 14. public IDataset toDataset ();將數(shù)據(jù)轉(zhuǎn)換為IDataset形式,注必須要保 證data的每個(gè)元素都是一個(gè)IDataset或List接口的對(duì)象 15.常用實(shí)現(xiàn)類(lèi),DataM即(適用于自定義構(gòu)造IData對(duì)象),DataOraMap
16. DataMap構(gòu)造方式,new DatasetList ():(構(gòu)造 一 個(gè)空DatasetList)、 newDatasetList (List list):構(gòu) 造 一 個(gè)List對(duì) 象 為DatasetList、 固DatasetList (String str):根據(jù) 一 串文本構(gòu)造DatasetList,文本格式禾口 DatasetList. toString()生成的文本格式一樣。 17.注獲取值轉(zhuǎn)換成原生數(shù)據(jù)類(lèi)型時(shí),如果獲取的為空或空串,會(huì)自動(dòng)賦默認(rèn)
值,如getlnt獲取的值為空或空串時(shí)會(huì)轉(zhuǎn)為0 IDataset接口提供的排序功能 1.使用方法 例1 :(對(duì)NAME列進(jìn)行升序排列) dataset. sort(" NAME" , IDataset. TYPE—STRING, IDataset. ORDER—ASCEND); 例2 :(在對(duì)NAME列進(jìn)行升序排列的基礎(chǔ)上再對(duì)AGE列進(jìn)行降序排列) dataset. sort (〃 NAME〃 , IDataset. TYPE_STRING, IDataset. 0RDER_
ASCEND, 〃 AGE" , IDataset. TYPE—INTEGER, IDataset. ORDER—DESCEND); 2.備注 可以依據(jù)特定的數(shù)據(jù)類(lèi)型進(jìn)行排序,現(xiàn)有的數(shù)據(jù)類(lèi)型有(字符串
IDataset. TYPE—STRING ;整數(shù)IDataset. TYPE—INTEGER ;浮點(diǎn)型
IDataset. TYPE_D0UBLE)。
下面是基本實(shí)現(xiàn)的舉例說(shuō)明
Javascript中對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu) Wade. DatasetList類(lèi)似多列數(shù)據(jù)結(jié)構(gòu)的Javascript實(shí)現(xiàn),主要包括以下方法和 屬性 1. length屬性得到所包含的數(shù)據(jù)行數(shù)長(zhǎng)度 2. get (index [int], key [string])方法獲取一行數(shù)據(jù),如果設(shè)置了 key,并且獲
取的數(shù)據(jù)是Wade. DataMap格式的數(shù)據(jù),則返回其中名稱(chēng)為key的項(xiàng) 3. each (fn[function] , scope [object])方法遍歷數(shù)據(jù) 4. add(o[object])方法增加一行數(shù)據(jù) 5. remove (o [object])方法刪除數(shù)據(jù)列中的一列6. removeAt(index[int])方法刪除數(shù)據(jù)列中的一列 7. indexOf(o[object])方法獲取某列數(shù)據(jù)的行標(biāo) 8. getCount()方法獲取所包含的數(shù)據(jù)行記錄數(shù)
Wade. DataM即類(lèi)似單列數(shù)據(jù)結(jié)構(gòu)的Javascript實(shí)現(xiàn),主要包括以下方法和屬性 1. length屬性得到所包含的數(shù)據(jù)項(xiàng)長(zhǎng)度 2. get (name [string], defaultValue [string])方法獲取項(xiàng)數(shù)據(jù),如果值為空并 且設(shè)置了默認(rèn)值則返回默認(rèn)值 3. each (fn [function], scope [object])方法遍歷所有數(shù)據(jù)項(xiàng) 4. eachKey(fn[function] , scope [object])方法遍歷所有數(shù)據(jù)項(xiàng)名稱(chēng) 5. put (name [string] , value [object])方法增力口一項(xiàng)數(shù)據(jù) 6. remove (o [object])方法刪除數(shù)據(jù)中的一項(xiàng) 7. removeKey (name[string])方法根據(jù)項(xiàng)名稱(chēng)來(lái)刪除數(shù)據(jù)中的一項(xiàng) 8. getCount()方法獲取所包含的數(shù)據(jù)項(xiàng)總數(shù) 9. contains (o [object])方法判斷是否包含指定的數(shù)據(jù)項(xiàng) 10. containsKey (name[string])方法判斷是否包含指定名稱(chēng)的數(shù)據(jù)項(xiàng) ll.clear()方法清空所有數(shù)據(jù)項(xiàng) 12. first()方法獲取第一項(xiàng)數(shù)據(jù) 13. last()方法獲取最后一項(xiàng)數(shù)據(jù) 14. fillFormElements(form[domelement])方法,將對(duì)象包含的值填充到和項(xiàng)名 稱(chēng)匹配的表單元素中 數(shù)據(jù)轉(zhuǎn)換方式 1、 IDataset轉(zhuǎn)字符串 (1、)簡(jiǎn)單數(shù)據(jù)結(jié)構(gòu)輸出結(jié)果(IDataset每個(gè)元素為IData) 代碼片段 〃定義IDataset IDataset si = new DatasetList(); 〃定義IData IData dl = new DataMap (); 〃加入元素 dl.put(〃 KEY11" , 〃 valuell"); dl.put(〃 KEY12" , 〃 valuel2"); dl.put(〃 KEY13" , 〃 valuel3"); //添力口至lj IDataset中 si. add(dl); IData d2 = new DataMap (); d2.put(〃 KEY21" , 〃 value21"); d2.put(" KEY22" , null); d2.put(〃 KEY23" , 〃 value23"); sl.add(d2); System, out. println (si); 輸出結(jié)果 [{KEY11=[" valuell" ],KEY12=[〃 valuel2" ],KEY13=[〃 valuel3" ]},],KEY23=[" value23" ],KEY21=[" value21" ]}]
空字符串,每個(gè)元素的值通過(guò)=[..]來(lái)表示,
KEY22 =[ 〃 0135] 說(shuō)明
0136] 若對(duì)應(yīng)的值為空,會(huì)自動(dòng)轉(zhuǎn)為 若為數(shù)組,通過(guò),號(hào)分隔
0137] (2、)復(fù)雜數(shù)據(jù)結(jié)構(gòu)輸出結(jié)果(IData和IDataset相互嵌套) 代碼片段
IDataset si = new DatasetListO ; IData dl = new DataMap(); dl.put(〃 KEY11" , 〃 valuell dl.put(〃 KEY12" , 〃 valuel2 dl.put(〃 KEY13" , 〃 valuel3 si. add(dl);
IData d2 = new DataMap(); d2.put(〃 KEY21" , 〃 value21 d2. put(" KEY22" , null); d2.put(〃 KEY23" , 〃 value23 sl. add(d2);
IDataset s2 = new DatasetListO s2. add(d2);
IData d3 = new DataMap(); d3.put(〃 KEY31" , 〃 value31" d3.put(〃 KEY32" , 〃 value32" d3.put(〃 KEY33" , 〃 value33" 〃加入一個(gè)IData d2.put(" DATA" , d3); 〃力口入一個(gè)IDataset sl.add(s2);
System, out. println (si);
輸出結(jié)果,KEY12 :[〃 〃 ],DATA = [ {KEY33 =[
0138] 0139] 0140] 0141] 0142] 0143] 0144] 0145] 0146] 0147] 0148] 0149] 0150] 0151] 0152] 0153] 0154] 0155] 0156] 0157] 0158] 0159] 0160] 0161] 0162] KEY22 0163] KEY21 = 0164]
],KEY13= [〃 valuel3" ]},
,KEY32 =[ 〃 ["value21 DATA =[ 〃
value32" ],KEY31=[' ']}, 〃 [{KEY22 =[" {KEY33 = [ 〃 value33 KEY23 = [" value23〃
'value31" "],
'],KEY32 ],KEY21 =
value31" ]} 0165] 說(shuō)明
0166] IDataset和Data之間可以互相嵌套使用 0167] 2、IData轉(zhuǎn)字符串
0168] (1、)簡(jiǎn)單數(shù)據(jù)結(jié)構(gòu)輸出結(jié)果(IDatas每個(gè)元素為非集合對(duì)象)
]}],KEY23= [〃 value23"],
=[〃 value32 〃 ], KEY31 = [〃 value21〃 ]}]〃 ]
10
代碼片段 〃定義IData IData d3 = new DataMap (); d3.put(〃 KEY31" , 〃 value31"); d3.put(〃 KEY32" , 〃 value32"); d3.put(〃 KEY33" , 〃 value33"); System, out. println (d3); 輸出結(jié)果 {KEY33=[〃 value33" ],KEY32=[〃 value32" ],KEY31=[〃 value31" ]} 說(shuō)明 每個(gè)值通過(guò)[〃 〃 ]表示,若為值為數(shù)組通過(guò)[〃 〃 , 〃 〃 ]表示 (2、)復(fù)雜數(shù)據(jù)結(jié)構(gòu)輸出結(jié)果(IData和IDataset相互嵌套) 代碼片段 IData d3 = new DataMap (); d3.put(〃 KEY31" , 〃 value31"); d3.put(〃 KEY32" , 〃 value32"); d3.put(〃 KEY33" , 〃 value33"); IDataset sl = new DatasetList(); IData dl = new DataMap (); dl.put(〃 KEY11" , 〃 valuell"); dl.put(〃 KEY12" , 〃 valuel2"); dl.put(〃 KEY13" , 〃 valuel3"); sl. add(dl); IData d2 = new DataMap (); d2.put(〃 KEY21" , 〃 value21"); d2.put(" KEY22" , null); d2.put(〃 KEY23" , 〃 value23"); sl. add(d2); 〃力口入IDataset,元素為IData對(duì)象 d3.put(〃 DATASET〃 , sl); IData d4 = new DataMap (); d4.put(〃 KEY41" , 〃 value41"); d4.put(〃 KEY42" , 〃 value42〃 ); d4.put(〃 KEY43" , 〃 value43〃 ); d4.put(" DATA" , d4); 〃加入IDataset,元素為String對(duì)象 IDataset s2 = new Datase讓ist 0 ; s2. add(" VALUE 1〃 ); s2. add(" VALUE2〃 );
11s2. add(" VALUE3〃 );
s2. add(" VALUE4〃 );
d3. put(" LIST" , s2);
System, out. println (d3);
輸出結(jié)果 {KEY33 = [ 〃 value33 〃 ], DATASET = [{KEY11 = [ 〃 valuell 〃 ], KEY12 = ["valuel2" ],KEY13=[" valu e13 〃 ]}, {KEY22 = [ 〃 〃 ] , KEY23 = [ 〃 value23 〃 ],KEY21 = ["value21" ]}],KEY32=[" value32"],LIST = [〃 VALUE1〃 , 〃 VALUE2 〃 , 〃 VALUE3 〃 , 〃 VALUE4 〃 ],KEY31 =} 3 、字符串轉(zhuǎn)IDataset String str = 〃 [{KEY11 = [ 〃 valuell 〃 ], KEY12 = [ 〃 valuel2 〃 ], KEY13 = [ 〃 valuel3 〃 ]}, {KEY22 = [ 〃 〃 ], KEY23 = [ 〃 value23 〃 ], KEY21 = ["value21〃 ]}]"; IDataset dataset = new DatasetList(str);
4、字符串轉(zhuǎn)IData String str =〃 {KEY33 = [〃 value33" ],KEY32=[〃 value32" ],KEY31 = [〃 value31〃 ]}〃 ;IData data = new DatasetList (str);
注 1 、字符串與IData、 IDataset對(duì)象靈活轉(zhuǎn)換 2、轉(zhuǎn)換時(shí)不依賴(lài)于IData、 IDataset的結(jié)構(gòu)、可以無(wú)限層次嵌套, 3、若從字符串轉(zhuǎn)換為IData、 IDataset結(jié)構(gòu)時(shí),子嵌套的對(duì)象直接通過(guò) data, get(〃 key" ) , dataset. get (0)獲取,如果要獲取子對(duì)象,需要強(qiáng)制轉(zhuǎn)換,
如((IData) data, get (" key" )).get(O) JavaScript數(shù)據(jù)結(jié)構(gòu)的使用 根據(jù)字符串來(lái)創(chuàng)建DataM即對(duì)象 var d4 = new Wade. DataMap (, {KEY33 = [ 〃 value33 〃 ] , KEY32 = ["value32〃 ],KEY31=[" value31〃 ]},); 獲取對(duì)象中的數(shù)據(jù)項(xiàng)var v = d4. get(' KEY33', , defaultValue,); 增加對(duì)象的數(shù)據(jù)項(xiàng)d4. put (' KEY34' , , value34'); 根據(jù)項(xiàng)名刪除對(duì)象中的數(shù)據(jù)項(xiàng)d4. removeKey(' KEY34');遍歷對(duì)象中的數(shù)據(jù)項(xiàng)d4. each (function (item, index, totalco皿t) { alert(,共,+totalcoimt+,項(xiàng),這是第,+ (index+1)+,項(xiàng),值
為,+ item); }); 將對(duì)象輸出成字符串格式d4. toString();
根據(jù)字符串來(lái)創(chuàng)建DatasetList對(duì)象
12
var ds4 = new Wade. DatasetList (, [{KEY11 = [ 〃 valuell 〃 ], KEY12 = ["valuel2〃 ], KEY13 = [〃 valuel3" ]}, {KEY22 = [〃 〃 ] , KEY23 = [〃 value23" ],KEY21 =[〃 value21〃 ]}],); 在這個(gè)例子中,DatasetList對(duì)象里嵌套了 DataM即對(duì)象 根據(jù)行標(biāo)刪除多列數(shù)據(jù)集中的一列ds4. removeAt (0); 增加多列數(shù)據(jù)集的列 var newd = new Wade. DataMap (); newd. put (, KEY33, , ' value33,); 固d. put (, KEY43, , , value43,); ds4. add (newd); 獲取多列數(shù)據(jù)集中的一列,ds4. get(O),獲取列中的項(xiàng)值ds4. get(O, ' KEY33') 直接刪除多列數(shù)據(jù)集中的列數(shù)據(jù)d4. remove (newd); 遍歷多列數(shù)據(jù)集中的數(shù)據(jù)列 ds4. each (function (item, index, totalco皿t) { alert('共'+totalcount+'列,這是第'+(index+l)+'列,輸出為字符串 是' +item); }); 輸出多列數(shù)據(jù)集成字符串格式ds4.toString(); 推薦的服務(wù)器端與客戶(hù)端數(shù)據(jù)交互方式 1、普通交互 (1).服務(wù)器傳遞數(shù)據(jù)到頁(yè)面 pd. setTransfer(〃 info" , dataset. toString()); 在頁(yè)面端會(huì)生成〈input id=〃 info" name = 〃 info" type = 〃 hidden" value =〃 [{KEY1=[〃 VALUE1" ],KEY2=[〃 VALUE2" ]}]〃 />這種數(shù)據(jù) (2).客服端獲取數(shù)據(jù)對(duì)象 var dataset = new DatasetList (getElementValue (〃 info"));〃將串轉(zhuǎn)成 Dataset對(duì)象,getElementValue(" info")表示獲取name = 〃 info"的隱藏框的值 (3).服務(wù)器獲取數(shù)據(jù)對(duì)象 IDataset info = new DatasetList (pd. getPar謙ter(〃 info"));〃將串轉(zhuǎn)
成Dataset對(duì)象,pd. getParameter(" info")表示獲取name = 〃 info"的隱藏框的值 2、ajax交互 (1).客服端發(fā)起請(qǐng)求 ajaxDirect (this, , listener, , par咖s); (2).服務(wù)器傳遞數(shù)據(jù)到頁(yè)面 pd. setAjaxDataset (dataset); (3).客戶(hù)端獲取數(shù)據(jù) this. afterAction = 〃 f皿cl () 〃 ;〃必須通過(guò)afterAction才會(huì)緣取數(shù)據(jù),
this. afterAction寫(xiě)在ajaxDirect方法之后 function funcl () { var dataset = thi s. ajaxDataset ;//獲取月艮務(wù)器端數(shù)據(jù) ... }
權(quán)利要求
一種WADE服務(wù)消息架構(gòu)的設(shè)計(jì)方法,其特征是WADE服務(wù)消息架構(gòu)即WSMA的設(shè)計(jì)步驟包括API的定義和基本實(shí)現(xiàn);1)所述WSMA的API定義設(shè)計(jì)包括所述WSMA的API包括動(dòng)態(tài)數(shù)據(jù)API、數(shù)據(jù)類(lèi)型自檢API和數(shù)據(jù)變化跟蹤API,分別定義于IDataset和IData接口之中;1.1)所述WSMA的API定義了動(dòng)態(tài)數(shù)據(jù)API包括JDBC ResultSet和RowSet API以及DOM API;所述JDBC Resul tSet和RowSet API是用于關(guān)系數(shù)據(jù)的動(dòng)態(tài)數(shù)據(jù)API;DOMAPI是用于XML數(shù)據(jù)的動(dòng)態(tài)數(shù)據(jù)API;在WSMA中使用了消息數(shù)據(jù)集和消息數(shù)據(jù);所述消息數(shù)據(jù)集是消息數(shù)據(jù)的有序集合,相當(dāng)于表列數(shù)據(jù)的多行記錄,對(duì)應(yīng)IDataset接口;所述消息數(shù)據(jù)由若干鍵值對(duì)組成,鍵和值分別對(duì)應(yīng)消息數(shù)據(jù)的屬性和屬性值,相當(dāng)于表列數(shù)據(jù)的一行記錄,對(duì)應(yīng)IData接口;由所述IDataset和IData接口定義了多個(gè)動(dòng)態(tài)數(shù)據(jù)API,包括增加消息數(shù)據(jù)add、移除消息數(shù)據(jù)remove、獲取消息數(shù)據(jù)getData、設(shè)置屬性值put、獲取屬性值get和獲取屬性名稱(chēng)集getNames,用于構(gòu)造和訪(fǎng)問(wèn)服務(wù)消息數(shù)據(jù),支持包括動(dòng)態(tài)查詢(xún)、未知數(shù)據(jù)類(lèi)型和可擴(kuò)展模式等情況的通用框架;1.2)WSMA的API還定義了類(lèi)似getString、getInt等數(shù)據(jù)類(lèi)型自檢API,用于屬性取值時(shí)類(lèi)型檢查和轉(zhuǎn)換;消息數(shù)據(jù)的屬性取值默認(rèn)是未知數(shù)據(jù)類(lèi)型java.lang.Object,支持包括String、int等在內(nèi)的基本數(shù)據(jù)類(lèi)型;消息數(shù)據(jù)或消息數(shù)據(jù)集本身也在支持的數(shù)據(jù)類(lèi)型之列,可以通過(guò)建立層次關(guān)系來(lái)承載對(duì)象數(shù)據(jù)、關(guān)系數(shù)據(jù)和XML;1.3)WSMA的API還定義了數(shù)據(jù)變化跟蹤API參照SDO規(guī)范,WSMA被設(shè)計(jì)成具備記憶能力;數(shù)據(jù)集和數(shù)據(jù)被創(chuàng)建之后的所有更改均會(huì)被逐一記錄,可以通過(guò)數(shù)據(jù)變化跟蹤API來(lái)獲取這些更改;2)WSMA的基本實(shí)現(xiàn)包括DatasetList和DataMap的設(shè)計(jì),它們是基于Java和Javascript實(shí)現(xiàn)在Java平臺(tái)中,DatasetList是java.util.ArrayList的重載,DataMap是java.util.HashMap的重載;在Javascript應(yīng)用環(huán)境中,DatasetList和DataMap是采用面向?qū)ο蟮乃接袑?shí)現(xiàn),使用類(lèi)似于java.util.ArrayList和java.util.HashMap;充分利用Java和Javascript的既有特性,盡量避免不必要的學(xué)習(xí)門(mén)檻。
2. 根據(jù)權(quán)利要求1所述的WADE服務(wù)消息架構(gòu)的設(shè)計(jì)方法,其特征是所述WSMA的API 采用的是泛化的動(dòng)態(tài)數(shù)據(jù)API。
全文摘要
一種WADE服務(wù)消息架構(gòu)(WSMA)的設(shè)計(jì)方法,具體是包括WSMA的接口(API)定義和基本實(shí)現(xiàn)。1.WSMA API包括動(dòng)態(tài)數(shù)據(jù)API、數(shù)據(jù)類(lèi)型自檢API和數(shù)據(jù)變化跟蹤API,分別定義于IDataset和IData接口之中。2.WSMA的基本實(shí)現(xiàn)包括DatasetList和DataMap,基于Java和Javascript均有實(shí)現(xiàn)。有益效果是,本方法采用統(tǒng)一的編程模型實(shí)現(xiàn)各種服務(wù)間通信和消息轉(zhuǎn)換,有效屏蔽了各種服務(wù)協(xié)議和編程模型的差異。提高了通信效率的同時(shí),還降低因異構(gòu)引起的程序復(fù)雜度。很好地滿(mǎn)足了復(fù)雜環(huán)境中多協(xié)議、大容量、高并發(fā)應(yīng)用的服務(wù)通信需求,特別適應(yīng)在國(guó)內(nèi)電信行業(yè)快速發(fā)展過(guò)程中IT系統(tǒng)普遍項(xiàng)目工期短、大團(tuán)隊(duì)開(kāi)發(fā)協(xié)作等高負(fù)荷開(kāi)發(fā)場(chǎng)景。
文檔編號(hào)G06F9/44GK101794223SQ20101010596
公開(kāi)日2010年8月4日 申請(qǐng)日期2010年2月3日 優(yōu)先權(quán)日2010年2月3日
發(fā)明者孫力斌, 張有根, 張翅, 張青, 李智, 梁斌, 陳杰 申請(qǐng)人:南京聯(lián)創(chuàng)科技集團(tuán)股份有限公司