九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
開(kāi)發(fā)者關(guān)于 JAX-RPC 的介紹,第 1 部分: 了解 JAX-RPC 類型映射系統(tǒng)的各個(gè)方面

2002 年 12 月 01 日

用 于基于 XML 的遠(yuǎn)程過(guò)程調(diào)用的 Java API(Java APIs for XML-Based Remote Procedure Call,JAX-RPC)是實(shí)現(xiàn) Web 服務(wù)互操作性的一個(gè)重要的促進(jìn)步驟。在這第一篇文章中(共兩篇),Joshy Joseph 將帶您了解這種互操作性工作的核心:JAX-RPC 類型映射系統(tǒng)。您將了解如何把 XML 類型轉(zhuǎn)換為 Java 類型,以確保 Web 服務(wù)客戶機(jī)和基于 Java 的應(yīng)用程序之間能夠進(jìn)行平穩(wěn)的數(shù)據(jù)交換。

用于基于 XML 的遠(yuǎn)程過(guò)程調(diào)用的 Java API(JAX-RPC)在 Java 社區(qū)過(guò)程(Java Community Process)已經(jīng)達(dá)了最終推薦階段,被命名為 JSR 101。XML Web 服務(wù)供應(yīng)商已經(jīng)開(kāi)始把這個(gè)軟件包作為一個(gè)核心 API,用以在 Java 平臺(tái)上構(gòu)建可互操作的 Web 服務(wù)。在這一系列文章中,我將使用樣本代碼在整個(gè)過(guò)程中對(duì)您進(jìn)行指導(dǎo),帶您逐步了解該標(biāo)準(zhǔn)提供的主要功能。在這一系列文章的最后,您將熟悉 JAX-RPC 規(guī)范的核心功能;這些知識(shí)將有助于服務(wù)開(kāi)發(fā)者、客戶機(jī)開(kāi)發(fā)者以及工具箱開(kāi)發(fā)者設(shè)計(jì)盡可能可以互操作的 Web 服務(wù)。

對(duì)于這里的討論,我將假定您熟悉基本的 Web 服務(wù)概念(如 SOAP、WSDL 和 XML)。(請(qǐng)參閱下面的 參考資料部 分,以獲取關(guān)于這些概念以及其他相關(guān)主題的更多信息。)您將要碰到的代碼樣本都是用 Apache Axis 測(cè)試版 3 和 Sun 的 Web Services Developer Pack 開(kāi)發(fā)的 — 換言之,這些代碼樣本是用 JAX-RPC 規(guī)范的參考實(shí)現(xiàn)開(kāi)發(fā)的。

本文是一個(gè)由兩部分組成的系列文章的第一部分。我將從討論 JAX-RPC 的最重要方面之一 — 即類型映射系統(tǒng) — 開(kāi)始討論。這個(gè)系統(tǒng)使運(yùn)行時(shí)系統(tǒng)能夠?qū)?WSDL 文檔中定義的每種 XML 類型映射為 Java 服務(wù)接口所指定的相應(yīng) Java 類型,反之亦然。這是使 Web 服務(wù)可實(shí)現(xiàn)互操作的 一個(gè)主要步驟。JAX-RPC 為一組已擴(kuò)展的 XML 類型和 Java 類型指定可擴(kuò)展的類型映射支持。JAX-RPC 運(yùn)行時(shí)系統(tǒng)實(shí)現(xiàn)序列化框架以支持該類型映射。

在隨后的一篇文章中,我將根據(jù)在此處已經(jīng)建立的基礎(chǔ)進(jìn)行討論,深入介紹該規(guī)范其余部分的具體細(xì)節(jié)。

基本的 JAX-RPC 概念


