国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

SOAP凈化有線協議(三):用腳本語言編寫服務

2024-07-21 02:21:50
字體:
來源:轉載
供稿:網友
  你是一個渴望永遠站在技術最前沿的java開發者嗎?軟件產業風云變幻,你渴望把握web的未來,更重要的是,如何把自己數年的java經驗發揮到極致。要尋找這些問題的答案,你不必走得太遠,答案就在于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實現所提供的腳本語言支持。為什么說它很重要呢?只要分析一下為何如此流行。在我看來,一個關鍵的原因在于已經成熟,幾乎任何人都能夠用html和javascript之類的簡單腳本語言構造出復雜的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/
  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 馆陶县| 临武县| 南昌市| 获嘉县| 焦作市| 泰顺县| 神农架林区| 滦平县| 西青区| 黄陵县| 成武县| 滁州市| 大竹县| 中牟县| 和静县| 兖州市| 兴国县| 南充市| 资阳市| 长武县| 延寿县| 高唐县| 九龙城区| 绥宁县| 临漳县| 静乐县| 福建省| 禹城市| 老河口市| 类乌齐县| 呈贡县| 富蕴县| 永安市| 湘乡市| 兴和县| 内乡县| 革吉县| 姚安县| 洞头县| 和平县| 彭州市|