三.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,以下包:
下載 (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提供的一些工具。以下:
下載 (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/,若是出現如下頁面,說明咱們安裝成功。
下載 (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 出現如下頁面
下載 (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; imp imp imp imp 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服務已經啓動)結果以下:
下載 (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());
} } 編譯運行以上代碼,運行結果以下:
下載 (11.21 KB) 6 天前 14:43 到這裏咱們的簡單的pojo發佈webservice已經結束了。也許你已經看出,pojo發佈一個webservice的缺陷,它不能帶包名。實際應用中不可能這麼作。那麼咱們用services.xml來發布,須看下節。 4.利用services.xml來發布webservice。 A.編寫帶有包名的pojo類以下: package service; imp public class MyService { public String sayHello(String name){ return "你好, "+name; } public void dataUpdate(String da System.out.println(da } } 編譯上面文件,得到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-on 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得到幫助來看它的用法) 下載 (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多了一個。 下載 (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-on 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-on 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/ |