作 為一名 Web 服務(wù)開(kāi)發(fā)者,您應(yīng)該已經(jīng)熟悉 Web 服務(wù)標(biāo)準(zhǔn)(SOAP、WSDL、XML)所提供的優(yōu)勢(shì)和體系結(jié)構(gòu)方面的靈活性了。Web 服務(wù)背后的概念幫助您使用抽象的接口設(shè)計(jì)松散耦合的服務(wù),這樣就可以把服務(wù)實(shí)現(xiàn)與服務(wù)定義分開(kāi)。Web 服務(wù)社區(qū)面臨的最重要的問(wèn)題是可互操作的服務(wù)的開(kāi)發(fā)。為了解決這個(gè)問(wèn)題,各個(gè)標(biāo)準(zhǔn)小組(包括 WS-I、OASIS、W3C 以及 SOAPBuilders)正在非常努力地為 互操作性定義標(biāo)準(zhǔn)(請(qǐng)參閱 參考資料以獲取更多信息)。

JAX-RPC 是 Java 社區(qū)的工作成果,用于徹底解決這一問(wèn)題,并為客戶機(jī)端和服務(wù)器端的 Web 服務(wù)實(shí)現(xiàn)提供一個(gè)眾所周知的應(yīng)用程序編程接口(application programming interface,API)。通過(guò)采用一個(gè)面向 Web 服務(wù)的標(biāo)準(zhǔn) API,JAX-RPC 旨在幫助服務(wù)用戶(客戶機(jī))和服務(wù)實(shí)現(xiàn)者獲得最大程度的靈活性,方法是通過(guò)把服務(wù)互操作性的重?fù)?dān)轉(zhuǎn)移到運(yùn)行時(shí)基礎(chǔ)架構(gòu)。通過(guò)采用標(biāo)準(zhǔn)組織提供的全局標(biāo)準(zhǔn)、 使用定義明確的概要文件(例如 WS-I)以及創(chuàng)建 IDE 和其他開(kāi)發(fā)工具來(lái)與這些標(biāo)準(zhǔn)相匹配,運(yùn)行時(shí)框架可以提供連接級(jí)別的互操作性。

就其本質(zhì)而言,JAX-RPC 定義并使用了一種基于 XML 的遠(yuǎn)程過(guò)程調(diào)用機(jī)制。它使服務(wù)器(即服務(wù)提供者)能夠用標(biāo)準(zhǔn)的 API 定義其服務(wù)并且能夠用 WSDL 描述其服務(wù);它使客戶機(jī)(即服務(wù)消費(fèi)者)能夠用標(biāo)準(zhǔn)的 API 與服務(wù)器進(jìn)行通信。

該規(guī)范內(nèi)容詳盡(大約 160 頁(yè))并且向 Java 開(kāi)發(fā)者介紹了新的編程模式。下面就是我將在這一系列文章中討論的概念的列表:

  • 類型映射系統(tǒng)
  • 服務(wù)端點(diǎn)
  • 異常處理
  • 服務(wù)端點(diǎn)上下文
  • 消息處理程序
  • 服務(wù)客戶機(jī)和服務(wù)上下文
  • 帶附件的 SOAP
  • 運(yùn)行時(shí)服務(wù)
  • JAX-RPC 客戶機(jī)調(diào)用模型

如上所述,這第一篇文章將僅著重介紹第一個(gè)概念:JAX-RPC 的類型映射系統(tǒng)。在后面的一篇文章中,我將探討該規(guī)范的其他關(guān)鍵概念。

在我介紹每個(gè)主題時(shí),我將用一個(gè)虛構(gòu)的書(shū)店(以下稱 Acme Booksellers)所提供的樣本 Web 服務(wù)代碼來(lái)闡述重點(diǎn)部分。




該書(shū)店提供伙伴可以以各種方式使用的服務(wù):

  • 消費(fèi)者可以根據(jù)某個(gè)搜索標(biāo)準(zhǔn)(ISBN、作者姓名等)搜索書(shū)籍。
  • 經(jīng)批準(zhǔn)的作者可以上載書(shū)籍的更新。
  • 評(píng)論者可以撰寫(xiě)書(shū)籍評(píng)論。

大家都知道,進(jìn)入 Web 服務(wù)體系結(jié)構(gòu)和實(shí)現(xiàn)有兩種體系結(jié)構(gòu)方式:

  • 自頂向下(即從 WSDL 入手)
  • 自底向上(即從 Java 實(shí)現(xiàn)類入手)

