axis2

下载axis2-1.5.4-bin.zip文件并解压。

设置axis2的环境变量,如下图所示:axis2通过wsdl生成客户端程序并本地调用

利用axis2中的wsdl2java.bat生成客户端程序。

先启动Tomcat7并在IE里运行http://localhost:8081/TestAxis2Ws/services/HelloService?wsdl 看看服务端是否正常解析。

%AXIS2_HOME%inwsdl2java -uri http://localhost:8081/TestAxis2Ws/services/HelloService?wsdl -paxis2.service.server -o stub

其中-uri参数指定了wsdl文件的路径,可以是本地路径,也可以是网络路径。-p参数指定了生成的Java类的包名,-o参数指定了生成的一系列文件保存的根目录。在执行完上面的命令后,读者就会发现在当前目录下多了个stub目录,可以找到一个HelloServiceStub.java文件,该文件复杂调用WebService,读者可以在程序中直接使用这个类。
运行-->cmd-->具体命令如下:

要先进入axis2的bin目录然后运行wsdl2java.bat

Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

C:Documents and SettingsJambhala>d:

D:>cd D:WebServiceAxisaxis2axis2-1.5.4-binaxis2-1.5.4in

D:WebServiceAxisaxis2axis2-1.5.4-binaxis2-1.5.4in>wsdl2java -uri http://l
ocalhost:8081/TestAxis2Ws/services/HelloService?wsdl -p axis2.service.server -o
stub
Using AXIS2_HOME:   D:WebServiceAxisaxis2axis2-1.5.4-binaxis2-1.5.4
Using JAVA_HOME:    C:Javajdk1.6.0
Retrieving document at 'http://localhost:8081/TestAxis2Ws/services/HelloService?
wsdl'.
D:WebServiceAxisaxis2axis2-1.5.4-binaxis2-1.5.4in>
这时到axis2的bin目录下会发现出现了一个stub目录,如下图所示:axis2通过wsdl生成客户端程序并本地调用

axis2通过wsdl生成客户端程序并本地调用

axis2通过wsdl生成客户端程序并本地调用

其中HelloServiceStub.java是客户端程序,HelloServiceCallbackHandler.java是异步客户端程序。

把这两个类复制到上次已经建立好的服务端工程里,如下图所示:

要参考上一次写的MyEclipse整合Axis2插件的文章(http://shihuan830619.iteye.com/blog/1136607)

axis2通过wsdl生成客户端程序并本地调用

注意:这个地方复制进来后会报错的,因为在D:WebServiceAxisaxis2axis2-1.5.4-binaxis2-1.5.4instubsrcaxis2serviceserver下的类路径为package axis2.service.server;需要改成packageaxis2.service.client;并且需要把HelloServiceStub.java和HelloServiceCallbackHandler.java相关的报错位置都把路径改一下,不要闲烦,要改的地方还满多的呢。

创建带main方法的StubClient.java类文件,代码如下:

package axis2.service.domain;

import java.rmi.RemoteException;

import org.apache.axis2.AxisFault;

import axis2.service.client.HelloServiceStub;

public class StubClient {

 
 public static void main(String[] args) {
  HelloServiceStub stub = null;
  try {
   stub = new HelloServiceStub();
   HelloServiceStub.SayHello sh = new HelloServiceStub.SayHello();
   sh.setName("于士博");
   System.out.println(stub.sayHello(sh).get_return());
  } catch (AxisFault e) {
   e.printStackTrace();
  } catch (RemoteException e) {
   e.printStackTrace();
  }
 }

}

运行后会看到如下结果:

log4j:WARN No appenders could be found for logger (org.apache.axis2.description.AxisService).
log4j:WARN Please initialize the log4j system properly.
Hello, 于士博!

解释:

上面的代码大大简化了调用WebService的步骤,并使代码更加简洁。但要注意的是,wsdl2java.bat命令生成的Stub类将WebService方法的参数都封装在了相应的类中,类名(SayHello)为方法名,例如,sayHello方法的参数都封装在了SayHello类中,要想调用sayHello方法,必须先创建SayHello类的对象实例。

--------------------------------------------------------------------------------------------------

下面介绍纯手动编写Java代码客户端程序:

package axis2.service.domain;

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 HelloClient {

 
 public static void main(String[] args) {
  
  //使用RPC方式调用WebService 

  RPCServiceClient serviceClient = null;
  try {
         serviceClient = new RPCServiceClient();
         Options options = serviceClient.getOptions();
         //指定调用WebService的URL
         EndpointReference targetEPR = newEndpointReference("http://localhost:8081/TestAxis2Ws/services/HelloService");
         options.setTo(targetEPR);
         //指定sayHello方法的参数值
         Object[] opAddEntryArgs = new Object[] {"于士博"};
         //指定sayHello方法返回值的数据类型的Class对象
         Class[] classes = new Class[] {String.class};
         //指定要调用的sayHello方法及WSDL文件的命名空间
         QName opAddEntry = new QName("http://server.service.axis2", "sayHello");
         //调用sayHello方法并输出该方法的返回值

         String result = serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)

                         [0].toString();

         serviceClient.cleanupTransport();  //为了防止连接超时
         System.out.println(result);
         //System.out.println(serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)

           [0]);
  } catch (AxisFault e) {
   e.printStackTrace();
  }
  
 }

}

【注】:在本例中使用了RPCServiceClient类的invokeBlocking方法调用了WebService中的方法。

        invokeBlocking方法有三个参数,其中第一个参数的类型是QName对象,表示要调用的方法名;第二个

        参数表示要调用的WebService方法的参数值,参数类型为Object[];第三个参数表示WebService方法的

        返回值类型的Class对象,参数类型为Class[]。

        当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}

        如果被调用的WebService方法没有返回值,应使用RPCServiceClient类的invokeRobust方法,该方法只

        有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同。

        在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,也就是

        <wsdl:definitions>元素的targetNamespace属性值。

原文地址:https://www.cnblogs.com/guoyuqiangf8/p/3938611.html