Web Service之Axis2(一)

  注:目前LZ写的WerService都是比较简单的原理和使用,以后等LZ有能力了,就会写些深入的内容。

  Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。

  是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。

    

  

  实现一个完整的Web服务包括以下步骤:

  ◆ Web服务提供者设计实现Web服务,并将调试正确后的Web服务通过Web服务中介者发布,并在UDDI注册中心注册; (发布)

  ◆ Web服务请求者向Web服务中介者请求特定的服务,中介者根据请求查询UDDI注册中心,为请求者寻找满足请求的服务; (发现)

  ◆ Web服务中介者向Web服务请求者返回满足条件的Web服务描述信息,该描述信息用WSDL写成,各种支持Web服务的机器都能阅读;(发现)

  ◆ 利用从Web服务中介者返回的描述信息生成相应的SOAP消息,发送给Web服务提供者,以实现Web服务的调用;(绑定)

  ◆ Web服务提供者按SOAP消息执行相应的Web服务,并将服务结果返回给Web服务请求者。(绑定)

  WebService一共有四种:CXF方式、Xfire方式、AXIS2方式、AXIS1方式

  这里介绍AXIS2方式,其他方式见Web Service另外篇章。

  

  Axis2:

    Axis2的安装,官方文档说,axis2需要java5以上的不小于11M的磁盘空间。现在安装一下axis2

        1:下载axis2的war包:http://www.apache.org/dist//axis/axis2/java/core/1.7.4/

    2:解压所下载的war包到tomcat的webapps目录下

    3:启动tomcat。在webapps目录下会生成axis2文件夹和相关文件。访问localhost:8080/axis2就能看到axis2运行成功的页面。

     

    

  安装好后,来写一个Demo进行webService开发:

  1:首先创建一个Maven项目wsDemo。

  2:将Tomcat下的webapps/axis2/WEB-INF下的modules、services、lib(只需要jar包)和conf文件拷到wsDemo的WEB-INF下,然后将lib中的jar包build path一下(具体就不介绍了,网上很多),

       当然其实Maven可以直接在pom.xml中添加更方便,效果一样。最后在services文件下新建一个wsDemo/META-INF目录,下面新建services.xml,然后配置下web.xml。

           

  

  <!-- 加载Axis2 -->  
    <servlet>  
        <servlet-name>AxisServlet</servlet-name>  
        <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>  
        <load-on-startup>1</load-on-startup>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>AxisServlet</servlet-name>  
        <url-pattern>/services/*</url-pattern>  
    </servlet-mapping>  

   3:完成上面基础步骤之后,我们新建一个WsMethod类,里面有一些方法:

package com.ws.model;


public class WsMethod {
    public String getMethodByParam(String name) {  
        return "Method Name Is:" + name + ".";  
    }  
    public String getMethod() {  
        return "Method Name Is:getMethod.";  
    }  
    public void NoReturnMethod(){
        System.out.println("NO Return Method");
    }
}

  4:在services.xml中进行配置

<!-- name:指定服务名称,注意,这里的名称到时候和访问名称后面的是一样的 -->
<service name="WsMethodService">  
    <!-- 服务描述 -->  
    <description>    
        WsMethod Service Example  
    </description>
    
    <!-- 服务级参数 --> 
    <!-- 在services.xml文件中,我们可以直接在service节点下定义参数,这些
        参数供消息上下文(在运行时)、AxisService或AxisOperation访问。
        参数有一个必选参数和可选参数:参数名称是必选参数,这里的服务参数为指定的服务类。
     -->   
    <parameter name="ServiceClass">    
        com.ws.model.WsMethod  
    </parameter>    
    
    <!-- 服务级消息接收器
        Axis2中消息接收器是特殊的处理器,是In路径(请求路径)中的最后一个处理器。Web服务中的每个操作都有他自己的消息接收器,而且不同的操作可以有不同的消息接收器。
        消息接收器是依赖于消息交换模式的,所以我们必须为不同的消息交换模式指定不同的消息接收器。
        怎样才能给所有的操作指定相同的消息接收器呢?只要添加服务级消息接收器即可。如此我们就不必在操作级别指定消息接收器了。我们要做的是指定服务级消息接收器。而在部署时,
        Axis2会自动给操作选择正确的消息接收器。这里我们指定Operation级消息接收器。前文描述了如何指定服务级消息接收器,但是,我们也可以为不同的操作指定不同的消息接收器,
        这需要在operation中指定messageReceiver标签。
        
        最后说明一个编写用于部署服务组的services文件的问题,要在单个服务包文件中部署多个服务,服务组是一个便捷方法,当然,这些服务之间应该存在逻辑关系。
        用于服务组的services,xml文件和用于单个文件服务的,它们之间唯一的区别就是根元素,用于服务组的,根元素
        是serviceGroup,我们可以在serviceGroup中定义多个service
        <serviceGroup>
            <service name=service1>
                ......
            <service>
            <service name=service2>
                ..........
            </service>
        </serviceGroup>
     -->
    <operation name="getMethodByParam">    
        <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />    
    </operation>    
    <operation name="getMethod">   
        <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />     
    </operation>    
    <operation name="NoReturnMethod">   
    <!-- 这里要注意,当没有返回值时才用   
        org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver,没有参数还是用RPCMessageReceiver-->  
        <messageReceiver class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />     
    </operation>   
    
    <!-- 启动Tomcat后访问
        http://127.0.0.1/wsDemo/services/WsMethodService?wsdl
        得到了一个wsdl文件
     -->
    
</service> 

  启动Tomcat后访问

             http://127.0.0.1/wsDemo/services/WsMethodService?wsdl

  可以得到一个wsdl文件

    

    5:新建一个测试类WsTest来进行测试 

package com.ws.test;

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 WsTest {
    
    public static void main(String[] args) {
        String url = "http://127.0.0.1/wsDemo/services/WsMethodService";
        String result = null;
        
        try {
            //使用RPC方式调用WebService
            RPCServiceClient serviceClient = new RPCServiceClient();
            Options options = serviceClient.getOptions();
            
            //指定调用的WebService的URL
            EndpointReference targetEPR = new EndpointReference(url);
            options.setTo(targetEPR);
            
            //在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间,
            //也就是 <wsdl:definitions>元素的targetNamespace属性值:http://model.ws.com
            //指定要调用的getWorld方法以及WSDL文件的命名空间...
            QName opAddEntry = new QName("http://model.ws.com", "getMethodByParam");
            
            //指定getMethodByParam方法的参数值,如果有多个。继续往后增加即可,不用指定参数名称
            Object[] opAddEntryArgs = new Object[]{"MethodA"};
            
            //返回参数类似,这个和axis1有点区别
            //invokeBlocking方法有三个参数,其中第一个参数的类型是QName对象,表示要调用的方法名
            //第二个参数表示要调用的WebService方法的参数值,参数类型是Object[]
            //丢三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[]
            //如果方法没有参数时,invokeBlocking方法的第二个参数值不能为null,而是new Object[]{}
            //如果被调用的WebService方法没有返回值,则使用RPCServiceClient类的invokeRobust方法
            //该方法只有两个参数,参数含义和invokeBlocking方法的前两个参数含义相同
            //指定getMethodByParam方法返回值的数据类型的Class对象
            Class[] classes = new Class[]{String.class};
            
            //调用getMethodByParam方法并输出该方法的返回值
            result = (String)serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0];
            System.out.println(result);
            
            //下面是调用getMethod方法的代码,这些代码与调用getMethodByParam方法的代码类似
            opAddEntry = new QName("http://model.ws.com", "getMethod");
            opAddEntryArgs = new Object[] {};  
            System.out.println(
                    serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0]
            );
            
            // 下面是调用NoReturnMethod方法的代码  
            opAddEntry = new QName("http://model.ws.com", "NoReturnMethod");  
            serviceClient.invokeRobust(opAddEntry, new Object[] {});  
            
        } catch (AxisFault e) {
            e.printStackTrace();
        }
        
    }
    
}

运行结果:

Tomcat下运行结果:

  参考资料:http://blog.csdn.net/csh624366188/article/details/8362696

作者:哀&RT
出处:博客园哀&RT的技术博客--http://www.cnblogs.com/Tony-Anne/
您的支持是对博主最大的鼓励,感谢您的认真阅读。
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/Tony-Anne/p/6418757.html