http://www.cn-java.com/www1/?action-viewnews-itemid-3054
...
set CATALINA_HOME=C:\Tomcat4.1.29
set CLASSPATH=%JAVA_HOME%\lib\tools.jar
set CLASSPATH=%JAVA_HOME%\soap-2.3.1\lib\soap.jar
set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\javamail-1.3.1\mail.jar
set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\jaf-1.0.2\activation.jar
set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xercesImpl.jar
set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xercesSamples.jar
set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xml-apis.jar
set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xmlParserAPIs.jar
set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\common\lib\servlet.jar
set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\common\lib\tools.jar
...
如果你的安裝路徑(installation
paths)和上面使用的不同,你需要更正它們,然后關閉和重啟Tomcat以使它們生效。這樣,你就有為運行SOAP作好了準備。但是現在,我要忘記有
關的技術部分,來學一點理論知識。
SOAP意思是簡單對象訪問協議(Simple Object Access
Protocol)。的確如它的名字一樣,SOAP是很簡單的。它是一個基于XML的協議,允許程序組件和應用程序彼此使用一種標準的Internet協
議--HTTP來通訊。SOAP是一種獨立的平臺,它不依賴程序語言,它是簡單的,彈性的,很容易擴展的。目前,應用程序能夠彼此使用一種基于DCOM和
CORBA技術的遠程過程調用(RPC)來進行相互通訊,但HTTP不被設計為這個目的。RPC在Internet上應用是非常困難的,它們會出現許多兼
容性和安全性的問題,因為防火墻和代理服務器通常都會阻斷(block)這些類型的流量。應用程序之間最好的通訊方式是通過HTTP協議,因為HTTP是
支持所有Internet瀏覽器和服務器的。基于這個目的,SOAP協議被創建出來。
那么,它們是如何運作的呢?比如,一個應用程序(A)需要和另一個應用程序(B)在SOAP的幫助下進行彼此通訊。它們將使用下面的框架圖來完成這個
過程:

這個SOAP信封(SOAP envelope)是一個包含以下內容的XML文檔:

正如你看到的,它是非常簡單的。它看起來確實就象一個普通的信封或者你的email。你想看看它們是如何動作的嗎?下面跟我們一起來吧。其實我們有很多方
法是不用SOAP來在創建和運行我們自己的“Hello
World”應用程序的,但是因為我們要保持它的簡單性,我會給你一個它運作方式的框架圖(scheme)。
我們的“Hello World”范例會包含一個SOAP Service。我們的SOAP Client將發送它們的名字到該SOAP
Service,并試圖得到一些答復或響應。這個SOAP Service需要部署到一個SOAP
Admin的工具,以至重定位所有請求的SOAP(Proxy) RPC
Router能夠知道它們應該使用哪種服務來運作。總而言之,這個是以下面的方式來運作的:

