在過去的幾個(gè)月里,Sun公司已經(jīng)為Java平臺(tái)的第6個(gè)版本(Java Platform Standard Edition 6)提供了二進(jìn)制安裝文件,Java文檔和Java源代碼,就是知名的“野馬”。而且這飛馳的野馬要拉住你這車并不算晚。
一個(gè)顯而易見的問題是,“為什么我應(yīng)該關(guān)心?”對(duì)于這些質(zhì)疑者,Java SE 6提升的性能包括擴(kuò)平臺(tái)性,從開放的程序管理到Java編譯器,到系統(tǒng)底層和屏幕組件,到在你的源代碼中混合腳本語言(支持JavaScript),到Swing的整潔的外觀,到XML數(shù)字簽名,到智能卡I/O API,到JMX監(jiān)聽線程的升級(jí),為Web服務(wù)的服務(wù)提供者使用Annotations注釋和更加簡單的客戶端管理——在我們要關(guān)心的時(shí)候,這些名字僅僅是這個(gè)平臺(tái)中的一小部分新功能。(java.net站點(diǎn)提供了關(guān)于J2SE 6平臺(tái)中所有的新功能。) 這篇文章中,我們僅僅關(guān)注Java SE 6中對(duì)于Web Services規(guī)范的升級(jí)以及JAX-WS(Java API for XML Web Services)2.0規(guī)范,這些升級(jí)使得我們Web Services的創(chuàng)建和調(diào)用變得更加容易。使用這些新功能,我們可以僅僅使用簡單的Annotations注釋從一個(gè)Java類創(chuàng)建Web Services;隨后,我們?cè)谡{(diào)用這個(gè)服務(wù)的時(shí)候使用JAX-WS2.0。我們同樣可以給這個(gè)服務(wù)添加一個(gè)管理者用來截取這個(gè)服務(wù)調(diào)用而且將截取的SOAP消息傳輸?shù)絊ystem.out從控制臺(tái)打印出來。 事實(shí)上,這些功能曾在JSR181(Java Specification Request 181)和JSR224 (JAX-WS)規(guī)范中已經(jīng)被認(rèn)可了,只是Java的正式版本擁有這些功能使它更加主流;我們同樣期待Java IDE開發(fā)平臺(tái)可以對(duì)這些功能進(jìn)行良好的支持。 JavaEE5規(guī)范中,允許基于標(biāo)準(zhǔn)規(guī)范讓應(yīng)用程序開發(fā)人員為Web Services提供服務(wù)端平臺(tái),JSR181和JSR224就是JavaEE5規(guī)范中的一部分。理論上講,若在不改變?cè)创a使用支持這些相同規(guī)范的應(yīng)用程序服務(wù)器,在Java SE 6環(huán)境中大規(guī)模地發(fā)布工程這些功能將會(huì)破壞早期的Web Services應(yīng)用程序,這個(gè)最初是不希望的。 我們的“野馬”Web Service:服務(wù)端和客戶端 在我們穩(wěn)定這匹野馬之前,我們先下載這篇文中重提及的zip文件,它主要包括下邊四個(gè)文件: mustangws.zip包括了這篇文章中提及的Web Service服務(wù)端應(yīng)用程序源代碼,構(gòu)建文件和腳本文件。 mustangwsclient.zip包括了客戶端的源代碼,構(gòu)建文件和腳本文件。 mustangws.jar包含了已經(jīng)編譯過的服務(wù)端應(yīng)用程序。 mustangwsclient.jar包含了已經(jīng)編譯過的客戶端程序。 注意:你需要Java SE 6和Apache Ant這兩個(gè)軟件來運(yùn)行這篇文章中的例子。 在你解壓之后,你將會(huì)看到兩個(gè)文件架,mustangws 和mustangwsclient,這兩個(gè)文件架內(nèi)分別是Web Services的服務(wù)端和客戶端。兩個(gè)項(xiàng)目里面都有同樣的src文件夾,里面包含了Java的源文件和Apache Ant軟件需要的構(gòu)建文件build.xml。這里還有附加的wsgenMustang.bat 和wsimportMustang.bat兩個(gè)批處理文件,里面包含了生成Web Services存根的控制臺(tái)命令,我們將在下邊的章節(jié)中講到。Apache Ant的build.xml文件對(duì)于兩個(gè)應(yīng)用程序而言都是放在mustangws 和mustangwsclient兩個(gè)根目錄中的。兩個(gè)文件中有同樣的ant任務(wù)init,compile,dist,clean和run。 我們Web Services的服務(wù)端根目錄里面還有一個(gè)目錄wsdl,里面放了通過wsgen生成的描述Web Service的WSDL(Web Services Description Language)文件。 Web Services Metadata Web Services Metadata詳細(xì)說明了Annotations的使用,這個(gè)在JavaSE5中就被引入了。這些對(duì)你而言可能是新概念,Annotations就是能夠被源代碼使用的注釋;一般使用在類定義,函數(shù),函數(shù)參數(shù)或者函數(shù)返回值中。這些Annotations實(shí)際上就是對(duì)編譯器,Java虛擬機(jī)和應(yīng)用程序服務(wù)器的一種指示或者暗示,告訴它們應(yīng)該如何處理這些有注釋的代碼。Annotations語句使用一般是“@”開始后面跟著Annotation文本內(nèi)容。比如,@Deprecated注釋用于在使用函數(shù)的過程中將函數(shù)定義時(shí)生成的警告去掉,這一點(diǎn)使得Annotations變成了第一個(gè)Java類中的構(gòu)造。 當(dāng)Web Services Metadata Annotations用于Java源代碼中的類定義和函數(shù)定義的時(shí),配置Web Services將會(huì)相對(duì)簡單。Web Services Metadata規(guī)范將會(huì)跟著“以Java開始的”開發(fā)模式,這些意味著你首先定義一個(gè)Java類和函數(shù),然后就對(duì)他們使用一個(gè)Web Services Metadata Annotation。對(duì)于Java開發(fā)者來說,比起通過WSDL文件創(chuàng)建Web Service來說通過Java類使用Annotation是創(chuàng)建Web Services更加自然的方法。這些Annotations注釋用來暗示W(wǎng)eb Services的運(yùn)行時(shí)引擎將Java類和它里面的函數(shù)解釋成為Web Service和相應(yīng)的Web Service操作。將這個(gè)引擎已經(jīng)綁定在Java SE 6里面了,但是因?yàn)閃eb Services Metadata仍然是Java EE 5里面的一部分,所以你將看到眾多廠家還是提供了支持Annotation的應(yīng)用程序服務(wù)器。 我們的“野馬”Web服務(wù)端 我們不再啰嗦了,讓我們通過“野馬”Web Service的服務(wù)端的一部分來看看Web Services Metadata在實(shí)踐中的使用。瀏覽mustangws/src/com/techyatra/hellows目錄。你將會(huì)看到下邊的文件: HelloServer 打開HelloServer文件,里面包含了Web Services Metadata Annotations定義,將一個(gè)簡單的Java類用作Web Service,下邊是一個(gè)實(shí)現(xiàn)了Service的bean文件: package com.techyatra.hellows; 在上邊的代碼中,@WebService注釋使得類MustangServer實(shí)現(xiàn)了Web Service,而且@WebMethod標(biāo)識(shí)類中ping方法作為WebService的操作,ping除開返回greeting的值就不會(huì)做其他的事情。 需要注意的是:不管你愿意不愿意,你都不能任意地將Annotation用于任何一個(gè)Java類和函數(shù)使其暴露為一個(gè)WebService和一個(gè)WebService操作。因?yàn)镴ava類若要成為一個(gè)實(shí)現(xiàn)了WebService的bean,它需要遵循下邊這些原則: 這個(gè)類必須是public類 這些類不能是final的或者abstract 這個(gè)類必須有一個(gè)公共的默認(rèn)構(gòu)造函數(shù) 這個(gè)類絕對(duì)不能有finalize()方法 若要成為一個(gè)實(shí)現(xiàn)了WebService的Bean這個(gè)Java類必須遵循這些原則: 這個(gè)類必須是public,它的參數(shù)、返回值、和異常在每個(gè)JAX RPC規(guī)范中都描述了Java轉(zhuǎn)化成XML/WSDL映射文件的規(guī)則等等。參數(shù)和返回值可以是原始類型、數(shù)組等等;異常都可以繼承Exception;請(qǐng)查閱Java API去看基于XML的遠(yuǎn)程調(diào)用可以知道更多的信息。 現(xiàn)在我們已經(jīng)擁有了合理規(guī)范,讓我們接近代碼來看看WebService Annotation的作用。注意:這篇文章不是描述所有Annotation 和所有的WebService Metadat規(guī)范里面的所有成員。如果要了解細(xì)節(jié)自己去查閱JSR 181規(guī)范。 這里有各種類型的Annotation。@WebService和@WebMethod是WSDL映射Annatotion。這些Annotation將描述Web Service的WSDL文檔元素和Java源代碼聯(lián)系在一起。@SOAPBinding是一個(gè)綁定的annotation用來說明網(wǎng)絡(luò)協(xié)議和格式。 @WebService annotation的元素name,serviceName和targetNamespace成員用來描述wsdl:portType,wsdl:service,和targetNameSpace生成WebService中的WSDL文件。 @SOAPBinding是一個(gè)用來描述SOAP格式和RPC的協(xié)議的綁定Annotation。 @WebMethod Annotation的operationName成員描述了wsdl:operation,而且它的操作描述了WSDL文檔中的SOAPAction頭部。這是客戶端必須要放入到SQAPHeader中的數(shù)值,SOAP 1.1中的一種約束。 @WebParam Annotation的partName成員描述了WSDL文檔中的wsdl:part。 @WebResult Annotation的partName成員描述了wsdl:part用來返回WSDL文檔的值。 HelloException類是一個(gè)含有屬性description和錯(cuò)誤代碼的異常類,Person是一個(gè)只有l(wèi)astname和firstname 屬性的簡單類。這些類都沒有被任何Annotation注釋過。 我們?cè)贖elloException中使用@WebFault確實(shí)很誘人,可是并非如此!Annotation是被wsgen用來生成異常bean。更加有趣的是,這個(gè)不是JSR 181規(guī)范中的一部分,但是是JAX-RPC 1.1中的一部分。 在我們轉(zhuǎn)移到wsgen之前,一個(gè)很好的功能需要我們注意的是我們?nèi)绾沃剌d一個(gè)函數(shù)使得它成為一個(gè)WebService的操作。我們通過不同的@WebMethod的operationName元素值來激活這個(gè)功能,這里的重載函數(shù)hello()和hello(person)有了不同的operationName元素各自命名為hello和quickHello。 現(xiàn)在為我們的服務(wù)應(yīng)用程序運(yùn)行Apache Ant的編譯工作。利用wsgen通過這樣的方式來生成build文件夾用來包含編譯過的class文件和一個(gè)wsdl文件夾用來放置WSDL文檔。 wsgen 擁有Web Service Annotation的HelloServer 類無法成功發(fā)布因?yàn)樗祟~外的沒有被注釋為WebService的HelloException類或者沒有綁定Java XML,如果HelloServer的函數(shù)沒有拋出異常,我們就不能使用wsgen。盡管如此,在實(shí)際應(yīng)用中,這種做法是不推崇的;因此使用wsgen的目的是為了創(chuàng)建一個(gè)能夠使用WebService的類。 wsgen是一個(gè)命令行功能用來生成合適的JAX-WS。它讀取WebService的終端類文件,在我們的例子中就是com.techyatra.hellows.HelloServer,同時(shí)生成所有用于WebService發(fā)布的源代碼文件和經(jīng)過編譯過的二進(jìn)制類文件。它還隨意生成WSDL和符合規(guī)范的HelloServer類WebService。wsgen從資源文件生成一個(gè)完整的操作列表是合法的。 為了方便,這篇文章的源代碼mustangws文件夾中包含了一個(gè)wsgenHello.bat批處理文件,里面包含了我們的Server項(xiàng)目中所需要的wsgen命令行的操作。 運(yùn)行mustangws中的mustangws/wsgenHello.bat文件產(chǎn)生HelloExceptionBean源文件和編譯過的class文件放入com.techyatra.hellows.jaxb文件夾中。這些類綁定了關(guān)于Java-XML的所有操作。 現(xiàn)在我們有了發(fā)布WebService的所有需要的條件,在我們發(fā)布這個(gè)服務(wù)之前,讓我們?cè)倏匆豢磳⑦\(yùn)行過程加入到WebService的調(diào)用隊(duì)列。這個(gè)相當(dāng)敏捷萬一所有的通用過程都是調(diào)用這些服務(wù)所需要的過程,如此執(zhí)行過程對(duì)所有的操作者來說都是合法的。操作者允許應(yīng)用程序介紹自定義和核心商業(yè)需求域之外的特殊處理。這個(gè)操作者同樣會(huì)執(zhí)行安全檢查,據(jù)使用統(tǒng)計(jì),編碼和解碼數(shù)據(jù),提供給其它模塊開發(fā)者使用。 Handlers 從客戶端(服務(wù)消費(fèi)者)發(fā)送到服務(wù)端(服務(wù)提供者)的SOAP消息通過Java SE6中的JAX-WS處理管道來完成。Java SE 6提供了一個(gè)位于javax.xml.ws.handler包內(nèi)的名為Handler的操作者解釋器,能夠插入到執(zhí)行管道用來執(zhí)行自定義、特殊應(yīng)用程序程序傳送綁定或者沒有綁定的消息。兩種Handler的類型都是合法的:logical和SOAP。SOAP操作者能夠操作所有完整的SOAP消息,包括SOAP頭部和SOAP的主體,而logical操作者僅僅能夠操作SOAP主體有負(fù)載的部分。 我們的服務(wù)器包括了com.techyatra.hello.TraceHandler SOAP 操作者。它解釋了沒有綁定和經(jīng)過綁定的SOAP消息,而且將內(nèi)容輸出在System.out顯示出來: /* TraceHandler實(shí)現(xiàn)了javax.xml.ws.handler.SOAPHandler< c extends MessageContext> 接口。方法handleMessage()和handleFault()將未綁定和沒有綁定的SOAP消息傳輸?shù)絊ystem.out管道。這個(gè)功能提供給SOAPMessageContext,這部分聚合了所有SOAP消息,它包含了各種消息屬性和SOAP消息本身。 現(xiàn)在我們有一個(gè)準(zhǔn)備好了操作者的WebService,我們應(yīng)該如何包裝和部署這樣的服務(wù)呢?這個(gè)服務(wù)打包成下邊我們要討論的一個(gè)jar文件,但是看起來更加興奮。 Boostrap 在JavaSE6種,你將會(huì)看到j(luò)avax.xml.ws包里面包含了終端類,這些專門用來在JVM中部署WebService。當(dāng)然,聽起來很正確!不需要任何服務(wù)器。正好利用終端類創(chuàng)建一個(gè)服務(wù)實(shí)例,就像下邊顯示的Bootstrap類一樣。終端是用于小的應(yīng)用程序的,應(yīng)用服務(wù)器消耗是不合理的,這里是僅僅用作發(fā)布目的。 package com.techyatra.hellows; 這個(gè)Bootstrap類是一個(gè)便利的類用來聚合HelloServer WebService中的各個(gè)塊。它發(fā)布這個(gè)服務(wù)器到一個(gè)URL地址而且將TraceHandler這個(gè)追蹤操作者添加到這個(gè)WebService運(yùn)行管道中。 服務(wù)應(yīng)用jar文件 運(yùn)行Apache Ant中的命令創(chuàng)建編譯過的JAR。這個(gè)dist任務(wù)創(chuàng)建一個(gè)MustangWS.jar文件用來標(biāo)志com.techyatra.hellows.Bootstrap 類作為一個(gè)類包含了main()的入口點(diǎn)。 現(xiàn)在執(zhí)行Apache Ant的run命令。這個(gè)將調(diào)用Bootstrap中的main()方法用來將WebService發(fā)布到http://localhost:9090/HelloServer。在你的瀏覽器里面輸入http://localhost:9090/HelloServer?WSDL用來顯示動(dòng)態(tài)生成的WSDL文檔的內(nèi)容。讓我們看看WebService Metadata Annotation在WSDL中如何來提供各種服務(wù)的。 “野馬”WebSerice客戶端 現(xiàn)在我們將HelloServer發(fā)布成為了一個(gè)WebService,讓我們看看如何來調(diào)用它。當(dāng)然這里有很多方法來完成這個(gè)工作,我們將使用JavaSE 6中的JAX-WS2.0中的功能來調(diào)用HelloServer這個(gè)WebService。 這個(gè)客戶端應(yīng)用程序在mustangwsclient 文件夾中可以找到。除開我們熟悉的src目錄和build.xml文件以外,mustangwsclient目錄中還包含了wsimportHello.bat批處理文件,用來生成JAXB的綁定存根。客戶端通過存根能夠很方便地調(diào)用這個(gè)服務(wù)。Java SE 6利用wsimport功能綁定生成這個(gè)存根,wsimportHello.bat使用這些功能為HelloService生成存根。 wsimport wsimport能夠檢查WSDL文件中的特別URL是否合法然后生成所有的class用來讓客戶端更加清晰和容易懂得。有些人想使用SAAJ,JAXB或者straight-up XML用來調(diào)用WebService,可是需要小心的是,基于的wsimport的存根提供了一個(gè)方便的層次來管理WebService。它用來生成合適的JAX-WS機(jī)制,標(biāo)識(shí)這些類可以和比較規(guī)范的應(yīng)用程序服務(wù)器和JVM來工作。 當(dāng)你運(yùn)行mustangwsclient文件夾中的wsimportHello.bat批處理文件,它將為Mustang WebService客戶端項(xiàng)目生成構(gòu)建文件夾然后能夠使用關(guān)鍵的參數(shù)運(yùn)行wsimport,這些用來生成存根文件,并且將其放在他們的com/techyatra/helloclient/jax文件夾中。若要知道細(xì)節(jié),就查閱網(wǎng)上的資源。 HelloServer是一個(gè)服務(wù)端的終端接口。 HelloService是一個(gè)服務(wù) HelloException是WSDL文檔中wsdl:fault映射過來的異常類。Person類是從WSDL文件中的Person模式中生成的Java類的綁定映射文件。 這些存根將會(huì)被HelloService客戶端應(yīng)用程序使用,這些應(yīng)用位于com.techyatra.helloclient.JAXClient 和 com.techyatra.helloclient.Client. 客戶端應(yīng)用程序主要的入口點(diǎn)就是com.techyatra.helloclient.Client類,它接受命令行的參數(shù),有需要的話執(zhí)行參數(shù)重載和檢查,創(chuàng)建一個(gè)Person對(duì)象,最后經(jīng)過JAXClient來調(diào)用這個(gè)對(duì)象。 package com.techyatra.helloclient; package com.techyatra.helloclient; 現(xiàn)在,執(zhí)行Ant run命令將顯示下面的信息: [java] No arguments specified. Overriding arguments to – jax Mr. Doe
[java] Alive and well. Thank you and hello Mr. Doe! 但是這正是我們想要的! 盡管我們沒有在這篇文章中討論到,但是基于Axis客戶端框架的代碼和WSDL2Java腳本文件都可以下載到,基于Axis框架的客戶段源代碼在mustangwsclient/com/techyatra/hellowsclient/AxisClient.java,而且包含了命令行參數(shù)的批處理文件wsdl2javaHello.bat,能夠在mustangwsclient根目錄中找到。若要?jiǎng)h除Axis引用,直接刪除mustangwsclient/com/techyatra/helloclient/axis目錄和mustangwsclient/com/techyatra/helloclient/AxisClient.java 源文件。 讓我們回顧一下我們這里的WebService進(jìn)行部署: 解開源代碼包。 針對(duì)我們的服務(wù)器應(yīng)用程序: 執(zhí)行Ant編譯任務(wù)。 執(zhí)行wsgenMustang.bat批處理文件生成所需要的文件。 執(zhí)行Ant run任務(wù)調(diào)用來構(gòu)建MustangWS.jar文件。 我們現(xiàn)在可以在http://localhost:9090/HelloServer中運(yùn)行HelloServer服務(wù),而且鍵入http://localhost:9090/HelloServer?WSDL還能夠看到動(dòng)態(tài)生成的WSDL文檔內(nèi)容。 針對(duì)客戶端應(yīng)用程序: 如果對(duì)Axis沒有興趣就刪除mustangwsclient/com/techyatra/helloclient/axis目錄和mustangwsclient/com/techyatra/helloclient/AxisClient.java 源文件。 運(yùn)行wsImportHello.bat批處理文件生成客戶端存根。 運(yùn)行Ant的run任務(wù)就可以了。 資源: Matrix Java&開源社區(qū):http://www. |
|