佳麗斯 加厚雙人/單人秋冬被子暖冬 羊毛被芯羊毛柔絲被特價包郵 憂憂魚冬外穿打底褲女秋冬厚長褲女褲加絨加厚高腰彈力鉛筆褲靴褲 韓國代購2013新款 韓版秋冬休閑女時尚磨破口袋衛(wèi)衣韓版學(xué)生裝 潮

          有時,退一步,能一口氣進(jìn)幾步,只是這先退一步需要勇氣和自信。

          用心愛你,努力工作。

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            70 隨筆 :: 1 文章 :: 33 評論 :: 0 Trackbacks
          開始之前,我想就本文即將討論的主題和讀者需要具備的起點知識做一些必需的描敘。本文的主題是討論SOAP技術(shù),我們將盡可能的講得通俗易懂一些,所以,我們引入了一個普通的“Hello World”范例來給讀者說明它們是怎么運作的,讓讀者知道它們的運作方式。我認(rèn)為,如果光看官方文檔是很難開始學(xué)習(xí)這門新技術(shù)的,官方文檔中包含大量的范例,并解釋了所有的特性和優(yōu)點,但是沒解釋它們的運作方式。

           在這篇文章中,我不打算只膚淺的解釋SOAP技術(shù)的定義,我們假設(shè)讀者熟悉JAVA語言,Web技術(shù),具有XML語言,XML Namespaces,XML Schema的基礎(chǔ)。在這種情況下,理解本文將不存在任何困難。然而,即使沒有這些知識,你也不必?fù)?dān)心,我們將盡可能的解釋得簡單,但是當(dāng)你開始做自己的SOAP應(yīng)用程序時會遇到一些問題和麻煩。因此,花費一定時間來學(xué)習(xí)上面的知識是很有必要的。

            從技術(shù)的角度來說,有必要提一下我們的調(diào)試環(huán)境。我們使用的是Windows XP操作系統(tǒng),安裝有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的官方網(wǎng)站(http://java.sun.com),其他的軟件在Jakarta項目組的官方網(wǎng)站(http://jakarta.apache.org)上有down的。

            可能你在看到我們需要這么多不同的包(package)時已經(jīng)有點擔(dān)心和不安了,但是實際上你不應(yīng)該擔(dān)心這些的。一旦你懂了基礎(chǔ),那么對你將相當(dāng)容易。安裝不是一件很難的事情,你只需要在設(shè)置環(huán)境變量的時候仔細(xì)些,比如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)和上面使用的不同,你需要更正它們,然后關(guān)閉和重啟Tomcat以使它們生效。這樣,你就有為運行SOAP作好了準(zhǔn)備。但是現(xiàn)在,我要忘記有關(guān)的技術(shù)部分,來學(xué)一點理論知識。

            SOAP意思是簡單對象訪問協(xié)議(Simple Object Access Protocol)。的確如它的名字一樣,SOAP是很簡單的。它是一個基于XML的協(xié)議,允許程序組件和應(yīng)用程序彼此使用一種標(biāo)準(zhǔn)的Internet協(xié)議--HTTP來通訊。SOAP是一種獨立的平臺,它不依賴程序語言,它是簡單的,彈性的,很容易擴(kuò)展的。目前,應(yīng)用程序能夠彼此使用一種基于DCOM和CORBA技術(shù)的遠(yuǎn)程過程調(diào)用(RPC)來進(jìn)行相互通訊,但HTTP不被設(shè)計為這個目的。RPC在Internet上應(yīng)用是非常困難的,它們會出現(xiàn)許多兼容性和安全性的問題,因為防火墻和代理服務(wù)器通常都會阻斷(block)這些類型的流量。應(yīng)用程序之間最好的通訊方式是通過HTTP協(xié)議,因為HTTP是支持所有Internet瀏覽器和服務(wù)器的。基于這個目的,SOAP協(xié)議被創(chuàng)建出來。
          那么,它們是如何運作的呢?比如,一個應(yīng)用程序(A)需要和另一個應(yīng)用程序(B)在SOAP的幫助下進(jìn)行彼此通訊。它們將使用下面的框架圖來完成這個過程:

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

            

            正如你看到的,它是非常簡單的。它看起來確實就象一個普通的信封或者你的email。你想看看它們是如何動作的嗎?下面跟我們一起來吧。其實我們有很多方法是不用SOAP來在創(chuàng)建和運行我們自己的“Hello World”應(yīng)用程序的,但是因為我們要保持它的簡單性,我會給你一個它運作方式的框架圖(scheme)。

            我們的“Hello World”范例會包含一個SOAP Service。我們的SOAP Client將發(fā)送它們的名字到該SOAP Service,并試圖得到一些答復(fù)或響應(yīng)。這個SOAP Service需要部署到一個SOAP Admin的工具,以至重定位所有請求的SOAP(Proxy) RPC Router能夠知道它們應(yīng)該使用哪種服務(wù)來運作。總而言之,這個是以下面的方式來運作的:

          點擊放大此圖片
          現(xiàn)在,我們來一步步的看看到底發(fā)生了什么。在Step 1里,HelloWorldClient將連接一個SOAP RPC Router,請求我們的SOAP Service并將包含我們名字的一個字符串傳遞給它。該SOAP RPC Router會檢查是否它已經(jīng)部署了這個SOAP Service。如果它被發(fā)現(xiàn)是被部署的,那么它將傳遞數(shù)據(jù)到這個SOAP Service并調(diào)用特定的方法,這個是Step 2。然后SOAP Service方法會被執(zhí)行,將返回某個字符串值(該值就是SOAP Client的答復(fù)或者響應(yīng))(Step 3)。在Step4中,SOAP RPC Router將僅僅只是重定向這個數(shù)據(jù)到SOAP Client。所有在Step1和Step4里傳輸?shù)臄?shù)據(jù)是通過SOAP Envelope來完成的。正如你所看到的,算法是相當(dāng)簡單的,因此我們只準(zhǔn)備關(guān)心實際的代碼。

            首先,我們要創(chuàng)建一個SOAP Service。下面是它的代碼,請不要忘記將它放入HelloWorld/ 目錄中(必須被包含在你的CLASSPATH中):

          // SOAPService.java 
            package HelloWorld; 
            
          public class SOAPService 
                
          public String sayHi(String x) 
                
          return("Hello my friend, " + x + "! Glad to see you!"); 
            }
           
            }

                添加任何注釋也是很容易的。要編譯它,只需要用下列命令:javac SOAPService.java

                  第二步,一旦我們準(zhǔn)備好了SOAP Service,我們需要用SOAP Service Manager來部署它。這個可以通過很多方式來實現(xiàn),但是為了能讓初學(xué)SOAP的讀者更容易理解SOAP,我提供了一個最容易的方式。我們假設(shè)你的Web Server(Tomcat或其他)已經(jīng)正常運行,并且你已經(jīng)正確安裝了SOAP。那么當(dāng)瀏覽器訪問http://localhost:8080/soap/,你會看見Apache SOAP的歡迎頁面。點擊Run the admin client ,然后 Deploy。你會得到一個屏幕顯示,在那里你需要填入ID,Scope,Method,Provider Type和JAVA Provider的信息到表單域中。你能忽略其他所有的表單域,除非你真的需要它們的信息。我們的“HelloWorld”例子不需要它們,所以,我們填的下面的值:
        1.   ID: urn:HelloWorld_SOAPService
        2.         Scope: Application
        3.   Methods: sayHi
        4.   Provider Type: java
        5.   Java Provider - Provider Class: HelloWorld.SOAPService
        6.   Java Provider - Static? No

          一些注釋:ID是我們要從SOAP Client標(biāo)識我們的SOAP Service的唯一名字。Method包含SOAP Service提供的一系列方法。JAVA Provider-Provider Class是SOAP Service Java類的名字。

            現(xiàn)在,點擊Deploy 按鈕,那么你的服務(wù)會被部署。再次強(qiáng)調(diào),請注意正確設(shè)置CLASSPATH環(huán)境變量。然后,你的HelloWorld.SOAPService類能夠被找到,并且所有必需的jar包也能被找到。這是個幾乎每個人都會犯的普通錯誤。現(xiàn)在,你能夠點擊 List ,將會看見你的服務(wù)已經(jīng)被部署進(jìn)來。恭喜!

            最后,讓我們來創(chuàng)建一個SOAP Client。代碼看起來有點復(fù)雜,但是在現(xiàn)實中不會只有這么點長。

          1// HelloWorldClient.java 
            2import java.io.*
            
          3import java.net.*
            
          4import java.util.*
            
          5import org.apache.soap.*
            
          6import org.apache.soap.rpc.*
            
          7public class HelloWorldClient 
            
          8public 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, ""); 
            
          27if (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行,我們設(shè)置了我們的名字,這個名字將會傳遞給SOAP Service。在第14行,我們設(shè)置了我們將要調(diào)用的服務(wù)的ID(service ID),和第15行里設(shè)置的服務(wù)方法(service method)。有了這個ID,服務(wù)能夠被部署到SOAP服務(wù)管理器(SOAP Service Manager)中。我們沒有設(shè)置任何其他值,僅僅只用剛才那些基礎(chǔ)值就可以正常運作了。你能從SOAP的官方文檔上得到相關(guān)信息,該文檔來自SOAP包中,它們的解釋超出了本文的范圍。

            用以下方式編譯這個SOAP Client:

            javac HelloWorldClient.java

            為了圓滿完成它,讓我們檢查一下針對我們的測試,是否所有事情都準(zhǔn)備就緒。Tomcat正在運行,所有的環(huán)境變量都正確,SOAP Service被編譯和部署,SOAP Client被成功編譯。OK,讓我們運行它,你將看到這個屏幕:
          點擊放大此圖片

            正如你所看到的,我們的SOAP Client使用SOAP協(xié)議成功發(fā)送它的名字和接收了一個答復(fù)。正如前面所說的,SOAP Service發(fā)送和接收的是SOAP envelope。這個是SOAP envelope的源代碼。

            被發(fā)送到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/">
          <o(jì)urName 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中的所有標(biāo)簽的含義,我建議你花一點時間閱讀 http://www.w3.org/2001/06/soap-envelope 命名空間規(guī)范。

            我希望本文能夠在你理解SOAP技術(shù)上有一定幫助。這個技術(shù)是簡單的,有趣的,強(qiáng)大的,彈性的。它被用在許多Web應(yīng)用中,這些應(yīng)用的數(shù)量也在不斷增加。學(xué)習(xí)SOAP是值得的,至少你要知道它是什么和它是怎么運作的。

        7. posted on 2007-10-20 14:59 王生生 閱讀(407) 評論(1)  編輯  收藏 所屬分類: Webservice

          評論

          # re: Java中的SOAP技術(shù) 2007-10-22 17:21 Franlk
          不錯,簡單明了.有所收獲.  回復(fù)  更多評論
            


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


          網(wǎng)站導(dǎo)航:
           
          森露2013新款豹紋打底衫 高領(lǐng) 女 長袖 修身長袖t恤女 加絨加厚冬 2013春秋新款女裝 潮修身大碼長袖小西裝外套女 韓版中長款小西裝 憂憂魚2013秋冬新款直筒褲女顯瘦長褲加絨黑色休閑褲修身西褲女褲
          主站蜘蛛池模板: 文登市| 来宾市| 郸城县| 正安县| 河北省| 靖宇县| 沙河市| 苏尼特左旗| 茌平县| 鸡泽县| 甘谷县| 蓝山县| 遂昌县| 洛南县| 临朐县| 安宁市| 莱阳市| 和静县| 绥宁县| 二手房| 抚顺县| 新化县| 广汉市| 桦川县| 安溪县| 弋阳县| 岑溪市| 剑河县| 两当县| 普安县| 安塞县| 天全县| 中江县| 西华县| 蒲江县| 嘉祥县| 宿松县| 巴里| 丰台区| 屏边| 安乡县|