本文將介紹Axis2項目開發及部署詳細內容,在講解之前先介紹一下axis2以及優缺點(都是自己在開發javaweb接口API的時候自己總結的,另外在其他兩篇文章會介紹一下用axis1和xfire發布webservice,以及三種發布的優缺點)
Axis2是Apache下的一個重量級WebService框架,準確說它是一個Web Services / SOAP / WSDL 的引擎,是WebService框架的集大成者。Axis2 具有模塊化體系結構,由核心模塊和非核心模塊組成。據說,Axis2核心是純SOAP處理引擎,并沒有包含 Java? API forxml-based RPC (JAX-RPC) 概念作為其核心的一部分。同時,Axis2體系結構的設計充分考慮了以下原則:
1.邏輯和狀態分離,以提供無狀態處理機制,因為 Web 服務是無狀態的。 2.所有信息位于一個信息模型中,允許對系統進行掛起和恢復。 3. 能夠在不更改核心體系結構的情況下擴展功能,能以最小或沒有核心更改的情況下直接支持新 Web 服務規范。
Axis2 核心體系結構包括以下核心和非核心組件:核心組件 ? XML對象模型 (AXIOM),SOAP處理模型:處理程序框架,信息處理模型:上下文和描述,其他組件,部署模型,傳輸,客戶機API,核心生成模型。 Axis2 優點:它能不但能制作和發布WebService,而且可以生成Java和其他語言版WebService客戶端和服務端代碼 內存占用低 熱部署 異步web 服務 靈活性 - Axis 體系結構使開發者可以自由的向引擎中插入擴展 穩定性 - Axis 定義了一組公共的接口。 面向組件的部署 - 可以簡單地定義可復用的處理機網絡,來實現應用程序的通用處理方式 或分發給合作者。 支持WSDL - Axis 支持WSDL1.1 ,可以簡單的構建訪問遠程服務的樁(stub ), 還可以自動將部署的服務從Axis 導出為機器可識別的描述。 插件 組成和可擴展性 缺點: Axis2重量級框架和支持多語言的特性不可避免的導致了Axis2的復雜性,開發所依賴的包數量和大小都是很驚人的,打包部署發布都比較麻煩,不能很好的與現有應用整合為一體。 Axis2的開發者太急于推出1.0版本,所以1.0還不是一個穩定的版本。
開發工具:Myeclipse2014,JDK_1.7,tomcat_1.6,下圖是開發完成之后的工程目錄: 
開發步驟: 第一步:創建一個普通的java web工程,下載axis2_.1.6.2的jar包,下載解壓,將所有jar包復制到lib目錄,將modules和conf文件夾及文件夾下所有文件拷貝到WEB_INF目錄下
第二部:編寫測試類TestService,包名:com.wingsoft.webservice,提供兩個測試接口方法,如下圖:
二.Axis2項目部署和發布
將開發好的項目,通過Myeclipse部署到tomcat中,啟動tomcat,啟動成功之后在瀏覽器中輸入http://主機名:8080/項目名稱/services/TestService?Wsdl,如果瀏覽器返回WSDL信息,表示webservice項目已經發布成功
三.Axis2項目接口調用示例(java語言) 示例1
public class Test { //設置調用地址,不能帶?WSDL PRivate static EndpointReference targetEPR = new EndpointReference( "http://localhost:8080/項目名稱/services/TestService/"); public static void main(String[] args) { try { // 對請求的接口方法設置參數,返回OMElement對象 // 創建OMFactory對象 OMFactory fac = OMAbstractFactory.getOMFactory(); // 命名空間,根據測試類包名反過來寫即可,或者在service.xml配置文件中自定義 // 命名空間,后面的參數為調用的方法名 OMNamespace omNs = fac.createOMNamespace( "http://webservice.wingsoft.com", "sayHello"); // 接口方法和參數設置 OMElement method = fac.createOMElement("sayHello", omNs); // 此處設置參數名稱一定要和方法中定義的變量名name保持一致,否則調用會報錯 OMElement param = fac.createOMElement("name", omNs); // 此處設置參數值 param.addChild(fac.createOMText(param, "Axis2")); method.addChild(param); Options options = new Options(); options.setTo(targetEPR); ServiceClient sender = new ServiceClient(); sender.setOptions(options); OMElement result=sender.sendReceive(method); System.out.println(result); } catch (AxisFault e) { e.printStackTrace(); } }}調用成功之后會返回xml格式結果,
<ns:sayHelloRespons xmlns:ns="http://webservice.wingsoft.com"><ns:return>hello, Axis2</ns:return></ns:sayHelloResponse>示例2(RPC方式調用)
public class Test { // 設置調用地址,不能帶?WSDL private static EndpointReference targetEPR = new EndpointReference( "http://主機IP:8080/項目名稱/services/TestService/"); public static void main(String[] args) { try { // 使用RPC方式調用WebService RPCServiceClient serviceClient = new RPCServiceClient(); Options options = serviceClient.getOptions(); // 確定目標服務地址 options.setTo(targetEPR); // 指定調用方法 options.setAction("urn:sayHello"); // 指定要調用的方法GetStioDetailByTxt及WSDL文件的命名空間 QName qname = new QName("http://webservice.wingsoft.com", "sayHello"); // 指定方法的參數值 Object[] parameters = new Object[] { "world!" }; // 指定方法返回值的數據類型的Class對象 Class[] returnTypes = new Class[] { String.class }; // 傳遞參數,調用服務,獲取服務返回結果集 Object[] result = serviceClient.invokeBlocking(qname, parameters,returnTypes); // 因為調用的方法只有一個返回值,所以取object數組第一個元素值 System.out.println((String)result[0]); } catch (AxisFault e) { e.printStackTrace(); } }}新聞熱點
疑難解答