我將用 Acme Booksellers 樣本解釋如何使用與 JAX-RPC 編程模型一致的自頂向下的設(shè)計(jì)和實(shí)現(xiàn)。您可以在 附錄中看到用于樣本服務(wù)的 WSDL 文件。一旦研究過(guò)其代碼后,您就可以繼續(xù)進(jìn)行下一部分了。





回頁(yè)首


JAX-RPC 的類型映射系統(tǒng):介紹


JAX-RPC 規(guī)范最重要的成就之一就是它定義了一個(gè)標(biāo)準(zhǔn),該標(biāo)準(zhǔn)用于將 WSDL 文檔(它表示了服務(wù)描述)映射為其 Java 表示(服務(wù)端點(diǎn)、存根、綁定以及 Java 類型),反之亦然。以前這是一個(gè)主要的易引起混淆的地方,因?yàn)槊總€(gè) Web 服務(wù)工具箱供應(yīng)商對(duì)于相關(guān)的標(biāo)準(zhǔn)(WSDL、SOAP 和 XML)以及這些標(biāo)準(zhǔn)之間的關(guān)系都有自己的解釋。因?yàn)檫@些標(biāo)準(zhǔn)并行發(fā)展并且尚未成熟到足可依賴的程度,所以更增加了這種混淆。

讓我們深入討論細(xì)節(jié)問(wèn)題以了解 JAX-RPC 是如何通過(guò)定義一個(gè)公共編程模型來(lái)設(shè)法徹底解決這些問(wèn)題的。請(qǐng)注意,這個(gè)標(biāo)準(zhǔn)化成就是建立在 WSDL 1.1 和 SOAP 1.1 的基礎(chǔ)上的。

JAX-RPC 規(guī)范中關(guān)于 WSDL 到 Java 的映射那部分解決了下列問(wèn)題:

  • 將 XML 類型映射為 Java 類型
  • 將抽象的 WSDL 定義(端口類型、操作和消息)映射為 Java 接口和 Java 類。
  • 將具體的 WSDL 定義(端口、綁定和服務(wù))映射為 Java 類。

我將逐個(gè)討論這些問(wèn)題中的每一個(gè)。





回頁(yè)首


將 XML 類型映射為 Java 類型


簡(jiǎn)單類型


XML Schema 和 SOAP 1.1 編碼所定義的大多數(shù)簡(jiǎn)單的 XML 數(shù)據(jù)類型被映射為其對(duì)應(yīng)的 Java 類型。您可以在 JAX-RPC 規(guī)范的表 4-1 中看到這種映射的詳細(xì)信息。(請(qǐng)參閱 參考資料)。

作為一名開(kāi)發(fā)者,在映射簡(jiǎn)單 XML 類型時(shí),您應(yīng)該記住以下幾點(diǎn)。首先,JAX-RPC 映射規(guī)范沒(méi)有為 xsd:anyType 指定特定的 Java 映射。

其次,內(nèi)建的簡(jiǎn)單 XML 數(shù)據(jù)類型的 nillable 屬性被設(shè)置為 true 的元素聲明被映射為一個(gè)對(duì)應(yīng)的 Java 基本類型的 Java 包裝器類。例如,下面的代碼被映射為 java.lang.Integer

<xsd:element name="code" type="xsd:int" nillable="true" /> 

這就為類型系統(tǒng)設(shè)計(jì)提供了將空(null)對(duì)象映射為其對(duì)應(yīng)的 XML 類型的靈活性。您可以在 JAX-RPC 規(guī)范的表 4-2 中看到這些映射的完整列表(請(qǐng)參閱 參考資料)。

最后,SOAP 1.1 編碼規(guī)范將其大多數(shù)的類型映射為 nillable 。JAX-RPC 使用 Java 封裝的對(duì)象來(lái)映射這些類型。請(qǐng)參閱 JAX-RPC 規(guī)范的表 4-3 以獲取更多信息。

元數(shù)據(jù)和 JSR 175

Java 社區(qū)中正在進(jìn)行一些努力以解決 Java 語(yǔ)言中元數(shù)據(jù)信息的不可用性問(wèn)題。JSR 175 中提出的元數(shù)據(jù)工具將使 Java 類、接口、方法和域能夠用額外的屬性標(biāo)記。Web 服務(wù)領(lǐng)域中還有另一個(gè)項(xiàng)目(JSR 181)正在進(jìn)行中,該項(xiàng)目使用這些元數(shù)據(jù)工具(屬性)來(lái)擴(kuò)展 Web 服務(wù)配置及部署模型。

