zoukankan      html  css  js  c++  java
  • webService学习3----axis发布webService

     

    三.Axis框架构建webservice

    1.axis概述。

    A. Axis2是一个web服务/SOAP/WSDL引擎,它继承Apache Axis广泛使用的SOAP堆栈,它有两个实现版本-----java和C。它是主流的webservice开发框架之一,实现方便,安全的,可靠的。它支持热部署,以及异步webservice的调用等。

    B.要求java版本,jdk至少是1.5及以上版本。

    C.传输协议:HTTP,SMTP,JMS,TCP

    D.支持规范:① SOAP 1.1 和 1.2。

                 ② 消息传输优化机制(MTOM),优化的XML包装(XOP)和SOAP带附件。

                 ③ WSDL 1.1中,包括SOAP和HTTP绑定,(本身支持WSDL1.1和2.0)。

                 ④ WS-Addressing。一种将消息寻址信息综合到Web services消息中的标准。

                 ⑤ WS-Policy。Web 服务策略框架。

                 ⑥ SAAJ 1.1 。(SOAP with Attachments API for JAVA SAAJ)是在松散耦合软件系统中利用SOAP协议实现的基于XML消息传递的API规范。顾名思义,SAAJ支持带附件的SOAP消息。

    2.获取axis包。

    在Apache官方网站http://ws.apache.org/axis2/download/1_5_1/download.cgi下载框架组件包,最新的版本是axis2-1.5.1,如下包:

    webService学习3----axis发布webService - Alaric - 记录在编程世界里成长的历程 webService学习3----axis发布webService - Alaric - 记录在编程世界里成长的历程

    下载 (13.39 KB)

    6 天前 14:43

    A.Axis2-1.5.1-docs.zip解压后有xdoc和javadoc两个文档,xdoc讲的就是就是一些关于axis的概述,javadoc就是axis的java类的帮助文档。

    B.Axis2-1.5.1-src.zip解压后就是axis的源码。

    C.Axis2-1.5.1-war.zip解压后除了license.txt,readme.txt外就是一个axis2.war文件,这个文件是部署axis2到web容器的文件,其实就是一个发布好的应用。

    D.Axis2-1.5.1-bin.zip这个文件是最重要的了,里面包含了我们使用的所有java开发所需要的jar文件,还包括提供的一些工具。有bin,conf,lib,repository,samples,webapp文件夹,bin里面有axis2提供的一些工具。如下:

    webService学习3----axis发布webService - Alaric - 记录在编程世界里成长的历程 webService学习3----axis发布webService - Alaric - 记录在编程世界里成长的历程

    下载 (19.58 KB)

    工具

    6 天前 14:43

    Bat的文件用于windows环境下,sh用于Unix环境下。

    Conf文件夹里是axis配置文件axis2.xml,可修改默认设置。

    Lib文件夹里就是所有的jar文件。

    Samples是一些例子。

    Repository里是启用应用所依赖的文件。

    3.发布一个基于pojo的webservice。

    A.先解压我们下载好的Axis2-1.5.1-war.zip文件,获得axis.war文件,把它放到我们安装好的应用服务器发布目录。这里我们把它放到tomcat安装目录的webapps目录下。启动tomcat,打开浏览器,输入http://localhost:8080/axis2/,如果出现以下页面,说明我们安装成功。

    webService学习3----axis发布webService - Alaric - 记录在编程世界里成长的历程 webService学习3----axis发布webService - Alaric - 记录在编程世界里成长的历程

    下载 (100.28 KB)

    6 天前 14:43

    B.编写如下代码:

    public class HelloService

    {

            public String sayHello(String name)

            {

                    System.out.println("Hello " + name +"!");

                    return "Hello " + name +"!";

            }

    }

    把上面代码编译后的class文件放入webappsaxis2WEB-INFpojo目录下,如果没有pojo文件夹则自己创建。

    输入http://localhost:8080/axis2/services/listServices 出现以下页面

    webService学习3----axis发布webService - Alaric - 记录在编程世界里成长的历程 webService学习3----axis发布webService - Alaric - 记录在编程世界里成长的历程

    下载 (87.12 KB)

    6 天前 14:43

    可以看到所有已发布的可见的webservice,这里有三个,HelloService是我们刚刚发布的,version是版本信息,SimpleService是我昨天发布的。

    http://localhost:8080/axis2/services/HelloService/sayHello?name=zhang

    就可以在页面访问我们的webService了。

    C.下面我们编写java程序的客户端来调用我们写的webservice。编写代码如下:

    package client;

    import javax.xml.namespace.QName;

    import org.apache.axis2.addressing.EndpointReference;

    import org.apache.axis2.client.Options;

    import org.apache.axis2.rpc.client.RPCServiceClient;

    public class HelloServiceClient {

                public static void main(String[] args) throws Exception{

                    //  使用RPC方式调用WebService        

                 RPCServiceClient serviceClient = new RPCServiceClient();

                    Options options = serviceClient.getOptions();

                    //  指定调用WebService的URL

                    EndpointReference targetEPR = new EndpointReference(

                            "http://localhost:8080/axis2/services/HelloService");

                    options.setTo(targetEPR);

                    //  指定getGreeting方法的参数值

                    Object[] opAddEntryArgs = new Object[] {"alaric"};

                    //  指定getGreeting方法返回值的数据类型的Class对象

                    Class[] classes = new Class[] {String.class};

                    //  指定要调用的getGreeting方法及WSDL文件的命名空间

               QName opAddEntry = new QName("http://ws.apache.org/axis2", "sayHello");

                    //  调用getGreeting方法并输出该方法的返回值

                    System.out.println(serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0]);

                       

            }

    }

    运行(为了保证调用成功,运行时保证你的web服务已经启动)结果如下:

    webService学习3----axis发布webService - Alaric - 记录在编程世界里成长的历程 webService学习3----axis发布webService - Alaric - 记录在编程世界里成长的历程

    下载 (27.61 KB)

    6 天前 14:43

    关于更多axis2的java类及其继承关系和方法的使用请查看我们下的包Axis2-1.5.1-docs.zip里的javadoc。

    D.也许你已经看出以上这种方法编写客户端程序太麻烦,所有的调用都得我们自己写。现在我们用用axis提供的工具wsdl2java来生成客户端stub,这样我们调用远程webservice就像调用本地一样方便。先来看看我们的wsdl,在地址栏里输入以下地址:http://localhost:8080/axis2/services/HelloService?wsdl

    可以看到wsdl。现在我们在环境变量里加入

    AXIS2_HOME=D:Program Filesaxis2-1.4(注意这里是你的axsi2的工具解压目录)。在path里加入%AXIS2_HOME%in。输入wsdl2java -uri http://localhost:8080/axis2/services/HelloService?wsdl -p  client -s -o  d:stub其中-url参数指定了wsdl文件的路径,可以是本地路径,也可以是网络路径。-p参数指定了生成的Java类的包名,-o参数指定了生成的一系列文件保存的根目录。就可以得到stub,然后我们可以像如下程序来调用服务:

    package client;

    public class HelloStubClient {

             public static void main(String[] args) throws Exception  

                {

                    HelloServiceStub stub = new HelloServiceStub();

    HelloServiceStub.SayHello hello= new HelloServiceStub.SayHello();

                    hello.setArgs0("zhangjinping");

                    System.out.println( stub.sayHello(hello).get_return());

              

                }

    }

    编译运行以上代码,运行结果如下:

    webService学习3----axis发布webService - Alaric - 记录在编程世界里成长的历程 webService学习3----axis发布webService - Alaric - 记录在编程世界里成长的历程

    下载 (11.21 KB)

    6 天前 14:43

    到这里我们的简单的pojo发布webservice已经结束了。也许你已经看出,pojo发布一个webservice的缺陷,它不能带包名。实际应用中不可能这么做。那么我们用services.xml来发布,须看下节。

    4.利用services.xml来发布webservice。

    A.编写带有包名的pojo类如下:

        package service;

    import java.util.Date;

    public class MyService {

         public String sayHello(String name){

                 return "你好, "+name;

         }

         public void dataUpdate(String data){

                System.out.println(data+" 已经更新!");

         }

    }

    编译上面文件,获得MyService.class文件。

    然后准备个services.xml文件。如下:

    <service name="myService">

        <description>

            Web Service

        </description>

        <parameter name="ServiceClass">

            service.MyService  

        </parameter>

        <messageReceivers>

            <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"

                class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />

            <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"

             class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />

        </messageReceivers>

    </service>

    其中<service>元素用于发布Web Service,一个<service>元素只能发布一WebService类,name属性表示WebService名,如下面的URL可以获得这个WebService的WSDL内容:http://localhost:8080/axis2/services/myService?wsdl 其中name属性名就是上面URL中"?"和"/"之间的部分。<description>元素表示当前Web Service的描述,<parameter>元素用于设置WebService的参数,在这里用于设置WebService对应的类名。在这里最值得注意的是<messageReceivers>元素,该元素用于设置处理WebService方法的处理器。例如,getGreeting方法有一个返回值,因此,需要使用可处理输入输出的RPCMessageReceiver类,而update方法没有返回值,因此,需要使用只能处理输入的RPCInOnlyMessageReceiver类。

                    建立如下目录:

                        D:wsserviceMyService.class

                                  D:wsMETA-INFservice.xml

                    在命令提示符下进入d:ws,然后把这两个文件夹带放好的文件一块打成ws.aar文件(实际上,.jar文件也可以发布webservice,但axis2官方文档中建议使      用.aar文件发布webservice)

              命令: jar -cvf ws.aar . (不明白的可以输入jar –help获得帮助来看它的用法)

                      webService学习3----axis发布webService - Alaric - 记录在编程世界里成长的历程 webService学习3----axis发布webService - Alaric - 记录在编程世界里成长的历程

    下载 (20.15 KB)

    6 天前 14:54

                    Ok,ws.aar文件已经生成我们把它放到Tomcat 6.0webappsaxis2WEB-INFservices

                    这个目录下,重启我们的tomcat服务。

                   输入http://localhost:8080/axis2/services/listServices看到我们的webservice多了一个。

                webService学习3----axis发布webService - Alaric - 记录在编程世界里成长的历程 webService学习3----axis发布webService - Alaric - 记录在编程世界里成长的历程

    下载 (25.4 KB)

    6 天前 14:55

          

                   

    B.编写客户端程序和pojo里面的一样这里不再说了。

       另外services.xml文件中也可以直接指定WebService类的方法,如可以用下面的配置代码来发布WebService:

    <service name="myService">

        <description>

            Web Service例子

        </description>

        <parameter name="ServiceClass">

            service.MyService  

        </parameter>

        <operation name="getGreeting">

            <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />

        </operation>

        <operation name="update">

            <messageReceiver

                class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />

        </operation>

    </service>

    上面的配置代码前面的部分和以前的services.xml文件的内容相同,但后面使用了<operation>元素来指定每一个WebService方法,并单独指定了处理每一个方法的处理器。对于客户端来说,调用使用这两个services.xml文件发布的WebService并没有太大我区别,只是使用第二个services.xml文件发布WebServices后,在使用wsdl2java命令或使用C#、delphi等生成客户端的stub时,update方法的String类型被封装在了update类中,在传递update方法的参数时需要建立update类的对象实例。而使用第一个services.xml文件发布的WebService在生成stub时直接可以为update方法传递String类型的参数。从这一点可以看出,这两种方法生成的WSDL有一定的区别。但实际上,如果客户端程序使用第一个services.xml文件发布的WebService生成stub类时(这时update方法的参数是String),在服务端又改为第二个services.xml文件来发布WebService,这时客户端并不需要再重新生成stub类,而可以直接调用update方法。也就是说,服务端使用什么样的方式发布WebService,对客户端并没有影响。

    如果想发布多个WebService,可以使用<serviceGroup>元素,如再建立一个MyService1类,代码如下:

    package service

    public class MyService1

    {

        public String getName()  

        {

            return "bill";

        }

    }

    在services.xml文件中可以使用如下的配置代码来配置MyService和MyService1类:

    <serviceGroup>

        <service name="myService">

            <description>

                Web Service例子

            </description>

            <parameter name="ServiceClass">

                service.MyService  

            </parameter>

            <messageReceivers>

                <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"

                    class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />

                <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"

                          class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />

            </messageReceivers>

        </service>

        <service name="myService1">

            <description>

                Web Service例子

           </description>

            <parameter name="ServiceClass">

                service.MyService1  

            </parameter>

             <messageReceivers>

               <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"

                    class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />

               <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"

                             class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />

            </messageReceivers>

        </service>

    </serviceGroup>

    到这里我webservice的发布可以任你所想去发布了。

    还得注意一点:怎么处理复杂对象在网络之间的传输。

    C.        复杂对象在webservice之间的传输:

        在实际的应用中,不仅需要使用WebService来传递简单类型的数据,有时也需要传递更复杂的数据,这些数据可以被称为复合类型的数据。数组与类(接口)是比较常用的复合类型。在Axis2中可以直接使用将WebService方法的参数或返回值类型声明成数组或类(接口)。但要注意,在定义数组类型时只能使用一维数组,如果想传递多维数组,可以使用分隔符进行分隔,如下面的代码所示:

    String[] strArray = new String[]{ "自行车,飞机,火箭","中国,美国,德国", "超人,蜘蛛侠,钢铁侠" } ;

        上面的代码可以看作是一个3*3的二维数组。

        在传递类的对象实例时,除了直接将数组类型声明成相应的类或接口,也可以将对象实例进行序列化,也就是说,将一个对象实例转换成字节数组进行传递,然后接收方再进行反序列化,还原这个对象实例。

    更多内容请访问:

    w3c标准:http://www.w3.org/standards/webofservices/

    Apache:http://ws.apache.org/axis2/

    w3School教程:http://www.w3school.com.cn/webservices/index.asp

  • 相关阅读:
    鸟哥的linux私房菜学习笔记 ---第7章-1
    鸟哥的linux私房菜学习笔记 ---第6章-3
    使用sublime text3 解决中文显示乱码问题
    unbuntu运行shell脚本的问题
    鸟哥的linux私房菜学习笔记 ---第6章-2
    鸟哥的linux私房菜学习笔记 ---第6章-1
    nginx限速(转)
    Zend 的嵌套模板的方法
    使用vundle管理vim插件(转载)
    Wordpress 前台采用富文本编辑器tinymce的方法
  • 原文地址:https://www.cnblogs.com/alaricblog/p/3278249.html
Copyright © 2011-2022 走看看