SOAP淨化有線協議(三):用指令碼語言編寫服務

來源:互聯網
上載者:User
指令碼   你是一個渴望永遠站在技術最前沿的Java開發人員嗎?軟體產業風雲變幻,你渴望把握Web的未來,更重要的是,如何把自己數年的Java經驗發揮到極致。要尋找這些問題的答案,你不必走得太遠,答案就在於SOAP。

SOAP(簡易物件存取通訊協定 (SOAP))是一種利用XML編碼資料的有線協議,它為Java的平台無關性、可移植性帶來了更高層次的協同操作能力。在這個關於SOAP的系列文章的第二篇中,我介紹了Apache SOAP。作為SOAP規範的實現之一,Apache SOAP簡化了SOAP應用的構造。我們曾經用Apache SOAP構造了兩個簡單的HelloWorld服務,以及調用這些服務的sayHelloTo()方法的客戶程式。我們看到,雖然建立SOAP服務相當簡單,但客戶程式必須完成許多額外的工作,例如它必須設定Call對象,調用Call對象的invoke()方法,然後分析作為調用結果返回的Response對象。

其實,用Apache SOAP建立SOAP服務的過程還可以變得更簡單,唯一的前提是:你必須懂得規定的幾種指令碼語言之一。對我來說——以及對大多數Java開發人員來說,幸運的是,這些指令碼語言中包含了JavaScript。確實不錯,在Apache SOAP中,你可以用JavaScript建立SOAP服務。本文要介紹的就是用JavaScript建立SOAP服務的具體做法。

一、重新構造Apache SOAP
Apache SOAP的指令碼支援建立在Bean Scripting Framework(BSF,Bean指令碼架構)的基礎之上。BSF原先由IBM開發,現在作為一個原始碼開放的工程發行,它使得Java程式能夠運行用其他語言編寫的指令碼,也使得其他指令碼語言能夠使用已有的Java類。Apache SOAP利用了BSF的前一種能力。從Apache網站下載的標準二進位版本不支援指令碼。具體地說,soap.jar不包含org.apache.soap.server.InvokeBSF類,而這個類是Apache SOAP和BSF的結合點和介面。Apache SOAP的開發人員知道,並非每一個使用SOAP的人都需要BSF,也並非每一個人都安裝了指令碼引擎,所以在soap.jar中省略了指令碼支援。要想用指令碼編寫SOAP服務,你必須從原始碼重新構造以便引入InvokeBSF類。

首先要從http://xml.apache.org/dist/soap/下載原始碼(soap-src-2.0.zip)。然後,把下載得到的檔案解壓縮到Apache SOAP所安裝的目錄。在我這裡,它是E:磁碟機的根目錄。完成後,你將在soap_2-0目錄下得到一個src子目錄,子目錄中包含Apache SOAP的所有原始碼。重新從原始碼構造Apache SOAP之前,你還必須下載必需的BSF jar檔案。在ftp://ftp.mozilla.org/pub/js/可以找到一個。請結合Mozilla的JavaScript引擎Rhino使用它,Rhino可以從http://www.mozilla.org/rhino/download.html下載一個ZIP檔案得到。我把這個檔案解壓縮到E:盤根目錄下,最終得到一個包含了Rhino的E:\rhino目錄,我們感興趣的是它的js.jar。

接下來,你需要一個實際執行重新構造操作的工具,即Ant。Ant也是一個Apache的軟體工程,它是一個基於Java的工具。Ant實際上和建立Web伺服器Tomcat的工程同屬一個工程,即Jakarta。在Ant中,所有構造資訊,例如構造目標、依賴關係等,都通過XML設定檔指定,這是Ant獨一無二的特點。此外,Ant是可擴充的。請參見本文最後“參考資源”部分收錄的文章,瞭解如何充分發揮Ant的潛能。你可以從參考資源提供的連結下載Ant,然後解開壓縮(我把它放入了C:盤的根目錄)。

現在,從Apache SOAP安裝目錄執行如下命令:


