国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

XFire構(gòu)建web service客戶端的五種方式

2019-11-26 13:11:34
字體:
供稿:網(wǎng)友

這里并未涉及到JSR 181 Annotations 的相關(guān)應(yīng)用,具體的三種方式如下

① 通過WSDL地址來創(chuàng)建動態(tài)客戶端
② 通過服務(wù)端提供的接口來創(chuàng)建客戶端
③ 使用Ant通過WSDL文件來生成客戶端

第一種方式:通過WSDL地址來創(chuàng)建動態(tài)客戶端

package com.jadyer.client; import java.net.MalformedURLException; import java.net.URL; import org.codehaus.xfire.client.Client; /**  * 通過WSDL來創(chuàng)建動態(tài)客戶端  * @see 此時(shí)需要在項(xiàng)目中引入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)建客戶端

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 客戶端必須提供一個(gè)與服務(wù)端完全一致的接口,包名也要一致  * @see 在本例中,需要在客戶端(即該項(xiàng)目)中提供HelloService.java接口,以及Person和User兩個(gè)POJO類  * @see 并且此時(shí)需要在項(xiàng)目中引入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)建一個(gè)服務(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獲得一個(gè)代理工廠對象  //Create a proxy for the deployed service  XFireProxyFactory factory = new XFireProxyFactory();  //通過proxyFactory,使用服務(wù)模型serviceModel和服務(wù)端點(diǎn)URL(用來獲得WSDL)  //得到一個(gè)服務(wù)的本地代理,這個(gè)代理就是實(shí)際的客戶端  HelloService client = (HelloService)factory.create(serviceModel, serviceURL);  /**   * Invoke the service   * @see 調(diào)用服務(wù)的本地代理(即實(shí)際的客戶端)中的方法,便得到我們需要的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());  }  } } 

這是它要用到的接口和兩個(gè)POJO類

/**  * 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)建的客戶端,要用到的兩個(gè)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文件來生成客戶端

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文件,如下

<?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> 

也可以使用下面的這個(gè)Ant文件

<?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)容,附加上

<?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的資料的時(shí)候看到的,在這里也是做個(gè)記錄。同樣的,這種方法和上面所提到的第二種方法在客戶端都需要與服務(wù)器一樣的接口,包名也必須一樣。

(1)在src目錄下新建client.xml(名字并非特定)

<?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,若有多個(gè)service咋在下面添加多個(gè)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ù)代碼非常簡單

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)用需要的方法。

 String wsdl = "mathWebService.wsdl " ; // 對應(yīng)的WSDL文件  Resource resource = new ClassPathResource(wsdl);  Client client = new Client(resource.getInputStream(), null ); // 根據(jù)WSDL創(chuàng)建客戶實(shí)例  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ù)器端的實(shí)體對象,這點(diǎn)好像比較麻煩,不知道在客戶端建立和服務(wù)器端相同的實(shí)體類行不行,沒有實(shí)踐,返回結(jié)果如果是復(fù)雜數(shù)據(jù)類型的話不知道有沒有什么問題,或者如何轉(zhuǎn)換,沒有深入研究。而且我個(gè)人覺得方法調(diào)用不是那么直觀。

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持武林網(wǎng)!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 巴林左旗| 永康市| 铜梁县| 靖州| 深水埗区| 千阳县| 育儿| 塔城市| 齐齐哈尔市| 凌源市| 库尔勒市| 澄城县| 仁怀市| 宾川县| 鸡泽县| 特克斯县| 三门峡市| 巨鹿县| 团风县| 襄垣县| 太白县| 平定县| 许昌市| 清涧县| 鲜城| 呼图壁县| 嘉善县| 洞头县| 泰州市| 巩义市| 龙海市| 仪征市| 瑞安市| 镇江市| 成都市| 南康市| 宁陵县| 长海县| 浦城县| 汽车| 万山特区|