復(fù)雜類型


XML Schema 復(fù)雜類型被映射為若干個(gè)帶有 getter 和 setter 的 JavaBean 以訪問(wèn)復(fù)雜類型中的每個(gè)元素。當(dāng)處理這些類型時(shí),您需要記住幾點(diǎn)。首先請(qǐng)注意,雖然復(fù)雜類型包含 xsd:sequence ,但是在這些 JavaBean 中沒(méi)有保持元素的先后順序,這一點(diǎn)很重要。

其次,元素屬性 maxOccurs 值為正的復(fù)雜類型映射為一個(gè)相應(yīng)類型的 Java 數(shù)組。這樣一種類型并不定義 minOccursmaxOccurs 所有可能的組合。對(duì)于那些試圖映射所有與 XML Schema 相關(guān)聯(lián)的語(yǔ)義的 Java 開(kāi)發(fā)者來(lái)說(shuō),這可能是個(gè)問(wèn)題。

最后,該映射的主要問(wèn)題之一就是 XML 元素屬性映射。因?yàn)闆](méi)有與 Java 類相關(guān)聯(lián)的元數(shù)據(jù),所以當(dāng)您試圖將 JavaBean 轉(zhuǎn)換為 WSDL 時(shí),可能會(huì)碰到映射問(wèn)題;因此,JAX-RPC 規(guī)范并未指出如何映射 xsd:attribute 。然而,在進(jìn)行 SOAP 綁定時(shí),您可以將 SOAPElement 用于此目的。Java 語(yǔ)言擴(kuò)展將來(lái)可能會(huì)對(duì)此進(jìn)行調(diào)整;請(qǐng)參閱標(biāo)題為“ 元數(shù)據(jù)和 JSR 175”的側(cè)欄以獲取更多關(guān)于這方面的信息。

下面的 清單 1向您展示了復(fù)雜類型映射是如何進(jìn)行的。

清單 1. 正在進(jìn)行的復(fù)雜類型映射
<xsd:complexType name ="Book">
<sequence>
<element name="author" type="xsd:string" maxOccurs="10" />
<element name="price" type="xsd:float" />
</sequence>
<xsd:attribute name="reviewer" type="xsd:string" />
</xsd:complexType>

清單 2中,您可以看到 清單 1中的類型如何被映射為帶有 getter 和 setter 方法的 JavaBean。

清單 2. 來(lái)自清單 1 的類型的 Java 映射
Public class Book{
private float price;
private String[] author;
private String reviewer; // attribute
//....
public String[] getAuthor() {.......}
public setAuthor(String[] author) {.......}
public float getPrice() {.......}
public void setPrice(float price) {.......}
public String getReviewer() {.....}
public void setReviewer(String reviewer) {.....}
}

數(shù)組


JAX-RPC 將 XML 數(shù)組映射為帶操作符 [] 的 Java 數(shù)組。您可以在 WSDL 服務(wù)聲明中找到幾種不同種類的數(shù)組聲明。

第一種類型是 restriction 使用 WSDL 1.1 指定的 wsdl:ArrayType 屬性從 soapenc:Array 中派生出來(lái)的數(shù)組。

清單 3. 用 restriction 和 wsdl:ArrayType 定義數(shù)組
<complexType name = "ArrayOfString">
<complexContent>
<restriction base="soapenc:Array">
<attribute ref="soapend:ArrayType"
wsdlArrayType="xsd:string[]">
</restriction>
</complexContent>
</complexType>

JAX-RPC 將這些復(fù)雜數(shù)組類型映射為 Java String[]java.lang.String 作為數(shù)組中的元素。

下一種數(shù)組類型是 SOAP 1.1 規(guī)范所設(shè)置的 restriction 從 soapenc:Array 中派生出來(lái)的。

