webService學習3----axis發佈webService

 

三.Axis框架構建webservice php

1.axis概述。java

A. Axis2是一個web服務/SOAP/WSDL引擎,它繼承Apache Axis普遍使用的SOAP堆棧,它有兩個實現版本-----java和C。它是主流的webservice開發框架之一,實現方便,安全的,可靠的。它支持熱部署,以及異步webservice的調用等。web

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

C.傳輸協議:HTTP,SMTP,JMS,TCP編程

D.支持規範:① SOAP 1.1 和 1.2。windows

             ② 消息傳輸優化機制(MTOM),優化的XML包裝(XOP)和SOAP帶附件。數組

             ③ WSDL 1.1中,包括SOAP和HTTP綁定,(自己支持WSDL1.1和2.0)。瀏覽器

             ④ WS-Addressing。一種將消息尋址信息綜合到Web services消息中的標準。tomcat

             ⑤ 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文件放入webapps\axis2\WEB-INF\pojo目錄下,若是沒有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 Files\axis2-1.4(注意這裏是你的axsi2的工具解壓目錄)。在path里加入%AXIS2_HOME%\bin。輸入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:\ws\service\MyService.class

                              D:\ws\META-INF\service.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.0\webapps\axis2\WEB-INF\services

                這個目錄下,重啓咱們的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

相關文章
相關標籤/搜索