作者:啊原
开发 Axis2 的第一步:去 Apache 的关方网站 http://ws.apache.org/axis2/ 下载 axis2-1.4-bin.zip 和 axis2-1.4-war.zip 回来。
第二步:将 axis2-1.4-war.zip 解压到 tomcat 的 webapps 目录下得到一个 Axis2.war 文件,发布 tomcat ,之后会在 tomcat 的下面看到一个 axis2 的文件夹,这个文件夹就是 axis2.war 解压得到的,然后将 axis2.war 文件删除。
第三步:解压 axis2-1.4-bin.zip 文件,将解压得到的文件夹部署到相应的目录下。本例部署在 D 盘跟目录。
第四步:配置环境变量 1. AXIS2_HOME (即: D:/axis2-1.4.1-bin ) , 2.path (即: D:/axis2-1.4.1-bin/bin )
第五步:开发服务器端,写一个要发布 webservice 方法的类 , 如下:
package com;
public class FanServiceWork {
public String SayHello(String uname){
return "Hello " +uname;
}
public int multiplication( int num1, int num2){
return num1*num2;
}
public int div( int num1, int num2){
return num1/num2;
}
}
在工程上建一个 META-INF 文件夹,下面建一个 service.xml 文件,文件的内容如下:
< service name = "Fanservice" >
< description >
This is a my Web Service.
</ description >
< parameter name = "ServiceClass" locked = "false" >
com.FanServiceWork
</ parameter >
< operation name = "SayHello" >
< messageReceiver class = "org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</ operation >
< operation name = "multiplication" >
< messageReceiver class = "org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</ operation >
< operation name = "div" >
< messageReceiver class = "org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</ operation >
</ service >
其中: < service name = "Fanservice" > 为你的 webservice 起一个名称,
< description > 是描述,不是必须的。
< parameter name = "ServiceClass" locked = "false" >
com.FanServiceWork
</ parameter > 指定要发布的类
< operation name = "SayHello" >
< messageReceiver class = "org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</ operation > 指定要发布这个类中的那些方法,这个节点有多个,表示发布多个方法。
第六步:将工程导出为 jar 包,然后将工程的后缀名改为 aar, 本例的工程导出文件是 fankan.aar ,将导出文件发布到 tomcat 的 webapps 目录下的axis2/WEB-INF/services下面。然后输入网址:
http://127.0.0.1:8083/axis2/services/Fanservice?wsdl 查看生产的 wsdl 是否正常。
第七步:手动编写客服端程序调用发布的 webservice, 代码如下:
package client;
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class RunService {
public static void main(String[] args) {
try {
// 使用 RPC 方式调用 WebService
RPCServiceClient rpcClient=new RPCServiceClient();
Options soption=rpcClient.getOptions();
// 指定调用 WebService 的 URL
EndpointReference enpointref=new EndpointReference("http://127.0.0.1:8083/axis2/services/Fanservice");
soption.setTo(enpointref);
//SayHello 的输入参数
Object[] inargs=new Object[]{" 张三 "};
//SayHello 的返回参数类型
Class[] returnclasss=new Class[]{String.class};
// 指定要调用的 SayHello 方法及 WSDL 文件的命名空间
QName qname=new QName("http://com","SayHello");
// 打印调用结果
Object[] helloresult=rpcClient.invokeBlocking(qname,inargs,returnclasss);
for(Object obj : helloresult){
System.out.println(obj);
}
Object[] inargsdiv=new Object[]{5,5};
QName divqname=new QName("http://com","multiplication");
Class[] divrturnclass=new Class[]{int.class,int.class};
Object[] divresult=rpcClient.invokeBlocking(divqname, inargsdiv,divrturnclass);
System.out.println(" 调用 multiplication 方法: "+divresult[0]);
} catch (AxisFault e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
在编写客户端代码时应注意如下几点:
1. 客户端代码需要引用很多Axis2 的jar 包,如果读者不太清楚要引用哪个jar 包,可以在Eclipse 的工程中引用Axis2 发行包的lib 目录中的所有jar 包。
2. 在本例中使用了RPCServiceClient 类的invokeBlocking 方法调用了WebService 中的方法。invokeBlocking 方法有三个参数,其中第一个参数的类型是QName 对象,表示要调用的方法名;第二个参数表示要调用的WebService 方法的参数值,参数类型为Object[] ;第三个参数表示WebService 方法的返回值类型的Class 对象,参数类型为Class[] 。当方法没有参数时,invokeBlocking 方法的第二个参数值不能是null ,而要使用new Object[]{} 。
3. 如果被调用的WebService 方法没有返回值,应使用RPCServiceClient 类的invokeRobust 方法,该方法只有两个参数,它们的含义与invokeBlocking 方法的前两个参数的含义相同。
4. 在创建QName 对象时,QName 类的构造方法的第一个参数表示WSDL 文件的命名空间名,也就是<wsdl:definitions> 元素的targetNamespace 属性值,下面是SimpleService 类生成的WSDL 文件的代码片段:
<? xml version="1.0" encoding="UTF-8" ?>
< wsdl:definitions xmlns:wsdl ="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1 ="http://org.apache.axis2/xsd"
xmlns:ns ="http://ws.apache.org/axis2" xmlns:wsaw ="http://www.w3.org/2006/05/addressing/wsdl"
xmlns:http ="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs ="http://www.w3.org/2001/XMLSchema"
xmlns:mime ="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap ="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soap12 ="http://schemas.xmlsoap.org/wsdl/soap12/"
targetNamespace ="http://ws.apache.org/axis2" >
< wsdl:types >
<!--[if !vml]--> <!--[endif]--> <!--[if !vml]--> <!--[endif]-->
</ wsdl:types >
<!--[if !vml]--> <!--[endif]--> <!--[if !vml]--> <!--[endif]-->
</ wsdl:definitions >
还可以自动生产客服端 , 具体步骤如下:
在控制台将当前位置转到您要生成客服端文件的具体目录下,然后在命令行输入
axis2-1.4.1-bin 的安装路径 + bin/wsdl2java ,这样就可以找到 wsdl2java.bat 文件去执行。本例是
D:/axis2-1.4.1-bin /bin/wsdl2java –uri http://127.0.0.1:8083/axis2/services/Fanservice?wsdl -p sercom -s -o service
-url 是指定具体 wsdl 描述文件的网址, -p 是指定您要生成客服端的包名, -o 指定要生成客服端文件保存的根目录。文件生成后直接将文件考到你的工程即可。
然后编写代码调用自动生成的客服端类:
package client;
import java.rmi.RemoteException;
import org.apache.axis2.AxisFault;
public class AotuClient {
public static void main(String[] args) {
try {
FanserviceStub serviceStub=new FanserviceStub();
FanserviceStub.SayHello say=new FanserviceStub.SayHello();
say.setUname(" 小花猫 ");
String result=serviceStub.SayHello(say).get_return();
System.out.println("SayHello 返回的结果是: "+result);
FanserviceStub.Div div=new FanserviceStub.Div();
div.setNum1(60);
div.setNum2(30);
int resultdiv=serviceStub.div(div).get_return();
System.out.println("60/20 的结果是: "+resultdiv);
} catch (AxisFault e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}