清單 4. 用 restriction 和 soapenc:Array 定義數(shù)組
<complexType name = "ArrayOfString">
<complexContent>
<restriction base="soapenc:Array">
<sequence>
<element name="stringArray" type="xsd:string"
maxOccurs="unbounded" />
</sequence>
</restriction>
</complexContent>
</complexType>

JAX-RPC 將這些復(fù)雜數(shù)組類型映射為 Java String[] , java.lang.String 作為數(shù)組中的元素。

您在 WSDL 中可以找到的另一種數(shù)組聲明如下所示。

<element name="myNumbers" type="soapenc:Array" />

清單 5展示了上述模式的一個(gè)實(shí)例。

清單 5. 映射為 Java Object 數(shù)組
<myNumbers soapend:arrayType="xsd:int[2]" >
<number>1</number>
<number>2</number>
</myNumbers>

該聲明被映射為一個(gè) Java Object 數(shù)組,這個(gè)數(shù)組中的各個(gè)元素對(duì)應(yīng)于 XML Schema 類型。(此處它映射為 integer 。)

最后,您還可以找到由用戶定義的 XML schema 類型構(gòu)造而成的數(shù)組。清單 6 展示了這種類型的定義:

清單 6. 定義一種模式類型
<complexType name="Article">
<all>
<element name="name" type="xsd:string">
<element name="author" type="xsd:string">
</all>
</complexType>

現(xiàn)在您需要定義一個(gè) Article 類型的數(shù)組。

清單 7. 用用戶定義的模式類型定義一個(gè)數(shù)組
<complexType name="ArrayOfArticles">
<complexContent>
<restriction base="soapenc:Array">
<sequence>
<element name="article" type="tns:Article"
maxOccurs="unbounded" />
</sequence>
</restriction>
</complexContent>
</complexType>

WSDL 中的上述聲明映射為一個(gè) Article (Article[] article;) 類型的 Java 數(shù)組。





回頁(yè)首


將抽象的 WSDL 類型映射為 Java 類型


既然您理解了如何將 XML 類型映射為 Java 類型,我就要考慮 WSDL 的特殊情況了。首先,我將快速討論一下如何將抽象的 WSDL 類型映射為 Java 表示:

  • wsdl:porttype該類型被映射為服務(wù)端點(diǎn)接口;它擴(kuò)展了 java.rmi.Remote 接口。在這一系列文章的下一篇文章中,我將討論服務(wù)端點(diǎn)接口以及它們的要求。
  • wsdl:operation因 為 WSDL 1.1 并沒(méi)指明操作名稱需要是唯一的,所以可以有多個(gè)名稱相同但參數(shù)不同的操作。您還應(yīng)該記住,JAX-RPC 規(guī)范僅支持 WSDL 規(guī)范定義的單向操作和請(qǐng)求-響應(yīng)操作;JAX-RPC 規(guī)范不支持要求-響應(yīng)(solicit-response)操作樣式或通知操作樣式。您可以用可選的 parameterOrder 屬性指定 WSDL 中的參數(shù)順序。

我們來(lái)看一下參數(shù)傳遞樣式。從 表 1 可以看出,這些參數(shù)傳遞樣式可以是 in 、 outinout ,這取決于您要怎樣處理參數(shù)。

表 1. 參數(shù)傳遞樣式


定義參數(shù)的位置 參數(shù)樣式 可能的 JAX-RPC 映射類 樣本 JAX-RPC 映射類
wsdl:input in 包裝器類或 JavaBean java.lang.Integer
wsdl:output out Holder IntHolderStringHolder
wsdl:inputwsdl:output inout Holder IntHolder 、 StringHolder

表 1 所示,為了支持 out 參數(shù)和 inout 參數(shù),定義了一個(gè)新的 Holder 類。服務(wù)客戶機(jī)使用 Holder 類實(shí)例發(fā)送 out 參數(shù)或 inout 參數(shù)的值。 Holder 類的內(nèi)容是通過(guò)遠(yuǎn)程方法調(diào)用修改的,且服務(wù)客戶機(jī)在方法調(diào)用后可以使用這些修改過(guò)的內(nèi)容。還要注意,JAX-RPC 規(guī)范定義了大量 Holder 類以支持基本類型。您可以定義自己的 Holder 類以支持從名為 Holder 的標(biāo)準(zhǔn)接口派生出來(lái)的復(fù)雜類型。

