這里并未涉及到JSR 181 Annotations 的相關(guān)應(yīng)用,具體的三種方式如下
① 通過WSDL地址來創(chuàng)建動態(tài)客戶端
② 通過服務(wù)端提供的接口來創(chuàng)建客戶端
③ 使用Ant通過WSDL文件來生成客戶端
第一種方式:通過WSDL地址來創(chuàng)建動態(tài)客戶端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package com.jadyer.client; import java.net.MalformedURLException; import java.net.URL; import org.codehaus.xfire.client.Client; /** * 通過WSDL來創(chuàng)建動態(tài)客戶端 * @see 此時需要在項目中引入XFire 1.2 Core Libraries和XFire 1.2 HTTP Client Libraries */ public class ClientFromWSDL { public static void main(String[] args) throws MalformedURLException, Exception { Client client = new Client( new URL( "http://127.0.0.1:8080/XFire_demo/services/XFireServer?wsdl" )); Object[] results11 = client.invoke( "sayHello" , new Object[]{ "Jadyer22" }); System.out.println(results11[ 0 ]); } } |
第二種方式:通過服務(wù)端提供的端口來創(chuàng)建客戶端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
package com.jadyer.client; import java.net.MalformedURLException; import java.util.List; import org.codehaus.xfire.client.XFireProxyFactory; import org.codehaus.xfire.service.Service; import org.codehaus.xfire.service.binding.ObjectServiceFactory; import com.jadyer.model.Person; import com.jadyer.model.User; import com.jadyer.server.HelloService; /** * 通過Web服務(wù)端提供的接口來創(chuàng)建客戶端 * @see 客戶端必須提供一個與服務(wù)端完全一致的接口,包名也要一致 * @see 在本例中,需要在客戶端(即該項目)中提供HelloService.java接口,以及Person和User兩個POJO類 * @see 并且此時需要在項目中引入XFire 1.2 Core Libraries和XFire 1.2 HTTP Client Libraries */ public class ClientFromInterface { public static void main(String[] args) throws MalformedURLException{ //首先使用XFire的ObjectServiceFactory從HelloService接口創(chuàng)建一個服務(wù)模型serviceModel //serviceModel包含服務(wù)的說明,換句話說,就是服務(wù)的元數(shù)據(jù) //Create a metadata of the service Service serviceModel = new ObjectServiceFactory().create(HelloService. class ); //訪問的地址 String serviceURL = "http://127.0.0.1:8080/XFire_demo/services/XFireServer" ; //通過查看org.codehaus.xfire.client.XFireProxyFactory源碼發(fā)現(xiàn) //下面兩行代碼與這里直接new XFireProxyFactory()的作用是等效的 //XFire xfire = XFireFactory.newInstance().getXFire(); //XFireProxyFactory factory = new XFireProxyFactory(xfire); //為XFire獲得一個代理工廠對象 //Create a proxy for the deployed service XFireProxyFactory factory = new XFireProxyFactory(); //通過proxyFactory,使用服務(wù)模型serviceModel和服務(wù)端點URL(用來獲得WSDL) //得到一個服務(wù)的本地代理,這個代理就是實際的客戶端 HelloService client = (HelloService)factory.create(serviceModel, serviceURL); /** * Invoke the service * @see 調(diào)用服務(wù)的本地代理(即實際的客戶端)中的方法,便得到我們需要的WebServcie */ /*--處理簡單對象--*/ String serviceResponse = client.sayHello("Jadyer11"); System.out.println(serviceResponse); /*--處理對象--*/ User u = new User(); u.setName("Jadyer99"); Person pp = client.getPerson(u); System.out.println(pp.getName()); /*--處理List--*/ List<Person> personList = client.getPersonList( 24 , "Jadyer88" ); for (Person p : personList){ System.out.println(p.getName()); } } } |
這是它要用到的接口和兩個POJO類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
/** * Web服務(wù)提供給客戶端的接口 * @see 這是第二種方式創(chuàng)建的客戶端,要用到的接口 */ package com.jadyer.server; import java.util.List; import com.jadyer.model.Person; import com.jadyer.model.User; public interface HelloService { public String sayHello(String name); public Person getPerson(User u); public List<Person> getPersonList(Integer age, String name); } /** * 第二種方式創(chuàng)建的客戶端,要用到的兩個POJO類 */ package com.jadyer.model; public class User { private String name; /*--getter和setter略--*/ } package com.jadyer.model; public class Person { private Integer age; private String name; /*--getter和setter略--*/ } |
第三種方式:使用Ant通過WSDL文件來生成客戶端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package com.jadyer.client; /** * 使用Ant通過WSDL生成客戶端 * @see 這里的ClientFromAnt.java是我自己創(chuàng)建的,并非Ant生成 * @see 這里要用到的JAR有:xfire-all-1.2.6.jar以及//xfire-distribution-1.2.6//lib//目錄中的所有JAR包 * @see 我們需要把這些JAR包都拷貝到Web Project//WebRoot//WEB-INF//lib//目錄中 * @see 然后把build.xml和MyFirstXFireServer.wsdl都拷貝到下Web Project的根目錄下即可 * @see 關(guān)于MyFirstXFireServer.wsdl文件,是我在WebServices服務(wù)啟動后 * @see 訪問http://127.0.0.1:8080/XFire_demo/services/XFireServer?wsdl然后將其另存得到的 */ public class ClientFromAnt { public static void main(String[] args) { XFireServerClient client = new XFireServerClient(); //String url = "http://127.0.0.1:8080/XFire_demo/services/XFireServer"; //String result = client.getXFireServerHttpPort(url).sayHello("Jadyer33"); //上面的兩行代碼,與下面的這一行代碼,同效~~ String result = client.getXFireServerHttpPort().sayHello( "Jadyer33" ); System.out.println(result); } } |
用到的Ant文件,如下
1
2
3
4
5
6
7
8
9
10
11
12
|
<? xml version = "1.0" encoding = "UTF-8" ?> < project name = "wsgen" default = "wsgen" basedir = "." > < path id = "classpathId" > < fileset dir = "./WebRoot/WEB-INF/lib" > < include name = "*.jar" /> </ fileset > </ path > < taskdef classpathref = "classpathId" name = "wsgen" classname = "org.codehaus.xfire.gen.WsGenTask" /> < target name = "wsgen" description = "generate client" > < wsgen outputDirectory = "./src/" wsdl = "MyFirstXFireServer.wsdl" binding = "xmlbeans" package = "com.jadyer.client" overwrite = "true" /> </ target > </ project > |
也可以使用下面的這個Ant文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<? xml version = "1.0" encoding = "UTF-8" ?> < project name = "xfireAnt" basedir = "." default = "createClientCode" > < property name = "xfirelib" value = "${basedir}/WebRoot/WEB-INF/lib" /> < property name = "sources" value = "${basedir}/src" /> < path id = "classpath" > < fileset dir = "${xfirelib}" > < include name = "*.jar" /> </ fileset > </ path > < target name = "createClientCode" > < taskdef name = "wsgen" classname = "org.codehaus.xfire.gen.WsGenTask" classpathref = "classpath" /> < wsgen outputDirectory = "${sources}" wsdl = "http://127.0.0.1:8080/XFire_demo/services/XFireServer?wsdl" package = "com.jadyer.client" overwrite = "true" /> </ target > </ project > |
最后我再把MyFirstXFireServer.wsdl的內(nèi)容,附加上
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
<? xml version = "1.0" encoding = "UTF-8" ?> < wsdl:definitions targetNamespace = "http://www.jadyer.com/XFireDemo" xmlns:tns = "http://www.jadyer.com/XFireDemo" xmlns:wsdlsoap = "http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12 = "http://www.w3.org/2003/05/soap-envelope" xmlns:xsd = "http://www.w3.org/2001/XMLSchema" xmlns:soapenc11 = "http://schemas.xmlsoap.org/soap/encoding/" xmlns:soapenc12 = "http://www.w3.org/2003/05/soap-encoding" xmlns:soap11 = "http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl = "http://schemas.xmlsoap.org/wsdl/" > < wsdl:types > < xsd:schema xmlns:xsd = "http://www.w3.org/2001/XMLSchema" attributeFormDefault = "qualified" elementFormDefault = "qualified" targetNamespace = "http://www.jadyer.com/XFireDemo" > < xsd:element name = "sayHello" > < xsd:complexType > < xsd:sequence > < xsd:element maxOccurs = "1" minOccurs = "1" name = "in0" nillable = "true" type = "xsd:string" /> </ xsd:sequence > </ xsd:complexType > </ xsd:element > < xsd:element name = "sayHelloResponse" > < xsd:complexType > < xsd:sequence > < xsd:element maxOccurs = "1" minOccurs = "1" name = "out" nillable = "true" type = "xsd:string" /> </ xsd:sequence > </ xsd:complexType > </ xsd:element > </ xsd:schema > </ wsdl:types > < wsdl:message name = "sayHelloRequest" > < wsdl:part name = "parameters" element = "tns:sayHello" ></ wsdl:part > </ wsdl:message > < wsdl:message name = "sayHelloResponse" > < wsdl:part name = "parameters" element = "tns:sayHelloResponse" ></ wsdl:part > </ wsdl:message > < wsdl:portType name = "XFireServerPortType" > < wsdl:operation name = "sayHello" > < wsdl:input name = "sayHelloRequest" message = "tns:sayHelloRequest" > </ wsdl:input > < wsdl:output name = "sayHelloResponse" message = "tns:sayHelloResponse" > </ wsdl:output > </ wsdl:operation > </ wsdl:portType > < wsdl:binding name = "XFireServerHttpBinding" type = "tns:XFireServerPortType" > < wsdlsoap:binding style = "document" mce_style = "document" transport = "http://schemas.xmlsoap.org/soap/http" /> < wsdl:operation name = "sayHello" > < wsdlsoap:operation soapAction = "" /> < wsdl:input name = "sayHelloRequest" > < wsdlsoap:body use = "literal" /> </ wsdl:input > < wsdl:output name = "sayHelloResponse" > < wsdlsoap:body use = "literal" /> </ wsdl:output > </ wsdl:operation > </ wsdl:binding > < wsdl:service name = "XFireServer" > < wsdl:port name = "XFireServerHttpPort" binding = "tns:XFireServerHttpBinding" > < wsdlsoap:address location = "http://127.0.0.1:8080/XFire_demo/services/XFireServer" /> </ wsdl:port > </ wsdl:service > </ wsdl:definitions > |
第四種方法
這種方法用到了spring的jar包,是前幾天在找XFire+Spring的資料的時候看到的,在這里也是做個記錄。同樣的,這種方法和上面所提到的第二種方法在客戶端都需要與服務(wù)器一樣的接口,包名也必須一樣。
(1)在src目錄下新建client.xml(名字并非特定)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<? xml version = "1.0" encoding = "UTF-8" ?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> < beans > < bean id = "baseService" class = "org.codehaus.xfire.spring.remoting.XFireClientFactoryBean" lazy-init = "false" abstract = "true" /> <!-- id的名字作為標(biāo)識,用于客戶端程序中獲取service,若有多個service咋在下面添加多個bean即可--> < bean id = "MathService" parent = "baseService" > < property name = "serviceClass" > < value >service.MathService</ value > </ property > < property name = "wsdlDocumentUrl" > < value >http://localhost:8080/myservice/mathWebService?wsdl</ value > </ property > </ bean > </ beans > |
(2)在程序中調(diào)用服務(wù)代碼非常簡單
1
2
3
|
ApplicationContext ctx = new ClassPathXmlApplicationContext( "client.xml" ); MathService mathService = (MathService)ctx.getBean( "MathService" ); int result = mathService.add( int one, int two); |
第五種辦法
先獲取到wsdl文件,命名為mathWebService.wsdl放在客戶端的src目錄下,接著通過程序訪問該wsdl文件,并調(diào)用需要的方法。
1
2
3
4
5
6
7
8
9
|
String wsdl = "mathWebService.wsdl " ; // 對應(yīng)的WSDL文件 Resource resource = new ClassPathResource(wsdl); Client client = new Client(resource.getInputStream(), null ); // 根據(jù)WSDL創(chuàng)建客戶實例 Object[] objArray = new Object[ 2 ]; objArray[ 0 ] = 2 ; obiArray[ 1 ] = 3 ; // 調(diào)用特定的Web Service方法 Object[] results = client.invoke( " add " , objArray); System.out.println( " result: " + results[ 0 ]); |
對于這幾種方法,第一種方法如果傳遞的參數(shù)為服務(wù)器端的實體對象,這點好像比較麻煩,不知道在客戶端建立和服務(wù)器端相同的實體類行不行,沒有實踐,返回結(jié)果如果是復(fù)雜數(shù)據(jù)類型的話不知道有沒有什么問題,或者如何轉(zhuǎn)換,沒有深入研究。而且我個人覺得方法調(diào)用不是那么直觀。
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持服務(wù)器之家!
原文鏈接:http://www.cnblogs.com/toyz/p/6340269.html