zoukankan      html  css  js  c++  java
  • 使用axis2进行webservice发布与调用

     一、介绍下cxf、axis、axis2区别

            新一代的Web Services 框架如Axis2、CXF 都是由现有的项目中逐渐演化而来的,Axis2 是由大家熟悉的Axis 1.x 系列演化过来,而Apache CXF 则是由Celtix和 XFire 项目整合而生,并且刚刚发布了2.0.2 的最新版本,不过仍是Apache 的一个孵化项目。
            Axis2 是对Axis 进行了彻底的重写的一个新项目了,它使用了新的模块化架构,更方便于功能性的扩展等等。
            Apache CXF 则是由XFire和 Celtix 两个现有的项目进行了重组。
    问题:如果现有的应用程序是基于Axis 1.x、XFire或者 Celtix 的话,那应该怎么办?都迁移到这些新的框架上去吗?但是即使是要迁移,那应该迁移到哪个框架上去呢?
            如果是编写一个新的Web Services 应用程序的话,就不存在迁移的问题了,但是哪个框架是你应当选择进行使用的呢?哪个比哪个更好呢?
            对于现在的应用程序的迁移,如果你的应用程序是稳定成熟的,并且在可预知的未来的情况下,只要很少的一些需求变更要做的话,那么保存你的体力,不要去做“劳民伤财“的迁移工作了。
    如果你的现有应用程序BUG缠身,性能,功能等等都一片糟糕的话,那就要考虑迁移了,那选哪个框架呢?先比较一下它们的不同之处:
        1、Apache CXF 支持WS-Addressing、WS-Policy、WS-RM、WS-Security和WS-I BasicProfile
        2、Axis2 支持WS-Addressing、WS-RM、WS-Security和WS-I BasicProfile,WS-Policy将在新版本里得到支持
        3、Apache CXF 是根据Spring哲学来进行编写的,即可以无缝地与Spring进行整合
        4、Axis2 不是
        5、Axis2 支持更多的data bindings,包括XMLBeans、JiBX、JaxMe和 JaxBRI,以及它原生的data binding(ADB)。
        6、Apache CXF 目前仅支持JAXB 和Aegis,并且默认是JAXB 2.0,与XFire默认是支持 Aegis不同,XMLBeans、JiBX和 Castor将在 CXF2.1 版本中得到支持,目前版本是 2.0.2
        7、Axis2 支持多种语言,它有C/C++ 版本。
        8、Apache CXF 提供方便的Spring整合方法,可以通过注解、Spring标签式配置来暴露Web Services和消费Web Services
    如何抉择:
           1、如果应用程序需要多语言的支持,Axis2 应当是首选了;
           2、如果应用程序是遵循Spring 哲学路线的话,Apache CXF 是一种更好的选择,特别对嵌入式的Web Services 来说;
           3、如果应用程序没有新的特性需要的话,就仍是用原来项目所用的框架,比如Axis1,XFire,Celtrix或 BEA等等厂家自己的 WebServices 实现,就别劳民伤财了

    二、eclipse插件下载 

    2.1、打开下载地址

    http://axis.apache.org/axis2/java/core/download.cgi

    2.2 下载对应的版本

    2.3、解压插件,解压后得到两个文件夹:axis2-eclipse-codegen-plugin-1.7.8和axis2-eclipse-service-plugin-1.7.8,拷贝至eclipseplugins

     2.4、重新启动Eclipse,如在File->New->Other中有Axis2 Wizards,说明插件安装成功。

    三、Axis2服务发布与调用

    3.1、建一个webservice-provider的web工程,新增一个HelloService服务

    public class HelloService {
        public String sayHello(){
            return "Hello World";
        }
        
        public String sayHelloToPerson(String name){
            if(name==null||name.equals("")){
                name="nobody";
            }
            return "Hello " + name;
        }
    }

    3.2 右击HelloService如图所示,生成具体的webservice服务

    3.3 右击HelloService.java---Web Services---Create Web service.依次点击下一步……finish,此时发现WebContent目录下生成一个wsdl目录,目录下有一个HelloService.wsdl

    3.4测试 web service :右击HelloService.wsdl---Web Services---Test with Web Services Explorer---点击方法名sayHelloToPerson----输入参数XXX---点go.此时会发现控制台输出Hello,XXX,说明 测试成功,WebService没有问题

     

    注意如果不行的话,把wsdl删了,重新建一个。然后注意要在tomcat启动,否则服务发布不了

    3.5 WebService服务调用,写一个测试类

    import java.rmi.RemoteException;
    import javax.xml.rpc.ParameterMode;
    import javax.xml.rpc.ServiceException;
    import org.apache.axis.client.Call;
    import org.apache.axis.client.Service;
    import org.apache.axis.encoding.XMLType;
    
    public class HelloServiceTest {
         public String invokeRemoteFuc() {
                // 远程调用路径
                String endpoint = "http://localhost:8855/webservice-provider/services/HelloService";
                //webservice的访问地址,这里是封装成了一个工具方法,根据文件名以及键来获取写在properties文件里的访问地址
            //    String endpoint = UtilProperties.getValueByKeyViaProp("myendpointAddress", "ws.properties");
                //预定义失败的默认返回值
                String result = "call failed!";
                //步骤1 构建 org.apache.axis.client.Service 对象
                Service service = new Service();
                Call call;
                try {
                    // 步骤2:通过org.apache.axis.client.Service对象创建一个Call,需要强转为 org.apache.axis.client.Call类型
                    call = (Call) service.createCall();
                    // 步骤3:设置目标地址,即需要访问的webservice地址
                    call.setTargetEndpointAddress(endpoint);
                    // 步骤4:设置调用的方法名
                    call.setOperationName("sayHelloToPerson");
    
                    // 步骤5: 设置参数名
                    call.addParameter("name", // 参数名
                            XMLType.XSD_STRING, // 参数类型:String
                            ParameterMode.IN); // 参数模式:'IN' or 'OUT'
    
                    // 步骤6:设置返回值类型
                    call.setReturnType(XMLType.XSD_STRING); // 返回值类型:String
                    String name = "我是测试员";
                    //步骤7 :调用call.invoke(Object[] obj)方法
                    result = (String) call.invoke(new Object[] { name });// 远程调用
                } catch (ServiceException e) {
                    e.printStackTrace();
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
    
                return result;
            }
    
            // 测试
            public static void main(String[] args) {
                HelloServiceTest test = new HelloServiceTest();
                String result = test.invokeRemoteFuc();
                System.out.println(result);
            }
    }

    3.6、讲项目跑起来,测试:HelloWorldTest ---Run as---Java application,如果发现控制台正确输出Hello 我是测试员,说明测试成功

  • 相关阅读:
    关于DISCUZ!NT发布的问题整理!
    javascript 文字滚动显示[zhuan ]
    Bot Framework Emulator应用与调试
    Bot Framework的简单实现
    命名空间在扩展方法中的妙用
    Error:Execution failed for task ':app:transformClassesWithDexForDebug"
    C#中WebApi接口传参不再困惑:传参详解
    贝塞尔曲线
    从枚举值获取对应的文本描述
    常用正则表达式收集
  • 原文地址:https://www.cnblogs.com/shawWey/p/9660591.html
Copyright © 2011-2022 走看看