讓我用一些樣本代碼來(lái)闡述這些要點(diǎn)。 清單 8包括一個(gè)樣本 WSDL 定義。

清單 8. 樣本 WSDL 定義
    <xsd:complexType name="Authors">
<xsd:all>
<xsd:element name="Authors" type="typens:AuthorArray"/>
</xsd:all>
</xsd:complexType>
<message name="AuthorPresentRequest">
<part name="Authors" type="typens:Authors"/>
</message>
<message name="AuthorPresentResponse">
<part name="return" type="xsd:boolean"/>
<part name="Authors" type="typens:Authors"/>
</message>
<portType name="AcmeAuthorPresentPortType">
<operation name="IsAuthorPresent">
<input message="typens:AuthorPresentRequest"/>
<output message="typens:AuthorPresentResponse"/>
</operation>
</portType>

您可以看到輸入消息和輸出消息包含 Authors 類型作為參數(shù)。這是參數(shù)傳遞的 inout 樣式。這需要一個(gè)用于 Authors 類型的 Holder 類,如 清單 9所示。

清單 9. 為 Authors 類型創(chuàng)建一個(gè)樣本 Holder 類
public final class AuthorsHolder implements javax.xml.rpc.holders.Holder {
public com.acme.www.Authors value;
public AuthorsHolder() {}
public AuthorsHolder(com.acme.www.Authors value) {
this.value = value;
}
}

最后, 清單 10展示了如何實(shí)現(xiàn) Java 端點(diǎn)。

清單 10. Java 端點(diǎn)實(shí)現(xiàn)
public interface AcmeAuthorPresentPortType extends java.rmi.Remote {
public boolean isAuthorPresent(AuthorsHolder authors) throws java.rmi.RemoteException;
}

您需要理解服務(wù)端點(diǎn)接口的名稱以及端點(diǎn)方法的簽名是怎樣派生的。它們可以從 wsdl.portType 的名稱屬性和操作定義中派生,或者從 wsdl.binding 名稱和操作聲明中派生。這是您要記住的重要一點(diǎn),因?yàn)榭梢杂胁煌瑯邮降亩鄠€(gè)綁定(例如 RPC/文檔)指向同一個(gè) portType 。這種綁定樣式上的差異可能會(huì)導(dǎo)致創(chuàng)建出帶有不同名字和簽名的不同端點(diǎn)。因此,您應(yīng)該謹(jǐn)防這種有混淆的映射。

SOAP 消息樣式和操作編碼

您已經(jīng)知道存在兩種 SOAP 消息樣式, 文檔RPC,它們定義了 SOAP 消息正文的格式。還存在兩種對(duì)操作的參數(shù)進(jìn)行編碼的模式,即 文字的(literal)編碼的(encoded)

表 2列出了 SOAP 消息樣式和模式并說(shuō)明了 JAX-RPC 是如何對(duì)其進(jìn)行定義的。





回頁(yè)首


將具體的 WSDL 類型映射為 Java 類型


