在 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