本文所用到的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]);
- }
- }
第二種方式:通過服務端提供的端口來創建客戶端
- 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服務端提供的接口來創建客戶端
- * @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;
- 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);
- }
- /**
- * 第二種方式創建的客戶端,要用到的兩個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是我自己創建的,并非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文件
- <?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的內容,附加上
- <?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>