CXF客戶端開發(轉載)

1.創建工程

在 myeclipse 中創建 webservice 工程, file->new->other->web service project,起名字 webservicetest。
其實所謂的 webservice 也不可能單獨通訊, soap協議是一個更上層的通訊協議,他是凌駕在http協議上的,所以我們web開發熟悉的servlet必不可少,默認就可以啦。

選擇以下工具 jar 包,

工程創建完畢,看看效果。包結構基本上遵守 web 的工程模式,仔細看多了一個目錄WebServices ,下邊的 services.xml 作用就是我們的應用下提供了幾個webservices服務,另外就是 web.xml 會發生變化。

下一步工作我們分三種情況舉例,分別是通訊傳輸[b]基本數據類型,xml數據類型,對象類型[/b]。 這三種情況應該可以涵蓋了平時所有的應用。

[b]1.1 基本數據類型通訊[/b]

創建一個 service 服務程序。 File->new->other->myeclipse->web service 。


仍然需要起一個服務類的名字, FirstService , myeclipse 會爲我們生成兩個類服務接口類 (IFirstService) 和服務實現類 (FirstServiceImpl) 。

看看你的 service.xml 發生了什麼變化。

看一下我們的實現類,很簡單,就是返回一個基本數據類型 — 字符串

任務完成一半了,我們先部署一下,看看效果。

部署完成後我們生成 wsdl ,如下

Myeclipse 有個訪問 wsdl 的工具,如下:

點擊到 wsdl 方式,並錄入 wsdl 的 url 路徑。

測試 一下功能,結果如下 :

相當於客戶端發一個字符串給服務端,服務端處理後返回一個字符串響應,功能敘述完畢 。

下來我們開發一個正式的客戶端。

File->new->other->web service client 填寫 wsdl 訪問路徑。生成的類以及關鍵測試代碼 如下:

[b]1.2 對象類型通訊[/b]

簡單基礎類型通訊不能滿足我們日常的系統開發工作 , 我們還需要支持遠程對象傳輸 , 保證大數據量的傳輸 , 不過這就需要考慮效率問題 。壓力測試時要注意 webservice 的效率測試 。

在生成 service 端和 client 端時最好使用兩個工程,把 service 部署後建立另外一個xfire 工程 ,並生成 client ,在傳輸對象的過程中 client 端也需要一個 User 對象,這個對象的作用就是映射服務器端的自定義對象。

首先我們需要創建服務類,返回參數是自定義對象 User 。

創建 User 對象 ,注意這個是服務器端的。

爲了在 WSDL 中映射參數的類型,我們需要創建一個配置文件,並和服務類放在一個包下。 IFirstService.aegis.xml

服務器端都準備好了,部署!看看我們 wsdl 。

注意其中對參數的定義。

下來就是 client 端的開發了,順便介紹一下 xfire 客戶端的[b]三種模式[/b]:

【 1. Client 開發者擁有Web服務端的 class】

即:能拿到服務端的接口 Class 和 Entity 類及 aegis 配置文件
// 傳統 POJO 模式

Service srvcModel = new ObjectServiceFactory().create(Hello.class);

XFireProxyFactory factory = new XFireProxyFactory(

XFireFactory.newInstance().getXFire());

String helloWorldURL = "http://localhost:8080/webservice/services/Hello ";

Hello srvc = ( Hello) factory.create(srvcModel,helloWorldURL);

System.out.println(srvc.sayHello("Robin"));

// JSR181 模式,注意這裏 Server 端開發組需要向 Client 提供實現類,而不止於 // 接口,有點危險

Service srvcModel = new AnnotationServiceFactory().create(HelloImpl.class);

XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());

String helloWorldURL = "http://localhost:8080/webservice/services/Hello";

Hello hello = (Hello) factory.create(srvcModel,helloWorldURL);

System.out.println(hello.sayHello("caohuili:"));

【2. 動態模式】

動態模式不需要服務端的 class ,不過性能和複雜對象映射等估計做得不會太好。
Client client = new Client(new URL("http://localhost:8080/webservice/services/Hello?wsdl "));
Object[] results = client.invoke("sayHello", new Object[] { "Cao," });
System.out.println((String) results[0]);

【3.根據 WSDL 生成 Client Stub】
 // 簡單參數的
HelloClient client=new HelloClient();

HelloPortType port =client.getHelloHttpPort();

System.out.println(port.sayHello("hi!"));

// 參數複雜的
MemberServiceClient client = new MemberServiceClient();

MemberService memberService = client.getMemberServiceHttpPort();

User user = new User();

/*JAXBElement<String> name = new JAXBElement<String>(new QName("http://memberService ", "username"), String.class, "smallnest");

JAXBElement<String> password = new JAXBElement<String>(new QName("http://memberService ", "password"), String.class, "123456");*/

ObjectFactory bjFac=new ObjectFactory();

JAXBElement<String> name = objFac.createUserUsername("smallnest");
JAXBElement<String> password = objFac.createUserPassword("123456");

user.setUsername(name);
user.setPassword(password);

Member neMember = new Member();

JAXBElement<String> memeberName = new JAXBElement<String>(new QName("http://memberService ", "name"), String.class, " 邁克 ");

JAXBElement<String> email = new JAXBElement<String>(new QName("http://memberService ", "email"), String.class,"[email protected] ");

oneMember.setName(memeberName);
oneMember.setEmail(email);
oneMember.setRank(6);

// 調用方法
memberService.addMember(oneMember, user);

那我們就完成自己的客戶端 ,很簡單,還是用 eclipse 新建立一個工程,並根據 wsdl 生成一個 client 。

執行結果 :

[b]1.3 數組類型通訊[/b]

對於基本類型的數組,不用在 aegis.xml 文件中映射配置,生成客戶端時,會生成 ArrayOfString 的映射類型接收數據。如果是自己定義的複雜對象,就需要在 aegis.xml 文件中配置對象映射,這時 client 會根據 wsdl 生成對應的 ArroyOfxxx 對象 。

首先生成服務類 。

from:http://blog.csdn.net/yaba213/archive/2010/11/19/6021695.aspx
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章