筆記

          way

          Developing.Web.Services.with.Apache.CXF.and.Axis2 3rd

          1. Code first approach:可能不能完全發(fā)揮框架和web services的能量,但能完成目標。減少了學習曲線,不用非常透徹了解web services概念,只要對某個框架有一定了解就能完成任務。
          2.Contract first approach:根據(jù)服務先寫WSDL文件,寫好之后使用框架的工具把WSDL轉(zhuǎn)換為依賴框架的代碼。

          一  介紹

          當客戶端調(diào)用你的web service的時候,他會發(fā)送一個消息過來(可能是soap 消息),如:

          <foo:concatRequest>
          <s1>abc</s1>
          <s2>123</s2>
          </foo:concatRequest>

          這時候如果有一個轉(zhuǎn)換器把這個soap消息轉(zhuǎn)換成java對象,然后調(diào)用你提供的java對象(方法)的話將會是非常方便的。幾個最流行的庫就是充當了這種轉(zhuǎn)換器功能,比如CXF, Axis2 , Metro (jdk6自帶的有)。

          手動創(chuàng)建WSDL文件比較容易出錯,可以使用eclipse進行可視化編輯。

          二 生成服務代碼

          像CXF這樣的 web service庫可以創(chuàng)建轉(zhuǎn)換器把進來的SOAP 消息轉(zhuǎn)換為Java對象,然后作為參數(shù)傳給方法。生成這些代碼,只需創(chuàng)建一個main:

          1 CXF方式:

          public static void main(String[] args) { WSDLToJava.main(new String[] { "-server", "-d", "src/main/java", "src/main/resources/SimpleService.wsdl" }); System.out.println("Done!"); }

          運行后會生成service endpoint interface(SEI),我們再寫一個類(比如SimpleServiceImpl)來實現(xiàn)這個接口,寫入自己的業(yè)務。還會生成傳入消息對應的java對象。同時生成一個服務器類:

          public class SimpleService_P1_Server { protected SimpleService_P1_Server() throws Exception { System.out.println("Starting Server"); Object implementor = new SimpleServiceImpl(); String address = "http://localhost:8080/ss/p1"; Endpoint.publish(address, implementor); } public static void main(String args[]) throws Exception { new SimpleService_P1_Server(); System.out.println("Server ready..."); Thread.sleep(5 * 60 * 1000); System.out.println("Server exiting"); System.exit(0); } }

          運行這個類你的web service就可以服務了。

          2 Axis2 方式

          用類似的寫main方法,或者配置eclipse的axis2插件可生成:在WSDL文件上,右鍵->web service->generate java bean skeleton

          界面的上半部分針對服務端,可以根據(jù)需要調(diào)整生成的級別,下半部分是生成客戶端。具體的級別可參考eclipse的幫助文檔。一路下一步,最后根據(jù)命名空間生成包路徑的文件,里面有XXSkeletonInterface.java 文件(如果生成的時候選擇了生成接口的話),還有一個XXSkeleton實現(xiàn)了這個接口,也是我們需要修改這部分代碼完成我們業(yè)務的地方。實際上有一個XXMessageReceiverInOut.java的類接收請求的消息,并調(diào)用XXSkeletonInterface。使用eclipse的axis2插件的時候,會自動在web-inf文件夾下生成service\xx(你的wsdl服務名),這下面還要一個meta-inf文件夾裝有wsd文件和一個services.xml配置文件。services.xml文件可配置包括XXMessageReceiverInOut類在內(nèi)的選項。

          二 生成客戶端代碼

          為了調(diào)用這些web service,同樣可以用CXF這些庫來生成在客戶端運行的轉(zhuǎn)換器(稱為service stub)。當調(diào)用stub里的方法的時候,他會把你的數(shù)據(jù)/對象 轉(zhuǎn)換為正確的XML格式,然后發(fā)送給真正的web service。當他收到響應的時候,又會把XML轉(zhuǎn)回Java。

          1 CXF 方式

          和生成服務器端類似,使用方法

          WSDLToJava.main(new String[] {
          "-client",
          "-d", "src/main/java",
          "src/main/resources/SimpleService.wsdl" });

          運行后會生成客戶端代碼:

          public final class SimpleService_P1_Client { private static final QName SERVICE_NAME = new QName("http://ttdev.com/ss", "SimpleService"); private SimpleService_P1_Client() {} public static void main(String args[]) throws Exception { URL wsdlURL = SimpleService_Service.WSDL_LOCATION; if (args.length > 0) { File wsdlFile = new File(args[0]); try { if (wsdlFile.exists()) { wsdlURL = wsdlFile.toURI().toURL(); } else { wsdlURL = new URL(args[0]); } } catch (MalformedURLException e) { e.printStackTrace(); } } SimpleService_Service ss = new SimpleService_Service(wsdlURL, SERVICE_NAME); SimpleService port = ss.getP1(); { System.out.println("Invoking concat..."); com.ttdev.ss.ConcatRequest _concat_parameters = null; java.lang.String _concat__return = port.concat(_concat_parameters); System.out.println("concat.result=" + _concat__return); } System.exit(0); } }

          SimpleService_Service是創(chuàng)建的service stub,他模擬了客戶端的服務。我們需要修改這個類中的_concat_parameters部分,加入?yún)?shù):

          com.ttdev.ss.ConcatRequest _concat_parameters = new ConcatRequest();
          _concat_parameters.setS1("abc");
          _concat_parameters.setS2("123");

          現(xiàn)在就可以運行客戶端代碼了。SEI中有一些注解,可以修改,不細說。

           

          2 Axis2 方式
          和生成服務端類似,利用eclipse插件直接生成,包路徑類似,有一個XXStub類,這個類里面有包括請求和應答消息在內(nèi)的內(nèi)部類。使用的時候,先對請求消息參數(shù)類按業(yè)務需求賦值,最后調(diào)用Stub的請求方法。可以使用Stub的構(gòu)造函數(shù)指定目標endpoint。

           

          posted on 2011-10-24 00:26 yuxh 閱讀(404) 評論(0)  編輯  收藏 所屬分類: web service


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           

          導航

          <2011年10月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          統(tǒng)計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          收藏夾

          博客

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 务川| 清远市| 长兴县| 定陶县| 扬州市| 巴林左旗| 平潭县| 定兴县| 永城市| 读书| 龙游县| 乐昌市| 澳门| 乐安县| 贡觉县| 溧阳市| 滕州市| 诏安县| 原平市| 天台县| 泰顺县| 军事| 徐闻县| 丰顺县| 姜堰市| 伊金霍洛旗| 河曲县| 陆川县| 安义县| 班玛县| 马龙县| 贵德县| 枣阳市| 盐山县| 姚安县| 虎林市| 柳江县| 桃园县| 太湖县| 威海市| 泸州市|