精彩的人生

          好好工作,好好生活

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            147 Posts :: 0 Stories :: 250 Comments :: 0 Trackbacks
          在過去的數(shù)年中,許多開發(fā)人員都使用了各種版本的J2EE,使服務(wù)器端軟件編程的情形得到了很大的改觀,現(xiàn)在,他們將再次挑戰(zhàn)SOAP,在服務(wù)器端軟件編程方面取得更大的進展。
          SOAP服務(wù)的支持者認為:
          ·企業(yè)級應(yīng)用服務(wù)器是服務(wù)(或事務(wù))的集合。
          ·可以使用的服務(wù)應(yīng)當很方便地列出來供用戶瀏覽、搜索和訪問。
          ·象現(xiàn)在的基于組件的開發(fā)模式那樣,將應(yīng)用服務(wù)器設(shè)計為服務(wù)的集合將鼓勵開發(fā)人員采用更好的設(shè)計模式。
          ·這些事務(wù)能夠被重新定位、負載平衡、替代等。
          而對SOAP持懷疑態(tài)度的人認為,SOAP是推廣CORBA和COM的又一次嘗試。他們指出,要簡單地訪問一個對象,需要完成太多的準備性工作,而且,UDDI帶來的好處也被夸大了。
          那么,到底哪一種觀點更合理呢?對于一些思想開放的人士而言,在決定是否采用SOAP服務(wù)前,他們一定希望了解其中的一些核心技術(shù)。
          解密UDDI
          我們首先來看看UDDI代表什么?UDDI是Universal Description, Discovery and Integration(統(tǒng)一描述、發(fā)現(xiàn)和集成)的縮寫。UDDI的意圖是作為一個注冊簿,就象黃頁是一個地區(qū)企業(yè)的注冊簿一樣。象在黃頁中那樣,在UDDI注冊簿中,企業(yè)將在不同的目錄下注冊它們自己或其服務(wù)。通過瀏覽一個UDDI注冊簿,開發(fā)人員能夠查找一種服務(wù)或一個公司,并發(fā)現(xiàn)如何調(diào)用該服務(wù)。
          除了黃頁外,UDDI還使用了白頁和綠頁。白頁是企業(yè)實體列表,綠頁是調(diào)用一項服務(wù)所必需的文檔。
          UDDI的定義非常全面,足以適應(yīng)不同種類的服務(wù)。一個UDDI服務(wù)定義可能代表一個傳真服務(wù)或電話服務(wù)。作為一種注冊簿,UDDI一般使用數(shù)據(jù)庫一類的軟件來實現(xiàn),在該數(shù)據(jù)庫中,存在一個允許發(fā)布或查詢服務(wù)的有關(guān)信息。
          UDDI數(shù)據(jù)模型
          UDDI數(shù)據(jù)模型包括下面的主要元素:
          ·businessEntity:表示一個實際的企業(yè)。
          ·businessService:表示一個企業(yè)提供的服務(wù)。
          ·bindingTemplate:如何調(diào)用服務(wù)的說明。
          ·tModel>: Good luck understanding this! (Just kidding, I will explain this later.)
          為了加深對UDDI數(shù)據(jù)模型的理解,我們來看看這些數(shù)據(jù)元素的UML表示法。圖1是這四種主要元素之間的關(guān)系圖:

          從上面的圖中我們可以知道,一個businessEntity(一家公司)有一個能夠告訴我們更多有關(guān)公司信息的描述性URL和聯(lián)系人清單,此外,businessEntity還有一個商業(yè)服務(wù)清單。每種服務(wù)可能有多種調(diào)用方法,每種調(diào)用都由一個綁定模板描述。綁定模板詳細地描述了如何訪問一個服務(wù),它受益于一系列描述用戶如何訪問這一服務(wù)的文檔。綁定模板和其必要的文檔之間的聯(lián)系是通過所謂的tModel完成的。在上面的圖中,這種聯(lián)系被簡單地描述為一個綁定模板有許多tModels。在進一步地解釋tModels與綁定模板的關(guān)系前,我們必須先弄清楚tModels是什么。
          TModel是什么?
          我們可以把tModel想象成數(shù)據(jù)庫庫中的一個獨立的表,其中包含下面的字段:名字、描述、URL、唯一的關(guān)健字。實際上,tModel就是包括有名字和描述,那么使用數(shù)據(jù)庫表表示它是否是一種浪費呢?我們下面就會討論這一問題:
          下面是一個假想的tModel數(shù)據(jù)庫表中的二個實體:
          鍵 名字 描述 URL
          1 Java-class 表示一個具備完全資格的java類的名字 http://www.javasoft.com/
          2 Jndi-home 表示一個JNDI名字 http://www.javasoft.com/

          在將tModel比作數(shù)據(jù)庫表方面,有幾點值得注意。首先,tModel是一個獨立的表,意味著它可以不依賴其他軟件而存在;其次,tModel是查找表,提供了鍵與鍵的表示之間的轉(zhuǎn)換關(guān)系。從這一點來看,tModel象詞典那樣,是一個引用表。在一些數(shù)據(jù)庫中,這樣的表也被稱作是碼集。
          因此,如果在上面的tModel中存在下面的記錄:
          com.mycompany.HelloWorld, 1
          com.mycompany.HelloWorldHome, 2
          就意味著字符串com.mycompany.HelloWorld是一個有完整資格的Java類;而字符串com.mycompany.HelloWorldHome是一個JNDI名。

          因此在一定程度上,tModels中唯一的鍵與“名字空間”這個概念差不多。為了進一步地說明這個問題,我們來看一下下面的數(shù)字:
          904-555-1212
          904-555-1213
          1-56592-391-x
          你能夠分清這些數(shù)字的意義嗎?我們需要在一個環(huán)境或名字空間中來確認,904-555-1212是電話號碼,904-555-1213是傳真號,1-56592-391-x是一個ISBN號。
          因此在tModel數(shù)據(jù)庫表中,我們將需要定義三個實體:一個是電話號碼;一個是傳真號碼,一個是ISBN號碼。
          下面我們以mycompany公司公布了一條號碼為1-800-my-helpline的電話支持熱線,并在UDDI中注冊。那么,我們的數(shù)據(jù)模型為:
          company name: mycompany
          Service name: helpline
          tModel: key=11 (representing telephoneline), name=telephone,
          description=telephone stuff, url:
          some at&t url
          binding:
          accesspoint: 1-800-my-helpline
          tModelInstanceInfo: 11

          有了對tModel的基本理解后,我們就可以利用UML圖表來研究綁定模板與tModels之間的關(guān)系了。我在上面曾經(jīng)說過,這將使我們對綁定模板如何完成UDDI的“如何調(diào)用一項服務(wù)”的要求有一個直觀的理解。

          在圖2中,我們討論了一個綁定模板與tModels之間的關(guān)系。從圖表中我們可以看出,一個綁定模板可以指向一個由一個tModel確定的技術(shù)規(guī)格,技術(shù)規(guī)格有二部分組成:
          ·規(guī)格的類型。(例如電子郵件、傳真、WSDL、SOAP等。)
          ·確定輸入和輸出的文檔(在SOAP服務(wù)中,這些文檔可以是XML輸入/輸出消息格式。)
          既然我們已經(jīng)對tModels有了一定程度的詳細了解,就該再討論UDDI中更復(fù)雜的東西了,也就是身份包和類別包。
          理解標識符包和類別包
          如果說從概念上理解tModels是理解UDDI需要跨越的第一道障礙,那么理解標識符包和類別包則是需要跨越的第二道障礙。下面的例子可以幫助我們理解這二個概念。
          例如,您的公司在美國開展業(yè)務(wù)需要有一個稅號,如果還在另外的國家(例如墨西哥)開展業(yè)務(wù),就需要有一個墨西哥的稅號。為了能夠在UDDI注冊簿中獲取您的公司的這些信息,在UDDI中應(yīng)當包括下面的內(nèi)容:
          公司名字:mycompany
          標識符:
          美國稅號:111111
          墨西哥稅號:2223344
          其他國家稅號: 333333

          ...其他的xml內(nèi)容
          <identifierBag>
          <keyedReference tModelKey="US-tax-code"
          keyName="taxnumber" keyValue="1111111">
          <keyedReference tModelKey="Mexico-tax-code"
          keyName="taxnumber" keyValue="2223344">
          <keyedReference tModelKey="other-stuff"
          keyName="taxnumber" keyValue="333333">
          </identifiedBag>
          ... 其他的xml內(nèi)容
          現(xiàn)在明白tModels如何被用作名字空間了吧。為了進一步地深化對標識符包的理解,我們在下面的圖中再次解釋了標識符和類別包的概念:

          從上面的圖中我們能夠看出,標識符包是一個在特定環(huán)境中的鍵/值對集合,這個環(huán)境從本質(zhì)上說就是能夠唯一地解析名字/值對兒的名字空間,它是由tModel確定的。類別包也是如此,二者之間唯一的區(qū)別就是類別包中由tModel確定的名字空間是一個預(yù)先確定好的類別。
          類別包
          我想將公司歸類于飯店,其地理位置位于杰克遜維爾。
          公司名字:mycompany
          適用類:
          企業(yè)類型:飯店
          所在城市:杰克遜維爾
          <categoryBag>
          <keyedReference tModelKey="BusinessTypeClassification"
          keyName="restaurant" keyValue="..">
          <keyedReference tModelKey="CityClassification"
          keyName="JAX" keyValue="..">
          </categoryBag>
          現(xiàn)在,我們已經(jīng)搞清楚了tModels是如何用在標識符和類別包中的。從本質(zhì)上說,tModels就是名字空間。

          tModels也能被分類嗎?
          我們已經(jīng)明白了企業(yè)實體是如何利用使用了類別包的。另外,UDDI也允許tModels本身被分類。
          我們用分層次的文件系統(tǒng)進行說明。目錄是用來對文件進行分類的,但目錄還可以在父目錄下再被分類。象硬盤上的目錄那樣,tModels也可以被分層次地進行組織。
          下面我們來討論名字為getUniversalTime()的服務(wù),該服務(wù)將返回當前全球任一地方的時間。二家存在競爭關(guān)系的公司可能會提供這一服務(wù)的不同實現(xiàn)。商業(yè)服務(wù)只限于在公司內(nèi)部使用,公司之外的用戶是不可使用的:
          company1:getTime()
          company1:getCurrentTime()
          這二者的作用相同,為了表明它們實現(xiàn)的是同一個被稱作getUniversalTime()的服務(wù),我們可以定義如下所示的tModel:
          tModel
          name:: Get Universal Time
          category: uddi-org:types, wsdl
          [意味著這是一個由WSDL文檔定義的服務(wù)]
          上面的定義表明getUniversalTime()是一個WSDL服務(wù),可以由任何公司實現(xiàn)。
          既然已經(jīng)闡明了tModels和包之間的關(guān)系,我們下面可以看看一個tModel的UML表示:

          從上面的圖表中,我們可以看出tModel基本上就是一個名字和描述,另外,它也可以包含一個URL,以提供更進一步的詳細資料。它可以由一個標識符包確定和由一個類別包進行分類。
          我們已經(jīng)知道,一個tModel所屬于的類別是由UDDI━━WSDL、SOAP等預(yù)先定義好的,下面是一個uddi-org:types名字空間中預(yù)先定義類別的清單:
          tModel
          identifier (唯一標識符)
          namespace
          categorization
          specification
          xmlSpec
          soapSpec
          wsdlSpec
          protocol
          transport
          signatureComponent
          如何開始在UDDI中創(chuàng)建一個服務(wù)?
          在開始定義服務(wù)的tModel時,要求我們?yōu)榉?wù)指定一個名字和上面所列出的服務(wù)類型中的一個。當然了,如果不喜歡上面的分類可以自己創(chuàng)建類別。
          我們可以針對上面定義的tModel開發(fā)一個商業(yè)服務(wù)。在商業(yè)服務(wù)定義中,我們需要指定一個指向定義了服務(wù)的輸入/輸出的WSDL文檔的URL。

          在UDDI中為什么需要tModels?
          在UDDI中使用tModels的目的如下:
          ·對商業(yè)實體進行標識和分類
          ·對商業(yè)服務(wù)進行標識和分類
          ·對tModels進行標識和分類
          ·將商業(yè)服務(wù)綁定到它們抽象的tModel定義上
          UDDI名詞的快速參考
          在看有關(guān)UDDI的資料時,如果看到很深奧的術(shù)語是一件很煩人的事兒,下面我們就把一些經(jīng)常用到的與UDDI有關(guān)的概念搜集起來,通過比較幫助我們對UDDI概念的理解:
          接口和實現(xiàn)
          服務(wù)綁定是一個容器,接口依賴于其實現(xiàn);綁定元素詳細說明了tModelInstaceInfo和instanceDetail, 我們將再通過一個例子加深對這一問題的例子。對于“獲得統(tǒng)一時間”服務(wù)而言,細節(jié)將提供定義了輸入、輸出的實際的WSDL文檔,綁定的訪問點將提供實現(xiàn)服務(wù)的物理機器和端口。了解了這些,我們可以得出如下的結(jié)論:
          ·為一種服務(wù)定義的tModel是允許多家公司提供該服務(wù)的多個實現(xiàn)的界面。
          ·服務(wù)綁定是具體的實現(xiàn)。
          名字空間
          Java、C++和XML中都有名字空間的概念,盡管其叫法可能不同,但它們都提供了使名字有意義的環(huán)境。在UDDI中,tModel象征著“名字”。當把這個名字作為目錄使用時,你的本意是,“我屬于這個名字”。從這個意義上說,tModel表示的是名字空間。
          技術(shù)指紋
          當一種服務(wù)被注冊為tModel時,我們可以注冊用來與該服務(wù)通訊的協(xié)議(例如WSDL、SOAP等)。因此根據(jù)所使用的協(xié)議不同,tModel有WSDL指紋或SOAP指紋。因此tModel被認為是技術(shù)性指紋,每種指紋與一種特定的協(xié)議有關(guān)。如果說一種tModel可以代表一個“技術(shù)性指紋”,我們也可以說tModel能夠表示一種“協(xié)議”。
          分類
          分類與類別、名字空間類似,它提供了一種環(huán)境,只有在這種環(huán)境下,一些數(shù)字和名字才有意義。例如,
          白頁
          UDDI注冊簿中的企業(yè)實體列表和根據(jù)名字搜索企業(yè)的能力。
          黃頁
          黃頁將企業(yè)實體按企業(yè)類別或其他適用的類別分類。
          綠頁(技術(shù)規(guī)格)
          綠頁有助于我們理解服務(wù)的定義和訪問服務(wù)的要求,serviceBindings和tModels也有助于這一目標的實現(xiàn)。
          JAXR
          JAXR是在服務(wù)注冊中使用的一種Java XML API。我們以前曾經(jīng)討論過,UDDI中的所有元素都用XML文檔進行描述。從某種意義上說,嘦我們能夠發(fā)送包含有服務(wù)描述的XML消息,UDDI注冊簿就能夠?qū)λM行注冊或更新。下面我們討論在沒有工具的情況下如何完成這一任務(wù):
          1、編寫必要的服務(wù)描述XML文檔。
          2、理解SOAP頭部,以便能夠?qū)ML文件作為一個SOAP附件發(fā)送給UDDI注冊簿。
          3、使用SOAP客戶端Java API完成第二步中的任務(wù)。
          4、通過編程的方式處理SOAP消息。
          5、根據(jù)UDDI服務(wù)的描述,構(gòu)造消息完成該UDDI服務(wù)的任務(wù)。
          6、對每個消息,完成第2、3步中的操作。
          如果使用JAXR,我們可以更好地完成這一任務(wù)。因為JAXR允許我們在發(fā)送XML消息時無需考慮SOAP頭部,而且是一種嚴格的面向消息的協(xié)議。使用JAXR,上面的任務(wù)將簡化為:
          1、編寫必要的服務(wù)描述XML文檔。
          2、使用JAXM API發(fā)送和接收XML消息,JAXR隱藏了SOAP信息。
          3、根據(jù)UDDI服務(wù)構(gòu)建消息完成該UDDI服務(wù)。(例如,向UDDI注冊簿注冊UDDI服務(wù)包含有4次信息交換過程。)這意味著我們?nèi)匀恍枰cXML內(nèi)容打交道。
          使用這種方式,我們只需處理高層次的Java API即可,這些Java API能夠產(chǎn)生必需的消息并通過JAXR傳輸它們。需要指出的一點是,JAXR也用來完成該任務(wù)。
          下面列出了JAXR的一些目標:
          ·支持業(yè)界標準的XML注冊功能
          ·支持成員機構(gòu)和企業(yè)的注冊
          ·支持任意注冊內(nèi)容的存儲和提交
          ·支持XML、非XML注冊內(nèi)容的管理
          ·支持注冊內(nèi)容間用戶定義的結(jié)合
          ·支持用戶定義的注冊內(nèi)容的多級分類
          ·支持基于定義的分類計劃的注冊內(nèi)容查詢
          ·支持基于復(fù)雜查詢的注冊內(nèi)容查詢
          ·支持基于關(guān)健詞的注冊內(nèi)容查詢
          ·支持Web服務(wù)的共享
          ·支持合作伙伴間商業(yè)過程的共享
          ·支持合作伙伴間計劃的共享
          ·支持合作伙伴間商業(yè)文檔的共享
          ·支持合作伙伴間貿(mào)易伙伴協(xié)議的談判
          ·支持計劃匯編
          ·支持異類分布注冊
          ·支持參與各方發(fā)布/訂閱XML消息
          JAXR將不僅僅支持UDDI,還會支持其他的類似注冊服務(wù)標準(例如ebXML)。


          原文地址:http://www.wyt2008.com/Article/java/web/200603/Article_921.html
          posted on 2006-07-18 10:16 hopeshared 閱讀(824) 評論(0)  編輯  收藏 所屬分類: Web Service
          主站蜘蛛池模板: 阿拉善盟| 汾阳市| 福安市| 万州区| 徐汇区| 日喀则市| 永城市| 星子县| 图木舒克市| 民丰县| 溆浦县| 伊通| 巨野县| 广州市| 聂荣县| 中卫市| 西安市| 泗洪县| 邢台市| 青冈县| 安新县| 屯留县| 和静县| 永州市| 青岛市| 桦甸市| 绥芬河市| 山西省| 察哈| 三亚市| 云和县| 吉木乃县| 自贡市| 德惠市| 淮阳县| 区。| 张北县| 铜梁县| 元朗区| 西林县| 琼海市|