現(xiàn)在請(qǐng)把您的注意力轉(zhuǎn)到具體的 WSDL 元素以及它們的 Java 映射上。

  • wsdl:bindingJAX-RPC 沒(méi)有為 wsdl.binding 定義任何標(biāo)準(zhǔn)的 Java 表示。這意味著運(yùn)行時(shí)可以定義所需的綁定。至少,JAX-RPC 運(yùn)行時(shí)系統(tǒng)應(yīng)該為具有如下特征的 SOAP 綁定提供支持:

    • 帶有已編碼的操作模式(RPC/編碼的)的 RPC 樣式。
    • 帶有文字的操作模式(文檔/文字的)的文檔樣式。

    在進(jìn)行文字映射時(shí),每個(gè)消息部件都被映射為一種 Java 類型,早些時(shí)候我在前面的 將 XML 類型映射為 Java 類型部分中已經(jīng)描述過(guò)這一點(diǎn)。如果不存在這種映射,那么就使用一個(gè) javax.xml.soap.SOAPElement Java 類來(lái)表示消息部件。這種映射的一個(gè)示例就是包含多個(gè)屬性的復(fù)雜類型。因?yàn)闆](méi)有為屬性定義標(biāo)準(zhǔn)的映射,所以這種復(fù)雜類型就被表示為 SOAPElement

    請(qǐng)參閱標(biāo)題為 SOAP 消息樣式和操作編碼的側(cè)欄以及 表 2以獲取關(guān)于這些不同樣式和模式的更多信息。

    表 2. SOAP 消息樣式和 JAX-RPC


    樣式(SOAP 消息正文格式) 模式(參數(shù)編碼) JAX-RPC 相關(guān)信息
    文檔(用一種模式定義正文格式) 文字的(對(duì)每種參數(shù)編碼使用 XML Schema) 必需的
    文檔 編碼的(使用 SOAP Section 5 編碼) 可選的
    RPC(用 SOAP Section 7 規(guī)則定義正文格式) 編碼的 必需的
    RPC 文字的 可選的
  • wsdl:service這個(gè) WSDL 具體定義對(duì)一組服務(wù)端點(diǎn)(或 wsdl:ports )進(jìn)行分組。JAX-RPC 將 wsdl:service 映射為一個(gè) Java 服務(wù)類。這個(gè)服務(wù)類實(shí)現(xiàn) javax.xml.rpc.Service 接口或者一個(gè)生成的 Java 接口(該 Java 接口被映射為 wsdl.service 定義),它接著再實(shí)現(xiàn) javax.xml.rpc.Service 。

    這個(gè)服務(wù)類充當(dāng)以下內(nèi)容的工廠:

    • 服務(wù)端點(diǎn)的動(dòng)態(tài)代理(在這一系列文章的下一篇文章中對(duì)此有更多描述)。您可以在服務(wù)對(duì)象中使用 getPort(..) 方法創(chuàng)建動(dòng)態(tài)代理。
    • 一個(gè) javax.xml.rpc.Call 類型的實(shí)例,它用于動(dòng)態(tài)調(diào)用服務(wù)端點(diǎn)上的遠(yuǎn)程操作(在這一系列文章的下一篇文章中對(duì)此有更多描述)。該動(dòng)態(tài)調(diào)用接口需要在運(yùn)行時(shí)創(chuàng)建一個(gè) Call 對(duì)象。為此,您可以使用服務(wù)類的 createCall(..) 操作。
    • 一個(gè)生成的存根類實(shí)例(在這一系列文章的下一篇文章中對(duì)此有更多描述)。這些存根是由生成的類提供的,它們是由工具創(chuàng)建的。

    實(shí)現(xiàn) Service 接口是 JAX-RPC 運(yùn)行時(shí)系統(tǒng)的責(zé)任。根據(jù)綁定要求可以存在不同的存根實(shí)現(xiàn)。還要注意, Service 實(shí)現(xiàn)類應(yīng)該實(shí)現(xiàn) java.io.Serializable 接口或 javax.naming.Referenceable 接口以支持 JNDI 名稱空間中的注冊(cè)。

可擴(kuò)展的類型映射支持

我 在這篇文章中已經(jīng)討論過(guò),當(dāng)前的 JAX-RPC 規(guī)范定義了簡(jiǎn)單類型的類型映射。因?yàn)檫@種類型映射不足以支持更復(fù)雜的數(shù)據(jù)類型,所以 JAX-RPC 規(guī)范已經(jīng)增加了支持,以便用可插的序列化器和反序列化器來(lái)擴(kuò)展它的類型映射系統(tǒng)。當(dāng)前的規(guī)范提供應(yīng)用程序編程模型以開(kāi)發(fā)可插性,并將可插性構(gòu)建到序列化器 和反序列化器中。請(qǐng)向您的 JAX-RPC 供應(yīng)商咨詢以獲得更多關(guān)于它對(duì)定制類型映射的支持以及它所支持的類型這些方面的信息。還要記住,這種靈活性有一個(gè)缺點(diǎn):它可能會(huì)導(dǎo)致 Web 服務(wù)實(shí)現(xiàn)間的互操作性問(wèn)題。





回頁(yè)首


將 Java 類型映射為 WSDL