set
CLASSPATH=E:\jakarta-tomcat\lib\servlet.jar;E:\xerces-1_2_0\xerces.jar;
E:\soap-2_0\lib\bsf.jar
C:\build\bin\ant
由於上面的命令沒有指定一個XML設定檔,Ant批命令檔案將在目前的目錄(在我這裡,是E:\soap_2-0)中尋找一個名為build.xml的檔案。Apache SOAP提供了這個檔案。開啟這個檔案可以看到,只有當com.ibm.bsf.BSFManager在classpath中時,InvokeBSF類才會編譯。這就是我把bsf.jar(它包含了BSFManager類)放入類路徑的原因。把新構造出來的soap.jar檔案從build\lib子目錄複製到lib子目錄(我建議修改原來的soap.jar檔案進行備份)。最後,把bsf.jar和js.jar加入到Web伺服器的類路徑。

大功告成!現在你可以開始用指令碼編寫SOAP服務了。

二、用JavaScript編寫HelloWorld應用
現在,我們用JavaScript重新編寫第二篇文章的HelloWorld服務。服務程式的完整代碼如下:


function sayHelloTo(name)
{
return "Hello " + name + ", How are you?";
}
還有比這更容易的事情嗎?不過,不要讓這簡單易行欺騙了你。事實上,你可以在服務程式裡進行相當複雜的處理。例如,你可以從指令碼代碼訪問任何標準的Java類。請看下面經過修改的指令碼代碼,它輸出伺服器的時間:


function sayHelloTo(name)
{
var today = new java.util.Date();
java.lang.System.out.println("Today is " + today.toString());
return "Hello " + name + ", How are you?";
}
另外,你還可以匯入和使用自己的任意Java類。例如,我們可以修改指令碼代碼,讓它使用Name JavaBean:


importClass(Packages.hello.Name);
function sayHelloTo(name)
{
var today = new java.util.Date();
java.lang.System.out.println("Today is " + today.toString());
var beanName = new Name();
beanName.setName("John");

java.lang.System.out.println(beanName.getName());
return "Hello " + name + ", How are you?";
}
三、部署服務
在使用JavaScript版本的服務之前,首先要部署它。正如本系列文章的第二篇所介紹的,在Apache SOAP中部署服務有兩種辦法:使用Web介面的管理工具,或者從命令列部署服務。下面我們來看看兩種辦法的具體操作過程。

3.1 使用Web介面的管理工具
要使用Web介面的管理工具,用瀏覽器開啟http://localhost:8080/apache-soap/admin。點擊視窗左邊的Deploy按鈕。記住,ID輸入框用來設定對象ID,SOAP基礎設施利用對象ID把RPC(遠端程序呼叫)請求關聯到SOAP服務。每一個Apache SOAP服務都必須有一個對象ID,而且這個對象ID必須在該伺服器上部署的所有服務之間唯一。把ID設定成urn:Hello,這個ID也就是我們在第二篇文章中為服務設定的對象ID。

把Scope輸入框設定成application。回顧一下,Scope輸入框用來指定響應調用請求的服務執行個體的存留時間(請參考第二篇文章中的更多說明)。

在Methods輸入框中輸入當前部署的服務允許調用的方法名字,多個方法名字之間以空白字元分隔。我們的服務只支援一個方法,即sayHelloTo()。

由於服務用JavaScript實現,而不是象第二篇文章那樣用Java實現,所以Provider Type輸入框應該填script。相應地,Java Provider輸入框(包括Provider Class和Static輸入框)不必填寫。但現在必須填寫Script Provider輸入框,選擇JavaScript(Rhino)作為指令碼語言。由於我們將在Script文本輸入框中提供指令碼本文,所以現在不用填寫Script Filename輸入框。把下面的指令碼代碼複製到Script輸入框:


importClass(Packages.hello.Name);
function sayHelloTo(name)
{
var today = new java.util.Date();
java.lang.System.out.println("Today is " + today.toString());
var beanName = new Name();
beanName.setName("John");
java.lang.System.out.println(beanName.getName());
return "Hello " + name + ", How are you?";
}
現在滾動到螢幕的最下面,點擊表單下面的Deploy按鈕(不是視窗左邊的Deploy按鈕)。要驗證服務已經成功部署,點擊視窗左邊的List按鈕。這時,urn:Hello服務應該在服務資訊清單中出現。點擊這個服務,確認所有資訊都與剛才輸入的吻合。

3.2 從命令列部署服務
要從命令列部署服務,所有部署資訊必須放入一個XML部署描述器檔案。下面是我用來部署該服務的XML部署描述器檔案:


<isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment"
id="urn:Hello">
<isd:provider type="script" scope="Application" methods="sayHelloTo">
<isd:script language="javascript">
importClass(Packages.hello.Name);
function sayHelloTo(name)
{
var today = new java.util.Date();
java.lang.System.out.println("Today is " + today.toString());
var beanName = new Name();
beanName.setName("John");

java.lang.System.out.println(beanName.getName());
return "Hello " + name + ", How are you?";
}
</isd:script>
</isd:provider>
</isd:service>
和第二篇文章用到的部署描述器檔案相比,這裡主要的不同在於把提供者類型設定成了script而不是java。由於這個原因,部署描述器檔案不再指定一個Java類,而是提供了服務的指令碼代碼。

部署服務之前應當確保Web伺服器已經啟動。下面的代碼顯示了如何部署服務:


java org.apache.soap.server.ServiceManagerClient
http://localhost:8080/apache-soap/servlet/rpcrouter deploy
DeploymentDescriptor.xml
DeploymentDescriptor.xml是前面介紹的包含部署描述資訊的XML檔案。要驗證服務已經成功部署,執行下面的命令:


java org.apache.soap.server.ServiceManagerClient
http://localhost:8080/apache-soap/servlet/rpcrouter query urn:Hello
這時,我們應該看到和DeploymentDescriptor.xml檔案一樣的內容。

四、測試
我們用第二篇文章提供的客戶程式Client.java來測試HelloWorld服務。為什麼可以用同一個客戶程式訪問JavaScript編寫的服務呢?因為客戶程式完全不會在乎服務用什麼語言編寫。只要服務能夠理解SOAP請求,能夠返回SOAP應答,客戶程式不會關注服務用什麼方式實現。回顧一下,下面就是我用來運行hello.Client的批命令檔案:


set
CLASSPATH=E:\soap-2_0\samples\;E:\soap-2_0\lib\soap.jar;
E:\xerces-1_2_0\xerces.jar
java hello.Client Tarak

觀察Web伺服器的控制台視窗,每次運行客戶程式的時候,我們都可以看到當前的日期和輸出“John”。

■ 結束語
在這篇文章中,我介紹了Apache SOAP實現所提供的指令碼語言支援。為什麼說它很重要呢?只要分析一下為何Web開發如此流行。在我看來,一個關鍵的原因在於Web開發已經成熟,幾乎任何人都能夠用HTML和JavaScript之類的簡單指令碼語言構造出複雜的Web頁面。類似地,在Web開發的伺服器端,人們可以使用JSP這類易學但強大的指令碼語言。我認為這種推理同樣適用於SOAP開發。如果SOAP想要挺進主流,獲得絕大部分人的支援,那麼它應該盡量地簡化。Apache SOAP加入對指令碼的支援正是為了這個目標;它顯著地擴充了建立SOAP服務的開發人員的範圍。

不過,不要忘了還有另一個因素需要考慮:用戶端開發人員,即調用SOAP服務的開發人員。如前所述,Apache SOAP的用戶端開發人員比較“吃虧”,反而增加了一些原本不必做的工作。因此,在本系列文章的下一篇也即最後一篇中,我將介紹一個架構,它以Java 2平台1.3版本新引入的動態代理類為基礎,使得建立客戶程式就象建立SOAP服務一樣簡單直觀。
■ 參考資源
  • W3C的SOAP 1.1規範
  • http://www.w3.org/TR/SOAP/
  • 下載Apache SOAP:
  • http://xml.apache.org/dist/soap/
  • 關於IBM SOAP工程的更多資訊:
  • http://www.alphaworks.ibm.com/tech/soap4j
  • 關於Mozilla Rhino的更多資訊:
  • http://www.mozilla.org/rhino/
  • 關於Ant的更多資訊:
  • http://jakarta.apache.org/ant/index.html
  • 利用Java和Ant自動化構造過程(JavaWord,2001年10月):
  • http://www.javaworld.com/jw-10-2000/jw-1020-ant.html
  • 下載Ant:
  • http://jakarta.apache.org/builds/jakarta-ant/release/v1.2/bin/


  • 相關文章

    E-Commerce Solutions

    Leverage the same tools powering the Alibaba Ecosystem

    Learn more >

    Apsara Conference 2019

    The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

    Learn more >

    Alibaba Cloud Free Trial

    Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

    Learn more >

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。