<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    JavaSky
    JavaBird
    posts - 8,  comments - 9,  trackbacks - 0
    轉自:
    http://www.cnblogs.com/mingzi/archive/2009/03/23/1419385.html

    開始之前,我想就本文即將討論的主題和讀者需要具備的起點知識做一些必需的描 敘。本文的主題是討論SOAP技術,我們將盡可能的講得通俗易懂一些,所以,我們引入了一個普通的“Hello World”范例來給讀者說明它們是怎么運作的,讓讀者知道它們的運作方式。我認為,如果光看官方文檔是很難開始學習這門新技術的,官方文檔中包含大量的 范例,并解釋了所有的特性和優點,但是沒解釋它們的運作方式。在這篇文章中,我不打算只膚淺的解釋SOAP技術的定義,我們假設讀者熟悉JAVA語言,Web 技術,具有XML 語 言,XML Namespaces,XML Schema的基礎。在這種情況下,理解本文將不存在任何困難。然而,即使沒有這些知識,你也不必擔心,我們將盡可能的解釋得簡單,但是當你開始做自己的 SOAP應用程序時會遇到一些問題和麻煩。因此,花費一定時間來學習上面的知識是很有必要的。

    從技術的角度來說,有必要提一下我們的調試環境。我們使用的是Windows XP操作系統 ,安裝有JAVA 2 SDK 1.4.1,Apache SOAP 2.3.1,JAF 1.0.2,JavaMail 1.3.1和Xerces 2.6.0。上面所提及的都能在Tcomcat 4.1.29 JSP /Servlet 容器中正常運行。所有的軟件都是免費自由軟件,因此你能夠很容易的下載 它們并自己在任何你喜歡的平臺如Windows或UNIX上安裝它們。Java SDK,JAF和JAVAMAIL位于SUN的官方網站( http://java.sun.com ),其他的軟件在Jakarta項目組的官方網站( http://jakarta.apache.org )上有down的。可能你在看到我們需要這么多不同的包(package)時已經有點擔心和不安了,但是實際上你不應該擔心這些的。一旦你懂了基礎,那么對你將相當容易。安裝不是一件很難的事情,你只需要在設置環境變量的時候仔細些,比如CATALINA_HOME , CLASSPATH , JAVA_HOME 等等,所有這些步驟都是手工的。由于我僅僅是想將你的注意力再次集中到它們身上,所以你能很快的就完成以上配置過程。我只是添加下面的一些字符串到Tomcat的bin/setclasspath.bat 文件中:

    ... 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意思是簡單對象訪問協議(S imple O bject A ccess P rotocol)。的確如它的名字一樣,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應用中,這些應用的數量也在不斷增加。學習SOAP是值得的,至少你要知道它是什么和它是怎么運作的

    posted on 2012-12-20 14:57 JavaBird 閱讀(346) 評論(0)  編輯  收藏 所屬分類: SOAP

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 在线成人爽a毛片免费软件| 日本系列1页亚洲系列| a级毛片免费高清毛片视频| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 久久精品一本到99热免费| 亚洲AV无码成人网站久久精品大| 国产三级在线免费观看| 亚洲午夜国产精品无码老牛影视 | 免费无码H肉动漫在线观看麻豆| 亚洲国产V高清在线观看| 亚洲高清免费视频| 国产亚洲av片在线观看16女人 | 伊人久久亚洲综合影院| 日韩在线视频播放免费视频完整版 | 久久精品国产亚洲AV嫖农村妇女| 久久久久久影院久久久久免费精品国产小说 | 中文字幕亚洲一区二区va在线| 伊人免费在线观看| 亚洲妇女水蜜桃av网网站| 毛片免费观看网站| 久久亚洲精品无码av| 久久久久亚洲av成人无码电影| 精品免费tv久久久久久久| 亚洲一级黄色大片| 国产小视频在线免费| 成人免费无码H在线观看不卡| 亚洲AV无码成人精品区蜜桃| 91情侣在线精品国产免费| 精品特级一级毛片免费观看| 色噜噜AV亚洲色一区二区| 97国产在线公开免费观看| 亚洲乱码日产精品一二三| 亚洲日本中文字幕一区二区三区| 久久精品免费观看| 亚洲av中文无码乱人伦在线观看 | 亚洲精品无码av人在线观看| 日本h在线精品免费观看| 亚洲av乱码一区二区三区按摩| 亚洲成色在线综合网站| 国产卡二卡三卡四卡免费网址| 一级毛片在线播放免费|