介紹: WebService是一種跨程式設計語言和跨作業系統平台的遠程調用技術。
所謂跨程式設計語言和跨操作平台,就是說服務端程式採用java編寫,用戶端程式則可以採用其他程式設計語言編寫,反之亦然。跨作業系統平台則是指服務端程式和用戶端程式可以在不同的作業系統上運行。
所謂遠程調用,就是一台電腦a上的一個程式可以調用到另外一台電腦b上的一個對象的方法,譬如,銀聯提供給商場的pos刷卡系統,商場的POS機轉賬調用的轉賬方法的代碼其實是跑在銀行伺服器上。
AXIS提供Webservice的兩種發布方式:
1. 即時發布 (InstantDeployment);
詳情請見: [Java] Webservice之即時發布JWS教程 (一)
2. 定製發布 (CustomDeployment);
定製發布方式: wsdd方式
1> 即時發布是一項令人激動的技術,它使Web服務的開發變得如此簡單;然而即時發布並不總是最好的選擇,比如有些應用系統是第三方提供的,我們沒有購買原始碼,只有.class檔案,但我們又希望將這個應用系統的一些功能對外發布成Web服務,使其能夠在更大範圍內產生作用,這個時候即時發布技術就無能為力了。此外,即時發布技術並不靈活,無法進行更多的服務配置,這使得它並不能滿足一些特定系統的需求。
2> 將java原始碼編譯成.class檔案,放置到“%Tomcat_HOME%/webapps/axis/”目錄下,即可著手進行發布。定製發布不需要構建.jws檔案,但必須在” %Tomcat_HOME%/webapps/axis/WEB-INF/”目錄下建立服務發布描述檔案deploy.wsdd(Web Service Deployment Descriptor的縮寫),這個檔案負責描述服務的名稱、入口等資訊! 開發準備:
axis服務下載:http://apache.fayea.com/axis/axis/java/1.4/
1. axis-src-1_4.zip 下載完成後,解壓壓縮包;
2. 進入到axis-src-1_4\axis-1_4\webapps目錄,複製axis整個檔案夾;
3. 粘貼到tomcat\webapps目錄下,如tomcat\webapps\axis;
4. 啟動Tomcat,地址欄輸入http://localhost:8080/axis斷行符號,如果出現Apache-Axis等內容就證明服務部署成功;
5. 開始進入案例編寫,在Eclipse\MyEclipstc建立一個Java Project,建立Package(eg: com.webservice.wsdd),然後寫一個HelloWSDD.java,最後編譯這個類;
5.1 目錄結構如下:
5.2 編寫的Java類:
/** * @功能: Web Service 定製發布的類 --> 方法 * @author: 吥 悔 * @Q Q: 379839355 * @2015年6月2日 下午11:54:47 */package com.webservice.wsdd;public class HelloWSDD {private int count = 0;public String hello(String name){count++;System.out.println("hello 調用次數:" + count);return "歡迎你:" + name;}public Float sum(Float a, Float b){count++;System.out.println("sum 調用次數:" + count);return a + b;}}
/** * @功能: 編譯HelloWSDD * @author: 吥 悔 * @Q Q: 379839355 * @2015年6月3日 上午12:03:09 */package com.webservice.wsdd;public class JavacHelloWSDD {public static void main(String[] args){new HelloWSDD();}} 6. 編譯完成後找到項目的工程路徑,並找到編譯後的
HelloWSDD.class檔案,然後後退至com目錄,複製com檔案夾,最後粘貼到tomcat\webapps\axis\WEB-INF\classes目下,如圖所示;
7. 接下來需要定製我們的wsdd xml檔案,這裡命名為deploy.wsdd,建立在當前web工程的WEB-INF目錄下;
<span style="font-size:12px;"><?xml version="1.0" encoding="UTF-8"?><deployment name="test" xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <!-- provider=”java:RPC”是服務類型,除了RPC方式以外,還有Document、Wrapped和Message方式 --> <service name="HelloWSDD" provider="java:RPC"><!-- 告訴服務應該調用的類 --> <parameter name="className" value="com.webservice.wsdd.HelloWSDD" /><!-- * 代表所有的方法都暴露 --> <parameter name="allowedMethods" value="*" /><!-- 當前WebService的範圍,分別是:request、session、application --><parameter name="scope" value="application" /> </service></deployment></span>
8. 寫完配置後,就需要用axis提供的AdminClient工具類幫我們發布WebService,直到產生server-config.wsdd,
步驟如下:
8.1 進入tomcat\webapps\axis\WEB-INF\目錄
8.2 在目前的目錄按住shift按鍵
8.3 然後右鍵出現在此開啟命令視窗
8.4 出現DOS視窗,且路徑為D:\tomcat6\webapps\axis\WEB-INF>
8.5 輸入編譯命令:java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient deploy.wsdd
8.6 如果報串連失敗的錯誤,啟動tomcat重新編譯一次即可
Exception: AxisFault faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException faultSubcode: faultString: java.net.ConnectException: Connection refused: connect faultActor: faultNode: faultDetail: {http://xml.apache.org/axis/}stackTrace:java.net.ConnectException: Conne ction refused: connect 8.7 編譯成功,目前的目錄D:\tomcat6\webapps\axis\WEB-INF>產生server-config.wsdd設定檔。
9. 訪問http://localhost:8080/axis/,並進入List目錄查看是否出現自訂的服務方法;
10. 編寫一個訪問Web Service服務並調用其服務的方法類ClientWSDD.java;
/** * @功能: Web Service WSDD * @author: 吥 悔 * @Q Q: 379839355 * @2015年6月3日 上午1:23:26 */package com.client;import javax.xml.namespace.QName;import org.apache.axis.client.Call;import org.apache.axis.client.Service;/** * @介紹: * WebService是一種跨程式設計語言和跨作業系統平台的遠程調用技術。<br/> * 所謂跨程式設計語言和跨操作平台,就是說服務端程式採用java編寫,用戶端程式則可以採用其他程式設計語言編寫,反之亦然。 * 跨作業系統平台則是指服務端程式和用戶端程式可以在不同的作業系統上運行。<br/> * 所謂遠程調用,就是一台電腦a上的一個程式可以調用到另外一台電腦b上的一個對象的方法, * 譬如,銀聯提供給商場的pos刷卡系統,商場的POS機轉賬調用的轉賬方法的代碼其實是跑在銀行伺服器上。<br/> * @步驟:<br/> * 2.定製發布 * 1> 編寫Java定製服務代碼,HelloWSDD.class帶工程結構目錄,並放置到tomcat\webapps\axis\WEB-INF\目錄;<br/> * 2> 需要定製我們的wsdd xml檔案,這裡命名為deploy.wsdd,建立在當前web工程的WEB-INF目錄下;<br/> * 3> 寫完配置後,就需要用axis提供的AdminClient工具類幫我們發布WebService,直到產生server-config.wsdd;<br/> * 4> 編寫用戶端,並調用Web Service中的遠程介面及其方法;<br/> */public class ClientWSDD {public static void main(String[] args) {try {//定義字串,描述要訪問的伺服器位址 [改為自己需要訪問的Web Service服務路徑]String url = "http://192.168.8.111:8080/axis/services/HelloWSDD";//建立一個 Web Service的服務Service sv = new Service();//建立一個調用Call call = (Call) sv.createCall();//指定服務的來源call.setTargetEndpointAddress(url);//指明調用的具體方法名call.setOperationName(new QName(url, "Hello"));//執行遠端的調用String result = (String) call.invoke(new Object[]{"吥_悔"});System.out.println(result);//指明調用的具體方法名call.setOperationName(new QName(url, "sum"));//執行遠端的調用Float resultSum = (Float) call.invoke(new Object[]{new Float(1.2), new Float(1.3)});System.out.println("a + b = " + resultSum);} catch (Exception e) {e.printStackTrace();}}} 11. 執行測試,控制台列印出方法的輸出語句,webservice訪問調用成功。