現在,我們來一步步的看看到底發生了什么。在Step 1里,HelloWorldClient將連接一個SOAP RPC
Router,請求我們的SOAP Service并將包含我們名字的一個字符串傳遞給它。該SOAP RPC
Router會檢查是否它已經部署了這個SOAP Service。如果它被發現是被部署的,那么它將傳遞數據到這個SOAP
Service并調用特定的方法,這個是Step 2。然后SOAP Service方法會被執行,將返回某個字符串值(該值就是SOAP
Client的答復或者響應)(Step 3)。在Step4中,SOAP RPC Router將僅僅只是重定向這個數據到SOAP
Client。所有在Step1和Step4里傳輸的數據是通過SOAP
Envelope來完成的。正如你所看到的,算法是相當簡單的,因此我們只準備關心實際的代碼。
首先,我們要創建一個SOAP Service。下面是它的代碼,請不要忘記將它放入HelloWorld/
目錄中(必須被包含在你的CLASSPATH中):
1: // SOAPService.java
2: package HelloWorld;
3: public class SOAPService {
4: public String sayHi(String x) {
5: return("Hello my friend, " + x + "! Glad to see you!");
6: }
7: }
添加任何注釋也是很容易的。要編譯它,只需要用下列命令:
javac SOAPService.java
第二步,一旦我們準備好了SOAP Service,我們需要用SOAP Service
Manager來部署它。這個可以通過很多方式來實現,但是為了能讓初學SOAP的讀者更容易理解SOAP,我提供了一個最容易的方式。我們假設你的
Web
Server(Tomcat或其他)已經正常運行,并且你已經正確安裝了SOAP。那么當瀏覽器訪問http://localhost:8080
/soap/,你會看見Apache SOAP的歡迎頁面。點擊Run the admin client ,然后
Deploy。你會得到一個屏幕顯示,在那里你需要填入ID,Scope,Method,Provider Type和JAVA
Provider的信息到表單域中。你能忽略其他所有的表單域,除非你真的需要它們的信息。我們的“HelloWorld”例子不需要它們,所以,我們填
的下面的值:
ID: urn:HelloWorld_SOAPService
Scope: Application
Methods: sayHi
Provider Type: java
Java Provider - Provider Class: HelloWorld.SOAPService
Java Provider - Static? No
一些注釋:ID是我們要從SOAP Client標識我們的SOAP Service的唯一名字。Method包含SOAP
Service提供的一系列方法。JAVA Provider-Provider Class是SOAP Service Java類的名字。
現在,點擊Deploy
按鈕,那么你的服務會被部署。再次強調,請注意正確設置CLASSPATH環境變量。然后,你的HelloWorld.SOAPService類能夠被找
到,并且所有必需的jar包也能被找到。這是個幾乎每個人都會犯的普通錯誤。現在,你能夠點擊 List ,將會看見你的服務已經被部署進來。恭喜!
最后,讓我們來創建一個SOAP Client。代碼看起來有點復雜,但是在現實中不會只有這么點長。
1: // HelloWorldClient.java
2: import java.io.*;
3: import java.net.*;
4: import java.util.*;
5: import org.apache.soap.*;
6: import org.apache.soap.rpc.*;
7: public class HelloWorldClient {
8: public static void main(String[] arg) throws Exception {
9: Call c = null;
10: URL url = null;
11: Vector params = null;
12: Response rep = null;
13: String ourName = "Superman";
14: String ourUrn = "urn:HelloWorld_SOAPService";
15: String ourMethod = "sayHi";
16: url = new URL("http://localhost:8080/soap/servlet/
rpcrouter");
17: System.out.println("Passing to our deployed "+ourUrn+"
our name ("+ourName+"): ");
18: c = new Call();
19: c.setTargetObjectURI(ourUrn);
20: c.setMethodName(ourMethod);
21: c.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
22: params = new Vector();
23: params.addElement(new Parameter("ourName", String.class,
ourName, null));
24: c.setParams(params);
25: System.out.print("and its answer is: ");
26: rep = c.invoke(url, "");
27: if (rep.generatedFault()) {
28: Fault fault = rep.getFault();
29: System.out.println("\nCall failed!");
30: System.out.println("Code = " + fault.getFaultCode());
31: System.out.println("String = " + fault.getFaultString());
32: } else {
33: Parameter result = rep.getReturnValue();
34: System.out.print(result.getValue());
35: System.out.println();
36: }
37: }
38:}
下面我要做一些解釋。在第13行,我們設置了我們的名字,這個名字將會傳遞給SOAP
Service。在第14行,我們設置了我們將要調用的服務的ID(service ID),和第15行里設置的服務方法(service
method)。有了這個ID,服務能夠被部署到SOAP服務管理器(SOAP Service
Manager)中。我們沒有設置任何其他值,僅僅只用剛才那些基礎值就可以正常運作了。你能從SOAP的官方文檔上得到相關信息,該文檔來自SOAP包
中,它們的解釋超出了本文的范圍。
用以下方式編譯這個SOAP Client:
javac HelloWorldClient.java
為了圓滿完成它,讓我們檢查一下針對我們的測試,是否所有事情都準備就緒。Tomcat正在運行,所有的環境變量都正確,SOAP
Service被編譯和部署,SOAP Client被成功編譯。OK,讓我們運行它,你將看到這個屏幕:

正如你所看到的,我們的SOAP Client使用SOAP協議成功發送它的名字和接收了一個答復。正如前面所說的,SOAP Service發送和接收的是SOAP envelope。這個是SOAP envelope的源代碼。
被發送到SOAP Service的SOAP Envelope
<?xml version=1.0 encoding=UTF-8?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/
soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/
XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
<ns1:sayHi xmlns:ns1="urn:HelloWorld_SOAPService"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/
soap/encoding/">
<ourName xsi:type="xsd:string">Superman</ourName>
</ns1:sayHi>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>:
從SOAP Service接收的SOAP Envelope
<?xml version=1.0 encoding=UTF-8?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/
soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/
XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
<ns1:sayHiResponse xmlns:ns1="urn:HelloWorld_SOAPService"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.
org/soap/encoding/">
<return xsi:type="xsd:string">Hello my friend, Superman!
Glad to see you!</return>
</ns1:sayHiResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
要理解SOAP Envelope中的所有標簽的含義,我建議你花一點時間閱讀 http://www.w3.org/2001/06/soap-envelope 命名空間規范。
我希望本文能夠在你理解SOAP技術上有一定幫助。這個技術是簡單的,有趣的,強大的,彈性的。它被用在許多Web