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中有一些注解,可以修改,不細說。
posted on 2011-10-24 00:26 yuxh 閱讀(404) 評論(0) 編輯 收藏 所屬分類: web service