?
本文所用到的WebServices服务端,取自我的上一篇文章中的例子——使用XFire开发WebServices服务端? 这里并未涉及到JSR?181?Annotations?的相关应用,具体的三种方式如下 ①?通过WSDL地址来创建动态客户端? ②?通过服务端提供的接口来创建客户端? ③?使用Ant通过WSDL文件来生成客户端
第一种方式:通过WSDL地址来创建动态客户端
- package?com.jadyer.client;??
- import?java.net.MalformedURLException;??
- import?java.net.URL;??
- import?org.codehaus.xfire.client.Client;??
- /**?
- ?*?通过WSDL来创建动态客户端?
- ?*?@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]);??
- ????}??
- }??
第二种方式:通过服务端提供的端口来创建客户端
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服务端提供的接口来创建客户端?
?*?@see?客户端必须提供一个与服务端完全一致的接口,包名也要一致?
?*?@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接口创建一个服务模型serviceModel??
????????//serviceModel包含服务的说明,换句话说,就是服务的元数据??
????????//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源码发现??
????????//下面两行代码与这里直接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,使用服务模型serviceModel和服务端点URL(用来获得WSDL)??
????????//得到一个服务的本地代理,这个代理就是实际的客户端??
????????HelloService?client?=?(HelloService)factory.create(serviceModel,?serviceURL);??
????????/**?
?????????*?Invoke?the?service?
?????????*?@see?调用服务的本地代理(即实际的客户端)中的方法,便得到我们需要的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类
?*?Web服务提供给客户端的接口?
?*?@see?这是第二种方式创建的客户端,要用到的接口?
package?com.jadyer.server;??
import?java.util.List;??
public?interface?HelloService?{??
????public?String?sayHello(String?name);??
????public?Person?getPerson(User?u);??
????public?List<Person>?getPersonList(Integer?age,?String?name);??
}??
?*?第二种方式创建的客户端,要用到的两个POJO类?
package?com.jadyer.model;??
public?class?User?{??
????private?String?name;??
????/*--getter和setter略--*/??
package?com.jadyer.model;??
public?class?Person?{??
????private?Integer?age;??
}??
第三种方式:使用Ant通过WSDL文件来生成客户端
?*?使用Ant通过WSDL生成客户端?
?*?@see?这里的ClientFromAnt.java是我自己创建的,并非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?关于MyFirstXFireServer.wsdl文件,是我在WebServices服务启动后?
?*?@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>??
也可以使用下面的这个Ant文件
<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"/>??
????<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的内容,附加上
<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: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>
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|