Axis2学习笔记

 

 

 

作者:啊原

 

开发 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.  客户端代码需要引用很多Axis2jar 包,如果读者不太清楚要引用哪个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();

       }

      

    }

 

}


来自EDSE的创作


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值