zoukankan      html  css  js  c++  java
  • 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属性值。

  • 相关阅读:
    The Worm Turns
    Equations
    Snail’s trouble
    WuKong
    Codeforces 369 C Valera and Elections
    POJ 2186 Popular Cows
    Codefroces 366 D Dima and Trap Graph (最短路)
    Codefroces 366 C Dima and Salad(dp)
    Codefroces 374 B Inna and Sequence (树状数组 || 线段树)
    Codeforces 374 C Inna and Dima (DFS)
  • 原文地址:https://www.cnblogs.com/guoyuqiangf8/p/3938611.html
Copyright © 2011-2022 走看看