zoukankan      html  css  js  c++  java
  • 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/
    您的支持是对博主最大的鼓励,感谢您的认真阅读。
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    CSS-16-margin值重叠问题
    CSS-15-定位
    CSS-14-浮动
    CSS-13-块级元素和行内元素
    CSS-12-盒子模型
    CSS-11-外边距
    CSS-10-内边距
    CSS-09-背景属性
    CSS-08-边框属性设置
    CSS-07-CSS文本设置
  • 原文地址:https://www.cnblogs.com/Tony-Anne/p/6418757.html
Copyright © 2011-2022 走看看