當(dāng) 然,JAX-RPC 規(guī)范中相當(dāng)大一部分討論了如何將 Java 類型映射為 XML 類型以及如何將 Java 服務(wù)端點(diǎn)接口映射為 WSDL 定義。這樣的映射類似于我在此處所介紹的映射,但過(guò)程相反。在此我不打算詳細(xì)解釋該過(guò)程。請(qǐng)參考 JAX-RPC 規(guī)范的第 5 節(jié)以獲取更多信息。這是用于 Web 服務(wù)設(shè)計(jì)的自底向上體系結(jié)構(gòu),它主要用于將現(xiàn)有的、基于 Java 的應(yīng)用程序轉(zhuǎn)換為 Web 服務(wù)或者用于創(chuàng)建包裝這些應(yīng)用程序的包裝器。





回頁(yè)首


結(jié)束語(yǔ)以及展望


在 本文中,我已經(jīng)討論了 JAX-RPC 對(duì)簡(jiǎn)單類型映射的支持。要獲得 Web 服務(wù)實(shí)現(xiàn)間最大程度的互操作性,您需要理解這個(gè)核心概念。雖然當(dāng)前的類型映射列表很詳細(xì),但它們還沒(méi)詳盡到足以支持?jǐn)?shù)據(jù)類型的所有要求。因此,JAX- RPC 運(yùn)行時(shí)實(shí)現(xiàn)者可以通過(guò)定制的序列化器自由支持其他可擴(kuò)展的類型映射機(jī)制。

我希望這個(gè)關(guān)于 JAX-RPC 中的類型映射支持的討論有助于您領(lǐng)會(huì) JAX-RPC 系統(tǒng)如何處理 XML 類型和 Java 類型以及如何將這些類型中的每一種類型轉(zhuǎn)換成其他類型而不喪失其語(yǔ)義這些基本概念。

在這一系列文章的下一部分中,我將討論 JAX-RPC 規(guī)范的其他方面(包括服務(wù)實(shí)現(xiàn)、服務(wù)客戶機(jī)以及其他的核心概念)。在那之前,請(qǐng)努力掌握此處所概述的類型映射信息。



參考資料

  • 您可以參閱本文在 developerWorks 全球站點(diǎn)上的 英文原文.

  • 請(qǐng)從來(lái)源(即 Java 社區(qū)過(guò)程)處獲取 JAX-RPC 規(guī)范。

  • JAX-RPC 規(guī)范的參考實(shí)現(xiàn)是基于 Apache Axis 測(cè)試版 3Sun 的 Web Services Developer Pack的。本文的代碼已經(jīng)使用這些技術(shù)測(cè)試過(guò)了。

  • 您還可以體驗(yàn)最新版本的 IBM Web Services Toolkit,您可以從 alphaWorks 上得到它。

  • 在閱讀這一系列文章時(shí),您可能會(huì)發(fā)現(xiàn)參考下列 W3C 規(guī)范是很方便的:
  • 下列小組正努力使 Web 服務(wù)可以相互操作:
  • 如需關(guān)于 Web 服務(wù)類型映射的更多信息,請(qǐng)查看 Gavin Bong 的系列文章“Apache SOAP Type Mapping”( developerWorks,2002 年 3 月)的 第 1 部分第 2 部分。


關(guān)于作者

Joshy Joseph 是 IBM OGSA 開(kāi)發(fā)小組的一名軟件工程師。他的主要編程愛(ài)好是使用新興技術(shù)(如 Web 服務(wù)、語(yǔ)義 Web、REST、網(wǎng)格計(jì)算)以及使用基于 UML、AOP 和 XP 的編程模型。您可以通過(guò) joshy@us.ibm.com與他聯(lián)系。


本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
JAX-RPC vs JAX-WS(二):用JAX-WS 2.0實(shí)現(xiàn)高性能的Web服務(wù)(續(xù))
J2ME 的 Web 服務(wù) API講解
WSDL淺析
使用 PHP 開(kāi)發(fā)基于 Web 服務(wù)的應(yīng)用程序
Web服務(wù)互操作開(kāi)發(fā)的十大要點(diǎn)
用于Web服務(wù)的核心Java API
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服