用Axis 1.1 for Java進(jìn)行Web Services開發(fā)
下面的所有幾乎來自Axis1.1的文檔。但不完全來自文檔,本人做了部分修改,這些修改完全出自國內(nèi)讀者的需要。
什么是SOAP?
SOAP是一個(gè)基于XML的用于應(yīng)用程序之間通信數(shù)據(jù)編碼的傳輸協(xié)議。最初由微軟和Userland Software提出,隨著不斷地完善和改進(jìn),SOAP很快被業(yè)界廣泛應(yīng)用,目前完全發(fā)布版本是1.1。在其發(fā)展過程中,W3C XML標(biāo)準(zhǔn)工作小組積極促成SOAP成為一個(gè)真正的開放標(biāo)準(zhǔn)。在寫作此文檔之時(shí),SOAP1.2草案已經(jīng)發(fā)布,1.2對1.1中相對混亂的部分做了改進(jìn)。
SOAP被廣泛作為新一代跨平臺、跨語言分布計(jì)算Web Services的重要部分。
這里太膚淺的說明,請參閱我的整理《一步一步學(xué)習(xí)SOAP》。
什么是Axis?
Axis本質(zhì)上就是一個(gè)SOAP引擎,提供創(chuàng)建服務(wù)器端、客戶端和網(wǎng)關(guān)SOAP操作的基本框架。Axis目前版本是為Java編寫的,不過為C++的版本正在開發(fā)中。
但Axis并不完全是一個(gè)SOAP引擎,它還包括:
? 是一個(gè)獨(dú)立的SOAP服務(wù)器。
? 是一個(gè)嵌入Servlet引擎(例如Tomcat)的服務(wù)器。
? 支持WSDL。
? 提供轉(zhuǎn)化WSDL為Java類的工具。
? 提供例子程序。
? 提供TCP/IP數(shù)據(jù)包監(jiān)視工具。
Axis是第三代Apache SOAP,從2000年起,SOAP v2開發(fā)小組開始討論如何讓Axis更加靈活、可配置,以及能夠處理SOAP和來自W3C的各種XML標(biāo)準(zhǔn)。通過不斷地討論和代碼編寫,Axis目前取得了如下成果:
? 速度提高。 Axis通過基于事件的SAX對XML文檔進(jìn)行處理,從而在速度和效率上比Apache SOAP有所提高。
? 靈活性提高。
? 穩(wěn)定性提高。
? 提供面向組件的部署。
? 提供一個(gè)簡潔的傳輸抽象框架。其核心引擎完全于傳輸方式獨(dú)立。從而使基于何種協(xié)議傳輸?shù)倪x擇更加靈活。
? 支持WSDL。包括到處WSDL和客戶代理生成等。
在目前發(fā)行1.1版本中有什么東西?
? SOAP1.1/1.2引擎。
? 靈活的配置和部署系統(tǒng)。
? 支持及時(shí)自動(dòng)生成SOAP服務(wù)(JWS)。
? 支持所有的基本數(shù)據(jù)類型,為自定義串行操作提供類型映射系統(tǒng)。
? JavaBean的自動(dòng)串行操作,包括將自定義屬性類型映射到XML的屬性和元素。
? RPC和基于消息的SOAP服務(wù)提供者。
? 從部署好的服務(wù)自動(dòng)生成WSDL。
? WSDL2Java工具可以從WSDL描述文件中產(chǎn)生相應(yīng)的客戶和服務(wù)器端SOAP操作框架。
? 初步提供安全擴(kuò)展,能夠與Servlet2.2安全集成。
? 通過HTTP Cookie和與傳輸無關(guān)的SOAP頭信息提供會話跟蹤。
? 初步支持帶附件的SOAP消息。
? 在EJB方面提供把EJB作為Web服務(wù)的訪問途經(jīng)。
? 基于Servlet的HTTP傳輸。
? 基于JMS的傳輸。
? 獨(dú)立的服務(wù)器(但需要HTTP 服務(wù)器和Servlet容器支持)。
? 提供客戶端、服務(wù)器端相關(guān)應(yīng)用程序的樣例。
Axis的運(yùn)行需要如下組件包
? axis.jar
? jaxrpc.jar
? saaj.jar
? commons-logging.jar
? commons-discovery.jar
? wsdl4j.jar
? 符合JAXP-1.1的XML處理器。
一步一步開始用Axis進(jìn)行Web Services操作
下面給出一段簡單的調(diào)用Web Services方法的客戶端代碼(由于原文檔中直接用導(dǎo)入包的方式初學(xué)者不易了解那個(gè)類在那個(gè)包中,所以下面我做了一些簡單的修改,希望能給學(xué)習(xí)者清晰的思路):
public class TestClient {
public static void main(String[] args) {
try{
String endpoint="http://localhost:8080/axis/SayHello.jws?wsdl";// 調(diào)用的web服務(wù)的url地址,這里是一個(gè)http請求,希望得到的結(jié)果是wsdl文檔。
org.apache.axis.client.Service service=new org.apache.axis.client.Service();//建立請求服務(wù)框架實(shí)例。
/*
* org.apache.axis.client.Service實(shí)現(xiàn)JAX-RPCs javax.xml.rpc.Services接口
* 該接口充當(dāng)產(chǎn)生下面提到的org.apache.axis.client.Call實(shí)例
* 的角色。
*/
org.apache.axis.client.Call call=(org.apache.axis.client.Call)service.createCall();//從框架中生成一個(gè)維護(hù)調(diào)用的實(shí)例。
/*
* org.apache.axis.client.Call實(shí)現(xiàn)了JAX-RPCs javax.xml.rpc.Call接口。
*/
call.setTargetEndpointAddress(new java.net.URL(endpoint));
call.setOperationName(new javax.xml.namespace.QName("http://www.edu-edu.com.cn/luopc/ws","echoString"));//設(shè)置需要調(diào)用的函數(shù)名稱
String result=(String)call.invoke(new Object[]{"hello!"});
System.out.println(result);
}catch(Exception e){
System.err.println(e.toString());
}
}
}