创建的客户端是基于 Axis2创建webservice服务的方式 之 ADB 方式(一) 创建的服务端.
相关wsdl文件需要参考上面创建服务端的文章.
1. 调用wsdl命令创建客户端类
到TestAdb.wsdl所在的resources目录下面,执行下面的命令:
%AXIS2_HOME%\bin\wsdl2java -uri TestAdb.wsdl -p test.adb.clients -d adb -s -o ./clientoutput
-p test.adb.clients 表示将创建的代码放到test.adb.clients包里面
-d adb 表示使用adb的方式绑定
-s 表示创建同步(阻塞方式)代码
-o ./clientoutput 表示创建代码的存放目录
命令执行完毕后,生成文件及其目录结构如下,
可见,生成的java文件,已经按包名组织好了目录结构放到src下了,同时还生成了一个build.xml文件.
wsdl2java工具想的还是很周到的.
上面的命令其实只生成了一个TestAdbStub.java文件.这个文件可以在附件的工程中找到.
下面分析下这个类的结构:
有这个outline图可知,生成的TestAdbStub类首先有几种构造函数,这个TestAdbStub相当于访问webservice服务的通道.
构造函数中有一个比较常用:TestAdbStub(String),这里的String参数就是webservice的服务地址,传递这个地址,就可以构造一个
TestAdbStub对象,通过这个对象可以调用webservice提供的服务.
另外,注意到TestAdbStub对象还提供了两个方法 setName和getName,这个和webservice实现的接口(ITestAdb.Java)方法名称是一致的.
但是,TestAdbStub的方法中返回值和参数类型都不一样.
相关的类型:GetNameResponse,GetName和SetName都是TestAdbStub类中以静态内部类实现的类型.
这里的类型是根据wsdl中的types元素定义的,用来规范服务端和客户端之间传递数据的格式.
(符合soap协议) 参考 Axis2创建webservice服务的方式 之 ADB 方式(二)
拿TestAdbStub的setName方法来说,这个方法没有返回值,有个SetName类型的参数,根据wsdl中的定义,这个SetName定义了一个数据结构,
就相当于一个xml文件的元素,它必须包含一个args0的子元素,作为传递个服务器端setName函数的参数.
于是客户端调用TestAdbStub.setName(SetName)时,相当于发送一个请求,调用服务器端的setName方法,
SetName参数中需要事先调用SetName的public void setArgs0(java.lang.String param)方法,
这样讲将SetName对象传递给服务器端后,服务器端就知道调用setName方法,并且可以得到setName方法需要的参数.
由此可以用下面的代码实现客户端的访问:
package test.adb.clients;
import java.rmi.RemoteException;
public class TestAdbClient
{
private static TestAdbStub stub = null;
public static void setName(String args0) throws RemoteException
{
//相当于创建一个请求
TestAdbStub.SetName req = new TestAdbStub.SetName();
//设置请求参数
req.setArgs0(args0);
//发送请求
stub.setName(req);
}
public static String getName() throws RemoteException
{
String result = "";
//相当于创建一个请求
TestAdbStub.GetName req = new TestAdbStub.GetName();
//发送请求,取得请求的返回值(因为getName有返回值,所以有个GetNameResponse类型)
TestAdbStub.GetNameResponse response = stub.getName(req);
//GetNameResponse 类型取得返回值
result = response.get_return();
return result;
}
public static void main(String[] args)
{
try
{
stub = new TestAdbStub("http://localhost:8080/axis2/services/TestAdb");
System.out.println(getName()); //输出Jack,因为webservice服务类,初始化时name设置为jack
System.err.println("-----------");
setName("Frank");
System.out.println(getName());//输出Frank
}
catch (Exception e)
{
e.printStackTrace();
System.err.println("-----------");
}
}
}
附件的工程,需要将Axis2 1.6.2版本的lib中所有jar包拷贝到webInf的lib里面