java webservice_cfx學(xué)習(xí).doc_第1頁(yè)
java webservice_cfx學(xué)習(xí).doc_第2頁(yè)
java webservice_cfx學(xué)習(xí).doc_第3頁(yè)
java webservice_cfx學(xué)習(xí).doc_第4頁(yè)
java webservice_cfx學(xué)習(xí).doc_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

一篇值得一看webservice開發(fā)的入門教程,使用的是cxf插件。本文介紹了通過(guò)cfx_2.3.2的原理,和spring整合的過(guò)程,以及webservice的基本認(rèn)證,客戶端代碼的調(diào)用,xml傳遞對(duì)象。入門的不錯(cuò)教程哦,絕對(duì)值得一看。第一步:新建一個(gè)webservice接口WebService public interface IHelloWorld /WebParam給參數(shù)命名,提高可代碼可讀性。此項(xiàng)可選 public String sayHi(WebParam(name=text) String text); 通過(guò)注解WebService申明為webservice接口 第二步,實(shí)現(xiàn)WebService接口WebService public class HelloWorldImpl implements IHelloWorld public String sayHi(String name) System.out.println(sayHello is called by + name); return Hello + name; 第三步,創(chuàng)建服務(wù)端 public class Server private Server() IHelloWorld helloWorld = new HelloWorldImpl(); /創(chuàng)建WebService服務(wù)工廠 JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean(); /注冊(cè)WebService接口 factory.setServiceClass(IHelloWorld.class); /發(fā)布接口 factory.setAddress(http:/localhost:9000/HelloWorld); factory.setServiceBean(helloWorld); /創(chuàng)建WebService factory.create(); ; public static void main(String args) throws InterruptedException /啟動(dòng)服務(wù)端 new Server(); System.out.println(Server ready); /休眠一分鐘,便于測(cè)試 Thread.sleep(1000*60); System.out.println(Server exit); System.exit(0); 第四步,創(chuàng)建客戶端public class Client private Client(); public static void main(String args) /創(chuàng)建WebService客戶端代理工廠 JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); /注冊(cè)WebService接口 factory.setServiceClass(HelloWorld.class); /設(shè)置WebService地址 factory.setAddress(http:/localhost:9000/HelloWorld); IHelloWorld iHelloWorld = (IHelloWorld)factory.create(); System.out.println(invoke webservice); System.out.println(message context is:+iHelloWorld.sayHi(Josen); System.exit(0); 首先,運(yùn)行服務(wù)端程序 其次,打開瀏覽器,在地址欄中輸入http:/localhost:9000/HelloWorld?wsdl(因?yàn)閏xf自帶了一個(gè)jetty服務(wù)器),查看接口是否發(fā)布成功,如里瀏覽器頁(yè)面顯示下面內(nèi)容,證明接口發(fā)布成功本文所引用的資源主要包括兩類,一類是Web服務(wù)的技術(shù)資源網(wǎng)站,包含了大量Web服務(wù)的技術(shù)信息,另一類是Web服務(wù)“stack系列技術(shù)規(guī)范,他們是一個(gè)整體的技術(shù)體系,包括UDDI、SOAP、WSDL、XML等。本文的最后給出了這些資源的鏈接,有興趣的讀者可以通過(guò)這些資源鏈接找到所需的內(nèi)容。其中,綠色部分是先前已經(jīng)定義好的并且廣泛使用的傳輸層和網(wǎng)絡(luò)層的標(biāo)準(zhǔn):IP、HTTP、SMTP等。而藍(lán)色部分是目前開發(fā)的Web服務(wù)的相關(guān)標(biāo)準(zhǔn)協(xié)議,包括服務(wù)調(diào)用協(xié)議SOAP、服務(wù)描述協(xié)議WSDL和服務(wù)發(fā)現(xiàn)/集成協(xié)議UDDI,以及服務(wù)工作流描述語(yǔ)言WSFL。而橙色部分描述的是更高層的待開發(fā)的關(guān)于路由、可靠性以及事務(wù)等方面的協(xié)議。黃色部分是各個(gè)協(xié)議層的公用機(jī)制,這些機(jī)制一般由外部的正交機(jī)制來(lái)完成。其中,一個(gè)可以使用的Web服務(wù)應(yīng)當(dāng)按照需要選用若干層次的功能,而無(wú)需所有的特性。但是無(wú)論如何為了實(shí)現(xiàn)一個(gè)一般意義上的Web服務(wù),具備Web服務(wù)的基礎(chǔ)特性:跨平臺(tái)調(diào)用和接口可機(jī)器識(shí)別,那么必需使用WSDL和SOAP。SOAP是用來(lái)最終完成Web服務(wù)調(diào)用的,而WSDL則是用于描述如何使用 SOAP來(lái)調(diào)用Web服務(wù)的。 WSDL 是一種XML Application,他將Web服務(wù)描述定義為一組服務(wù)訪問(wèn)點(diǎn),客戶端可以通過(guò)這些服務(wù)訪問(wèn)點(diǎn)對(duì)包含面向文檔信息或面向過(guò)程調(diào)用的服務(wù)進(jìn)行訪問(wèn)(類似遠(yuǎn)程過(guò)程調(diào)用)。WSDL首先對(duì)訪問(wèn)的操作和訪問(wèn)時(shí)使用的請(qǐng)求/響應(yīng)消息進(jìn)行抽象描述,然后將其綁定到具體的傳輸協(xié)議和消息格式上以最終定義具體部署的服務(wù)訪問(wèn)點(diǎn)。相關(guān)的具體部署的服務(wù)訪問(wèn)點(diǎn)通過(guò)組合就成為抽象的Web服務(wù)。 在具體使用中,我們可以對(duì) WSDL 進(jìn)行擴(kuò)展(類似SOAP的可擴(kuò)展性),這樣無(wú)論通信時(shí)使用何種消息格式或網(wǎng)絡(luò)協(xié)議,都可以對(duì)服務(wù)訪問(wèn)點(diǎn)及其使用的消息格式進(jìn)行描述。在WSDL的框架中,可以使用任意的消息格式和網(wǎng)絡(luò)協(xié)議,如同SOAP中可以使用任意的網(wǎng)絡(luò)協(xié)議一樣。在WSDL規(guī)范中,定義了如何使用SOAP消息格式、HTTP GET/POST消息格式以及MIME格式來(lái)完成Web服務(wù)交互的規(guī)范。WSDL 文檔將Web服務(wù)定義為服務(wù)訪問(wèn)點(diǎn)或端口的集合。在 WSDL 中,由于服務(wù)訪問(wèn)點(diǎn)和消息的抽象定義已從具體的服務(wù)部署或數(shù)據(jù)格式綁定中分離出來(lái),因此可以對(duì)抽象定義進(jìn)行再次使用:消息,指對(duì)交換數(shù)據(jù)的抽象描述;而端口類型,指操作的抽象集合。用于特定端口類型的具體協(xié)議和數(shù)據(jù)格式規(guī)范構(gòu)成了可以再次使用的綁定。將Web訪問(wèn)地址與可再次使用的綁定相關(guān)聯(lián),可以定義一個(gè)端口,而端口的集合則定義為服務(wù)。因此,WSDL 文檔在Web服務(wù)的定義中使用下列元素: * Types - 數(shù)據(jù)類型定義的容器,它使用某種類型系統(tǒng)(一般地使用XML Schema中的類型系統(tǒng))。 * Message - 通信消息的數(shù)據(jù)結(jié)構(gòu)的抽象類型化定義。使用Types所定義的類型來(lái)定義整個(gè)消息的數(shù)據(jù)結(jié)構(gòu)。 * Operation - 對(duì)服務(wù)中所支持的操作的抽象描述,一般單個(gè)Operation描述了一個(gè)訪問(wèn)入口的請(qǐng)求/響應(yīng)消息對(duì)。 * PortType - 對(duì)于某個(gè)訪問(wèn)入口點(diǎn)類型所支持的操作的抽象集合,這些操作可以由一個(gè)或多個(gè)服務(wù)訪問(wèn)點(diǎn)來(lái)支持。 * Binding - 特定端口類型的具體協(xié)議和數(shù)據(jù)格式規(guī)范的綁定。 * Port - 定義為協(xié)議/數(shù)據(jù)格式綁定與具體Web訪問(wèn)地址組合的單個(gè)服務(wù)訪問(wèn)點(diǎn)。 * Service - 相關(guān)服務(wù)訪問(wèn)點(diǎn)的集合。 大家可以參考下圖,來(lái)理解一下WSDL文檔的結(jié)構(gòu)組織:其中,Types是一個(gè)數(shù)據(jù)類型定義的容器,包含了所有在消息定義中需要的XML元素的類型定義,我將在今后的文章中結(jié)合XML Schema來(lái)詳細(xì)說(shuō)明如何進(jìn)行類型定義。 Message具體定義了在通信中使用的消息的數(shù)據(jù)結(jié)構(gòu),Message元素包含了一組Part元素,每個(gè)Part元素都是最終消息的一個(gè)組成部分,每個(gè) Part都會(huì)引用一個(gè)DataType來(lái)表示它的結(jié)構(gòu)。Part元素不支持嵌套(可以使用DataType來(lái)完成這方面的需要),都是并列出現(xiàn)。 PortType具體定義了一種服務(wù)訪問(wèn)入口的類型,何謂訪問(wèn)入口的類型呢?就是傳入/傳出消息的模式及其格式。一個(gè)PortType可以包含若干個(gè) Operation,而一個(gè)Operation則是指訪問(wèn)入口支持的一種類型的調(diào)用。在WSDL里面支持四種訪問(wèn)入口調(diào)用的模式: 1. 單請(qǐng)求; 2. 單響應(yīng); 3. 請(qǐng)求/響應(yīng); 4. 響應(yīng)/請(qǐng)求。在這里請(qǐng)求指的是從客戶端到Web服務(wù)端,而響應(yīng)指的是從Web服務(wù)端到客戶端。PortType的定義中會(huì)引用消息定義部分的一個(gè)到兩個(gè)消息,作為請(qǐng)求或響應(yīng)消息的格式。比如,一個(gè)股票查詢的訪問(wèn)入口可能就會(huì)支持兩種請(qǐng)求消息,一種請(qǐng)求消息中指明股票代碼,而另一種請(qǐng)求消息中則會(huì)指明股票的名稱,響應(yīng)消息可能都是股票的價(jià)格等等。 以上三種結(jié)構(gòu)描述了調(diào)用Web服務(wù)的抽象定義,這三部分與具體Web服務(wù)部署細(xì)節(jié)無(wú)關(guān),是可復(fù)用的描述(每個(gè)層次都可以復(fù)用)。如果與一般的對(duì)象語(yǔ)言做比較的話,這部分可以堪稱是IDL描述的對(duì)象,描述了對(duì)象的接口標(biāo)準(zhǔn),但是到底對(duì)象是用哪種語(yǔ)言實(shí)現(xiàn),遵從哪種平臺(tái)的細(xì)節(jié)規(guī)范,被部署在哪臺(tái)機(jī)器上則是后面的元素所描述的。 Service描述的是一個(gè)具體的被部署的Web服務(wù)所提供的所有訪問(wèn)入口的部署細(xì)節(jié),一個(gè)Service往往會(huì)包含多個(gè)服務(wù)訪問(wèn)入口,而每個(gè)訪問(wèn)入口都會(huì)使用一個(gè)Port元素來(lái)描述。 Port描述的是一個(gè)服務(wù)訪問(wèn)入口的部署細(xì)節(jié),包括通過(guò)哪個(gè)Web地址(URL)來(lái)訪問(wèn),應(yīng)當(dāng)使用怎樣的消息調(diào)用模式來(lái)訪問(wèn)等。其中消息調(diào)用模式則是使用Binding結(jié)構(gòu)來(lái)表示。 Binding結(jié)構(gòu)定義了某個(gè)PortType與某一種具體的網(wǎng)絡(luò)傳輸協(xié)議或消息傳輸協(xié)議相綁定,從這一層次開始,描述的內(nèi)容就與具體服務(wù)的部署相關(guān)了。比如可以將PortType與SOAP/HTTP綁定,也可以將PortType與MIME/SMTP相綁定等。 在介紹了WSDL的主要元素之后,大家會(huì)發(fā)現(xiàn),WSDL的設(shè)計(jì)理念完全繼承了以XML為基礎(chǔ)的當(dāng)代Web技術(shù)標(biāo)準(zhǔn)的一貫設(shè)計(jì)理念:開放。WSDL允許通過(guò)擴(kuò)展使用其他的類型定義語(yǔ)言(不光是XML Schema),允許使用多種網(wǎng)絡(luò)傳輸協(xié)議和消息格式(不光是在規(guī)范中定義的這些:SOAP/HTTP,HTTP-GET/POST以及MIME等)。同時(shí)WSDL也應(yīng)用了當(dāng)代軟件工程中的復(fù)用理念,分離了抽象定義層和具體部署層,使得抽象定義層的復(fù)用性大大增加。比如我們可以先使用抽象定義層為一類 Web服務(wù)進(jìn)行抽象定義(比如UDDI Registry,抽象定義肯定是完全一致的遵循了UDDI規(guī)范),而不同的運(yùn)營(yíng)公司可以采用不同的具體部署層的描述結(jié)合抽象定義完成其自身的Web服務(wù)的描述。WSDL文檔示例 下例是一個(gè)提供股票報(bào)價(jià)的簡(jiǎn)單Web服務(wù)的 WSDL 定義。該服務(wù)支持名為 GetLastTradePrice 的單一操作,這個(gè)操作是通過(guò)在 HTTP 上運(yùn)行 SOAP 1.1 協(xié)議來(lái)實(shí)現(xiàn)的。該請(qǐng)求接受一個(gè)類型為字符串的 tickerSymbol,并返回類型為浮點(diǎn)數(shù)的價(jià)格。 上面這部分是數(shù)據(jù)類型的定義,其中為定義了兩個(gè)元素的結(jié)構(gòu): * TradePriceRequest(交易價(jià)格請(qǐng)求): 將該元素定義為包含一個(gè)字符串元素(tickerSymbol)的復(fù)合類型元素。 * TradePriceResult(交易價(jià)格): 將該元素定義為一個(gè)包含一個(gè)浮點(diǎn)數(shù)元素(price)的復(fù)合類型元素。message name=GetLastTradePriceInput 這部分是消息格式的抽象定義,其中定義了兩個(gè)消息格式: * GetlastTradePriceInput(獲取最后交易價(jià)格的請(qǐng)求消息格式): 由一個(gè)消息片斷組成,該消息片斷的名字是body,包含的具體元素類型是TradePriceRequest。(前面已經(jīng)定義過(guò)了) * GetLastTradePriceOutput(獲取最后交易價(jià)格的響應(yīng)消息格式) : 由一個(gè)消息片斷組成,該消息片斷的名字是body,包含的具體元素類型是TradePriceResult。(前面已經(jīng)定義過(guò)了) 這部分定義了服務(wù)訪問(wèn)點(diǎn)的調(diào)用模式的類型,表明StockQuoteService的某個(gè)入口類型是請(qǐng)求/響應(yīng)模式,請(qǐng)求消息是GetlastTradePriceInput,而響應(yīng)消息是GetLastTradePriceOutput。binding name=StockQuoteSoapBinding type=tns:StockQuotePortType 這部分將服務(wù)訪問(wèn)點(diǎn)的抽象定義與SOAP HTTP綁定,描述如何通過(guò)SOAP/HTTP來(lái)訪問(wèn)按照前面描述的訪問(wèn)入口點(diǎn)類型部署的訪問(wèn)入口。其中規(guī)定了在具體SOAP調(diào)用時(shí),應(yīng)當(dāng)使用的 soapAction是/GetLastTradePrice,而請(qǐng)求/響應(yīng)消息的編碼風(fēng)格都應(yīng)當(dāng)采用SOAP 規(guī)范默認(rèn)定義的編碼風(fēng)格 /soap/encoding/。 股票查詢服務(wù) 這部分是具體的Web服務(wù)的定義,在這個(gè)名為StockQuoteService的Web服務(wù)中,提供了一個(gè)服務(wù)訪問(wèn)入口,訪問(wèn)地址是/stockquote,使用的消息模式是由前面的binding所定義的。 按照這個(gè)WSDL文檔的描述,在具體Web服務(wù)的使用中,具體發(fā)生的SOAP交互可能如下面所示:SOAP消息請(qǐng)求:POST /StockQuote HTTP/1.1 Host: Content-Type: text/xml; charset=utf-8 Content-Length: nnnn SOAPAction: /GetLastTradePrice MSFT SOAP消息響應(yīng):HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: nnnn 74.5 JAX-WS規(guī)范是一組XML web services的JAVA API。JAX-WS允許開發(fā)者可以選擇RPC-oriented或者message-oriented 來(lái)實(shí)現(xiàn)自己的web services。在 JAX-WS中,一個(gè)遠(yuǎn)程調(diào)用可以轉(zhuǎn)換為一個(gè)基于XML的協(xié)議例如SOAP。在使用JAX-WS過(guò)程中,開發(fā)者不需要編寫任何生成和處理SOAP消息的代碼。JAX-WS的運(yùn)行時(shí)實(shí)現(xiàn)會(huì)將這些API的調(diào)用轉(zhuǎn)換成為對(duì)于SOAP消息。在服務(wù)器端,用戶只需要通過(guò)Java語(yǔ)言定義遠(yuǎn)程調(diào)用所需要實(shí)現(xiàn)的接口SEI (service endpoint interface),并提供相關(guān)的實(shí)現(xiàn),通過(guò)調(diào)用JAX-WS的服務(wù)發(fā)布接口就可以將其發(fā)布為WebService接口。在客戶端,用戶可以通過(guò)JAX-WS的API創(chuàng)建一個(gè)代理(用本地對(duì)象來(lái)替代遠(yuǎn)程的服務(wù))來(lái)實(shí)現(xiàn)對(duì)于遠(yuǎn)程服務(wù)器端的調(diào)用。通過(guò)web service所提供的互操作環(huán)境,我們可以用JAX-WS輕松實(shí)現(xiàn)JAVA平臺(tái)與其他編程環(huán)境(.net等)的互操作。 JAX-WS工作原理如下圖所示 : 前面幾節(jié)都是講一些理論知識(shí),現(xiàn)在又用一個(gè)例子來(lái)說(shuō)明一下,這一節(jié)我們就CXF框架對(duì)象傳遞進(jìn)行講解。XmlRootElement(name=Customer) XmlAccessorType(XmlAccessType.FIELD) XmlType(propOrder = name,age) public class Customer private int age; private String name; public int getAge() return age; public void setAge(int age) this.age = age; public String getName() return name; public void setName(String name) = name; XmlRootElement-指定XML根元素名稱(可選) XmlAccessorType-控制屬性或方法序列化 FIELD-對(duì)每個(gè)非靜態(tài),非瞬變屬性JAXB工具自動(dòng)綁定成XML,除非注明XmlTransient NONE-不做任何處理 PROPERTY-對(duì)具有set/get方法的屬性進(jìn)行綁定,除非注明XmlTransient PUBLIC_MEMBER -對(duì)有set/get方法的屬性或具有共公訪問(wèn)權(quán)限的屬性進(jìn)行綁定,除非注 明XmlTransient XmlType-映射一個(gè)類或一個(gè)枚舉類型成一個(gè)XML Schema類型 XmlType-映射一個(gè)類或一個(gè)枚舉類型成一個(gè)XML Schema類型第二步:創(chuàng)建WebService接口WebService public interface HelloService public void save(Customer c1,Customer c2); public void test(String args); public Customer get(int id); WebService public class HelloServiceImpl implements HelloService public void save(Customer c1, Customer c2) System.out.println(c1.getAge()+-+c2.getAge(); System.out.println(c1.getName()+-+c2.getName(); public void test(String args) System.out.println(args); public Customer get(int id) Customer cus = new Customer(); cus.setAge(100); cus.setName(Josen); return cus; 第四步:創(chuàng)建服務(wù)端public class SoapServer public static void main(String args) /兩種方法,任選一種發(fā)布WebService接口 /Endpoint.publish(http:/localhost:8080/helloService, new HelloServiceImpl(); JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean(); factory.setAddress(http:/localhost:8080/helloService); factory.setServiceClass(HelloServiceImpl.class); factory.getInInterceptors().add(new LoggingInInterceptor(); factory.getOutInterceptors().add(new LoggingOutInterceptor(); factory.create(); 第五步:創(chuàng)建客戶端public class SoapClient public static void main(String args) JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.setAddress(http:/localhost:8080/helloService); factory.setServiceClass(HelloService.class); factory.setServiceClass(HelloServiceImpl.class); factory.getInInterceptors().add(new LoggingInInterceptor(); HelloService service = (HelloService)factory.create(); Customer c1 = new Customer(); c1.setAge(1); c1.setName(aaa); Customer c2 = new Customer(); c2.setAge(2); c2.setName(bbb); service.save(c1, c2); service.test(aaaaaaaaaaaaa); 最后,測(cè)試程序 運(yùn)行服務(wù)端程序,在瀏覽器地址欄輸入http:/localhost:8080/helloService?wsdl查看接口是否發(fā)布成功。成功則運(yùn)行一下客戶端程序,看看對(duì)象傳輸是否成功。現(xiàn)在我們來(lái)分析一下控制打印的日志信息。信息: Inbound Message - ID: 1 Address: /HelloWorld Encoding: UTF-8 Content-Type: text/xml; charset=UTF-8 Headers: content-type=text/xml; charset=UTF-8, connection=keep-alive, Host=localhost:9000, Content-Length=184, SOAPAction=, User-Agent=Apache CXF 2.2.2, Content-Type=text/xml; charset=UTF-8, Accept=*/*/*, Pragma=no-cache, Cache-Control=no-cache Payload: Josen - 2010-1-9 20:41:56 erceptor.LoggingOutInterceptor$LoggingCallback onClose 信息: Outbound Message - ID: 1 Encoding: UTF-8 Content-Type: text/xml Headers: Payload: hi Josen - 2010-01-09 20:41:56.578:INFO: seeing JVM BUG(s) - cancelling interestOps=0 當(dāng)客戶端向服器發(fā)送請(qǐng)求時(shí),服務(wù)端LoggingInInterceptor拉截客戶端發(fā)送過(guò)來(lái)的SOAP消息,如下: Josen 客戶端將請(qǐng)求信息封閉在中,當(dāng)然也可以將其放到,只要在WebParam中的header設(shè)置成true,默認(rèn)為false;服務(wù)器接到請(qǐng)求之后,響應(yīng)客戶端。同樣以SOAP形式將信息封裝好發(fā)回客戶端,SOAP信息如下: hi Josen 前面幾節(jié)我們講解對(duì)象傳遞,但是通常情況下我們不直接傳對(duì)象,因?yàn)橹苯觽鬟f對(duì)象安全性差,而且暴露了實(shí)體對(duì)象。所以我們選擇傳遞XML文件,當(dāng)然也可以傳遞JSON對(duì)象。這節(jié)我只針對(duì)傳遞XML,那么JAVA綁定成XML,服務(wù)端將XML解析成Java對(duì)象有什么工具可用嗎,其實(shí)這樣的工具多的是。這里我選擇一個(gè)比較簡(jiǎn)單的JAXB工具來(lái)講解一下。 JAXB(Java Architecture for XML Binding)提供了一個(gè)快速而方便的方式綁定XML Schemas和java,使java程序員能夠很方便的在java應(yīng)用程序中處理XML數(shù)據(jù)。JAXB提供了將XML文檔解組為java內(nèi)容樹的方法,以及將java內(nèi)容樹重新編組回XML文檔的方法。JAXB同樣也提供了一種從java對(duì)象生成XML Schema的方式。里有幾個(gè)重要的定義: 編組(Marshalling)是把內(nèi)存中的數(shù)據(jù)轉(zhuǎn)化到存儲(chǔ)媒介上的過(guò)程。因此在 Java 和 XML 環(huán)境中,編組就是把一些 Java 對(duì)象轉(zhuǎn)化成一個(gè)(或多個(gè)) XML 文檔。在數(shù)據(jù)庫(kù)環(huán)境中,則是把 Java 表示的數(shù)據(jù)存入數(shù)據(jù)庫(kù)。顯然,編組的秘密在于把 Java 實(shí)例中的面向?qū)ο蠼Y(jié)構(gòu)轉(zhuǎn)化成適用于 XML 的 扁平結(jié)構(gòu),或者 RDBMS 中的關(guān)系結(jié)構(gòu)(使用 Java 技術(shù)轉(zhuǎn)換到 OODBMS 實(shí)際上很簡(jiǎn)單)。工作原理如下圖所示解組(Unmarshalling) 是把數(shù)據(jù)從存儲(chǔ)媒介轉(zhuǎn)換到內(nèi)存中的過(guò)程-正好與編組相反。因此需要把 XML 文檔解組到 Java VM 中。這里的復(fù)雜性不是在扁平數(shù)據(jù)中,因?yàn)檫@不是必需的,而在于從正確的數(shù)據(jù)到正確的 Java 代碼變量的映射。如果映射是錯(cuò)誤的,就不可能正確地訪問(wèn)數(shù)據(jù)。當(dāng)然,如果再嘗試重新編組還會(huì)造成更大的問(wèn)題,并且問(wèn)題傳播得很快。工作原理如下圖所示: 往返(Round-tripping)可能是最重要也最容易誤解的數(shù)據(jù)綁定術(shù)語(yǔ)。往返用于描述從存儲(chǔ)媒介到內(nèi)存然后回到存儲(chǔ)媒介的完整循 環(huán)。在 XML 和 Java 技術(shù)環(huán)境中,這就意味著從 XML 文檔到 Java 實(shí)例變量,然后再回到 XML 文檔。正確的往返要求,如果中間沒(méi)有修改數(shù)據(jù),XML 輸入和 XML 輸出應(yīng)該是等同的。我們還以例子來(lái)說(shuō)明它的工作原理,直觀點(diǎn)。 第一步,創(chuàng)建一個(gè)Customer對(duì)象XmlRootElement(name=customer) XmlAccessorType(XmlAccessType.FIELD) XmlType(name = ) public class Customer XmlAttribute(required = true) protected String name; XmlAttribute(required = true) protected int age; /* */* * Gets the value of the name property. * * return * possible object is * link String * */ public String getName() return name; /* */* * Sets the value of the name property. * * param value * allowed object is * link String * */ public void setName(String value) = value; /* */* * Gets the value of the age property. * */ public int getAge() return age; /* */* * Sets the value of the age property. * */ public void setAge(int value) this.age = value; 第二步,創(chuàng)建一個(gè)測(cè)試類public class SoapClient private final static String MODEL = com.itdcl.model; public static void main(String args) throws ParserConfigurationException, JAXBException, TransformerException ObjectFactory factory = new ObjectFactory(); Customer customer = factory.createCustomer(); customer.setAge(20); customer.setName(Josen); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.newDocument(); JAXBContext jaxbContext = JAXBContext.newInstance(MODEL); /Java對(duì)象轉(zhuǎn)換成XML Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.marshal(customer, doc); DOMSource domSource = new DOMSource(doc); StringWriter writer = new StringWriter(); StreamResult result = new StreamResult(writer); TransformerFactory tf = TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer(); transformer.transform(domSource, resu

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論