Web服務(wù)開發(fā)技術(shù)實驗指導(dǎo)書_第1頁
Web服務(wù)開發(fā)技術(shù)實驗指導(dǎo)書_第2頁
Web服務(wù)開發(fā)技術(shù)實驗指導(dǎo)書_第3頁
Web服務(wù)開發(fā)技術(shù)實驗指導(dǎo)書_第4頁
Web服務(wù)開發(fā)技術(shù)實驗指導(dǎo)書_第5頁
已閱讀5頁,還剩43頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、web服務(wù)技術(shù)實驗指導(dǎo)實驗0、jax-ws概述3實驗1、使用jaxp進(jìn)行xml的轉(zhuǎn)換6實驗2、使用sax進(jìn)行xml的解析11實驗3、使用soapui查看soap消息15實驗4、使用jax-ws開發(fā)web服務(wù)服務(wù)器端20實驗5、使用jax-ws開發(fā)web服務(wù)客戶端31實驗6、web服務(wù)的打包與部署42實驗0、jax-ws概述實驗?zāi)康模?、jax-ws服務(wù)調(diào)用處理過程實驗環(huán)境:名稱下載地址jdk1.6soapui3.6.1eclipse3.4/downloads/download.php?file=/technology/epp/downloads/rel

2、ease/helios/sr2/eclipse-java-helios-sr2-win32.zipglassfish3.1實驗內(nèi)容:jax-ws(java api for xml web service)是javase和javaee中用于構(gòu)建web服務(wù)客戶端和服務(wù)器端的接口,它提供了一套可以幫助開發(fā)人員快速實現(xiàn)soa程序的工具。由于jax-ws使用了w3c定義的web服務(wù)的標(biāo)準(zhǔn):http、soap、wsdl,因此具有較好的擴(kuò)展性和靈活性。在jax-ws中,web服務(wù)的調(diào)用過程如下圖所示:參數(shù)參數(shù)參數(shù)返回java sei 代理soap請求soap響應(yīng)soap請求soap響應(yīng)參數(shù)參數(shù)參數(shù)返回jav

3、a 對象java 方法調(diào)用soap消息交換java 方法調(diào)用1、 在客戶端創(chuàng)建一個web服務(wù)端點(diǎn)的實例,該服務(wù)端點(diǎn)實現(xiàn)一個java接口,用jws的術(shù)語來說,這種接口叫做服務(wù)端點(diǎn)接口(sei)。通常情況下,sei實例是用java動態(tài)代理機(jī)制實現(xiàn)的。2、 當(dāng)調(diào)用sei實例的方法時,jax-ws會把傳遞給它的參數(shù)序列化成與目標(biāo)服務(wù)的wsdl指定的xml模式一致的xml片段,并最終將這些片段封裝到soap請求消息中。3、 將消息傳遞給網(wǎng)絡(luò)傳輸,向目標(biāo)web服務(wù)交付消息。4、 服務(wù)器端在接收到soap消息后,會首先決定調(diào)用哪個wsdl操作。5、 在確定了目標(biāo)wsdl操作之后,會決定調(diào)用哪個java類/方

4、法。這個過程叫做分發(fā)(dispatching)6、 將soap消息反序列化為java對象并傳遞給目標(biāo)java類和方法,從而得到目標(biāo)方法返回的java對象。7、 將返回的java對象再將反序列化為與目標(biāo)wsdl操作指定的返回消息一致的xml片段。將這些片段包裝成soap消息發(fā)送回客戶端。8、 客戶端將返回的xml片段反序列化為java對象并返回給調(diào)用者,從而完成對web服務(wù)的調(diào)用過程。從上面的過程可以看出,jax-ws可以分為三個部分:l 調(diào)用子系統(tǒng):處理web服務(wù)客戶端與服務(wù)器端的調(diào)用過程。l 序列化子系統(tǒng):將java對象序列化為xml元素以及將xml元素反序列化了java對象。l 部署子系統(tǒng)

5、:將目標(biāo)java對象部署為web服務(wù)從而使其可以通過soap消息調(diào)用。在整個調(diào)用過程中,很重要的一步就是決定調(diào)用哪個java類和方法的分發(fā)操作。要了解分發(fā)過程,首先就要對wsdl的樣式有所了解,這可以參照附件中的“wsdl樣式.mht”的內(nèi)容?,F(xiàn)在假設(shè)wsdl采用的是document/literal/wrapped樣式,有一個獲取一段時間內(nèi)訂單的方法如下:public class ordermanagerpublic order getorders(date start,date end);.將其發(fā)布為web服務(wù)后,wsdl部分內(nèi)容如下所示:.50. 51. 52. 53. 54. 55. 5

6、6. 57. 59. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. .假設(shè)服務(wù)器端收到如下的soap消息:1. post /getorders/getordersdates http1.12. host: localhost:80803. .4. 5. 6. getord:getordersdates xmlns:getord=”7. 2011-02-178. 9. 2011-03-1710. 11. 12. 13. 則整個分發(fā)過程如下所示:1、 根據(jù)soap消息底層協(xié)中的地址去識別相對應(yīng)的soap:ad

7、dress(wsdl:75)元素。個例子中的兩個地址并不完全相同(主機(jī)名分別為localhost與),但是對等的,因此需要分發(fā)程序進(jìn)行一些處理。2、 在找到相對應(yīng)的soap:address元素之后,就可以根據(jù)其父元素的wsdl:port元素的binding屬性找到相應(yīng)的wsdl:binding元素,然后根據(jù)wsdl:binding元素的type屬性找到相應(yīng)的wsdl:porttype元素。wsdl:porttype元素是一組wsdl:operation元素的集合,這與java類中有一組方法是相對應(yīng)的。因此wsdl:porttype對應(yīng)java類,wsdl:operation對

8、應(yīng)java類中的方法。這樣就可以根據(jù)類中的標(biāo)注找到相應(yīng)的類。3、 調(diào)用子系統(tǒng)從soap中找到包裝器元素getordersdates。在document/literal/wrapped樣式的wsdl中,所有輸入?yún)?shù)是被包裝在一個與要調(diào)用的wsdl:operation同名的元素中的,因此根據(jù)這個包裝器元素就可以確定相應(yīng)的wsdl:operation,然后就可以根據(jù)類中的標(biāo)注找到相應(yīng)的方法,并將輸入?yún)?shù)按照標(biāo)注指定的對應(yīng)關(guān)系反序列化為類的調(diào)用參數(shù),從而完成整個分發(fā)過程。實驗附件:實驗1、使用jaxp進(jìn)行xml的轉(zhuǎn)換實驗環(huán)境:eclipse3.4實驗內(nèi)容:1、 使用xslt進(jìn)行xml格式之間的轉(zhuǎn)換2、

9、 使用dom接口進(jìn)行xml格式之間的轉(zhuǎn)換。實驗步驟:在soa系統(tǒng)的開發(fā)過程中,經(jīng)常會遇到需要在不同格式之間進(jìn)行數(shù)據(jù)轉(zhuǎn)換的情況。本次實驗使用jaxp(java api for xml processing)來進(jìn)行不同xml格式之間數(shù)據(jù)的轉(zhuǎn)換。假設(shè)現(xiàn)在有兩個web服務(wù):l 訂單管理服務(wù):該服務(wù)可以接收并處理新的訂單。l 客戶歷史記錄管理服務(wù):該服務(wù)可以接收對客戶歷史記錄的更新。而我們需要一個新的系統(tǒng)將上面兩個web服務(wù)鏈接起來。在這個新的系統(tǒng)中,首先是訂單管理服務(wù)接收新的訂單,再把它們轉(zhuǎn)換成客戶歷史記錄,最后再將這些記錄發(fā)送給客戶歷史記錄管理服務(wù)。在這過程中,我們要把訂單格式轉(zhuǎn)換為客戶歷史記錄格式

10、。訂單與客戶歷史記錄兩種格式的xml模式文件夾分別為orders.xsd與custhistentries.xsd。兩種數(shù)據(jù)格式及它們之間的對應(yīng)關(guān)系如下圖所示。客戶歷史記錄cus001客戶編號訂單信息訂單order001訂單編號標(biāo)頭銷售組織:.ne采購日期:2011-01-01客戶編號:cus001支付方式:po定購單號:po-001保證交付日期:2011-01-07訂單條目訂單條目編號:goods001存儲位置:ne02目標(biāo)數(shù)量:50度量單位:kg每度量單位價格:7.95描述:這是商品1訂單條目編號:goods002目標(biāo)數(shù)量:5度量單位:個每度量單位價格:20描述:這是商品2訂單編號:orde

11、r001定購單號:po-001商品編號:goods001商品編號:goods002其它信息:緊急訂單緊急訂單其它信息1、使用xslt進(jìn)行xml格式之間的轉(zhuǎn)換xslt(extensible stylesheet language transformations)是一種基于xml的一種強(qiáng)大且有效的數(shù)據(jù)轉(zhuǎn)換引掣,可以很方便的解決數(shù)據(jù)轉(zhuǎn)換的問題。xslt是聲明式的語言,用于定義從原文檔到目標(biāo)文檔的轉(zhuǎn)換。xlst轉(zhuǎn)換文件夾由一套模板規(guī)則組成(由xsl:template元素的實例代表),它們是根節(jié)點(diǎn)xsl:stylesheet元素的子元素。stylesheet元素中的各個子元素定義了如何根據(jù)原始文檔來創(chuàng)建

12、目標(biāo)文檔的轉(zhuǎn)換結(jié)構(gòu)。xlst使用xpath語言來標(biāo)識源文件中的數(shù)據(jù)塊,在模板規(guī)則的幫助下,xpath表達(dá)式可以決定將相應(yīng)的數(shù)據(jù)塊放在目標(biāo)文檔的什么位置。程序開發(fā)步驟如下:第一步:打開eclipse,新建java項目xmltransform。新建java包schema,并將orders.xsd與cushistentries.xsd放在此包下,新建包xslt用于存放xslt文件,新建包c(diǎn)ode存放java代碼。在項目根目錄下新建文件夾xml并將用于轉(zhuǎn)換的數(shù)據(jù)order.xml放在此目錄下。第二步:在xslt包中新建文件order_to_history.xslt作為從訂單記錄到客戶歷史記錄轉(zhuǎn)換的樣式

13、表。該文件夾說明如下:首先,文件中最開始的幾行1. 2. xsl:stylesheet version=1.0 3. xmlns:xsl=/1999/xsl/transform4. xmlns:oms=5. 定義了所用到的命名空間以及輸出文檔的格式,其中oms 前綴代表訂單的命名空間這個xslt文件接下來的一部分11. 12. customerhistoryentries xmlns=13. xmlns:xsi=/2001/xmlschema-instance14. xsi:schemalocation=15. 16. 17. 1

14、8. 19. 20. customerhistoryentry xmlns=21. 22. 23. 24. 25. 26. 28. 30. 31. 32. 33. 定義了oms:orders的轉(zhuǎn)換規(guī)則。在這段代碼的開始處,可以看到一個模板元素匹配源文檔中的”oms:orders”元素。在該模板元素的內(nèi)部又定義了一個customerhistoryentries元素。模板內(nèi)部的內(nèi)容定義了目標(biāo)文檔的輸出,所以這個模板提供了如何將一個oms:orders元素轉(zhuǎn)換為一個css:customerhistoryentries的規(guī)則。在這個模板元素內(nèi),有一個指令元素。這個特殊指令告訴xslt處理器為oms:o

15、rders節(jié)點(diǎn)的子節(jié)點(diǎn)應(yīng)用于樣式表中的其它模板,并將轉(zhuǎn)換的結(jié)果插入到目標(biāo)文檔中。這樣一來就構(gòu)造好了目標(biāo)文檔中的css:customerhistoryentries元素。從第19行開始定義了另一個用于匹配oms:order元素的模板。所以,如果oms:orders的所有子元素都是oms:order元素的實例,這些子元素就會由這個模板來處理并將處理結(jié)果插入到customerhistoryentries標(biāo)簽中。在該模板元素中又包含了另一個xsl:apply-templates指令,不過這個指令有一個select屬性,其中的xpath表達(dá)式./oms:orderheader/ oms:purch_or

16、d_no對這個模板所匹配的子元素進(jìn)行了限制。該xpath表達(dá)式說明了該該模板只適用于oms:orderheader的子元素oms:cust_no。這樣就可以把oms:cust_no元素轉(zhuǎn)換為css:customernumber元素,并將其插到目標(biāo)文檔的正確位置。該文件夾的剩余部分使用了另外一些模板元素定義了對源文檔中的其它元素的處理,原理與此處相同,所以不再贅述。第三步:在java代碼中處理xslt,可以使用jaxp(java api of xml processing)。jaxp中的javax.xml.transform.transformer類會根據(jù)樣式表文件中指定的規(guī)則把源文檔中轉(zhuǎn)換成目

17、標(biāo)文檔。jaxp為所有的java xml處理都提供了支持。在code包下新建類xsltxform,其代碼主體如下:1.public class xsltxform 2. public static void main(string args) throws exception 3. string ordersfile = xml/order.xml;4. string outputfile = xml/custhistentry.xml;5. 6. source src = new streamsource(new file(ordersfile);7. result res = new st

18、reamresult(new file(outputfile);8. 9. transformer transformer = 10. transformerfactory.newinstance().newtransformer11.(new streamsource(xsltxform.class.getresourceasstream(/xslt/order_to_history.xslt);12. transformer.setoutputproperty(outputkeys.indent, yes);13. 14. transformer.transform(src, res);1

19、5.16. 17.首先新建了一個用于封裝輸入的xml文檔的source對象與一個用于封裝輸出xml文檔的result對象,然后新建一個封裝了xslt轉(zhuǎn)換文件夾的transformer對象。最后調(diào)用transformer的transform方法來完成實際的轉(zhuǎn)換過程。第四步:運(yùn)行程序,可以在xml文件夾下看到輸出的custhistentry.xml文件。2、使用dom接口進(jìn)行xml格式之間的轉(zhuǎn)換。另一方面,我們也可以直接使用dom接口來完成xml的轉(zhuǎn)換。dom是一種解析和修改xml文檔的一種標(biāo)準(zhǔn)接口,它將xml文檔轉(zhuǎn)換為內(nèi)存中的一棵由元素、屬性和文本構(gòu)成的樹,通過對該節(jié)點(diǎn)樹進(jìn)行處理來完成對xml文

20、檔的處理。本例中演示如何使用dom接口來完成與上例等價的轉(zhuǎn)換,從而同時演示如何使用dom接口對xml文檔進(jìn)行讀和寫。第一步:在xmltransform項目中創(chuàng)建domxform類。該類是使用dom接口進(jìn)行轉(zhuǎn)換的主類。第二步:27. string ordersfile = xml/order.xml;28. string outputfile = xml/custhistentry2.xml;29. 30. source src = new streamsource(new file(ordersfile);31. result res = new streamresult(new file(o

21、utputfile);32. 33. documentbuilderfactory dbfac = documentbuilderfactory.newinstance();34. documentbuilder docbuilder = dbfac.newdocumentbuilder();35. 36. document srcdoc = docbuilder.newdocument();37. document resdoc = docbuilder.newdocument();38. 39. transformer xformer = transformerfactory.newins

22、tance().newtransformer();40. xformer.transform(src, new domresult(srcdoc);要想使用dom接口來完成對xml文檔的處理,首先要創(chuàng)建一個dom解析器工廠對象并使用該對象創(chuàng)建一個dom解析器。然后創(chuàng)建分別與源xml文檔和目標(biāo)xml文檔相對應(yīng)的document對象,并使用transformer對象將源xml文檔讀入與之相對應(yīng)的document中,從而使其可以使用dom接口進(jìn)行處理。第三步:根據(jù)目標(biāo)文檔的格式,在目標(biāo)文檔中創(chuàng)建新的節(jié)點(diǎn),所需要的數(shù)據(jù)可以從源文檔中查詢。比如對于目標(biāo)文檔中的客戶編號節(jié)點(diǎn),可以通過以下方式添加:45.

23、element custnumele = resdoc.createelementns(res_default_ns,46. customernumber);47. string custnumber = srcdoc48. .getelementsbytagnamens(src_default_ns, cust_no).item(0)49. .getfirstchild().getnodevalue();50. custnumele.appendchild(resdoc.createtextnode(custnumber);51. 52. custhistentryele.appendchi

24、ld(custnumele);在以上代碼中,首先使用document#createelementns方法創(chuàng)建了一個局部名稱為customernumber的元素,它所在的命名空間是由string類型常量res_default_ns指定的。然后,使用document#getelementsbytagnamens方法在源文檔中查找局部名稱為cust_no,命名空間由string常量src_default_ns指定的元素,它在源文檔中可以保證是惟一出現(xiàn)的。查找到的元素節(jié)點(diǎn)的第一個子節(jié)點(diǎn)是一個文本節(jié)點(diǎn),文本節(jié)點(diǎn)的內(nèi)容就是客戶的編號。因此,可以讀出該編號,在目標(biāo)文檔中使用document#createte

25、xtnode創(chuàng)建一個包含客戶編號的文檔結(jié)點(diǎn),并使用element#appendchild方法將該文檔節(jié)點(diǎn)添加為的子節(jié)點(diǎn):customernumber的子節(jié)點(diǎn)。最后,再調(diào)用element#appendchild方法將:customernumber添加為:customehistoryentry的子節(jié)點(diǎn)。第四步:對于目標(biāo)文檔中的商品編號列表,可以使用與第三步相似的方法,找到源文檔中的所有的商品編號節(jié)點(diǎn),對于每一個節(jié)點(diǎn),在目標(biāo)文檔中添加一個相應(yīng)的節(jié)點(diǎn)。代碼如下:73. nodelist itemnumeles = srcdoc.getelementsbytagnamens(src_default_ns

26、,74. itm_number);75. for (int i = 0; i itemnumeles.getlength(); +i) 76. string currentnumber = itemnumeles.item(i).getfirstchild()77. .getnodevalue();78. element itemnumele = resdoc.createelementns(res_default_ns,79. itm_number);80. itemnumele.appendchild(resdoc.createtextnode(currentnumber);81. ord

27、erlookupinfoele.appendchild(itemnumele);82. 第五步:運(yùn)行程序,可以看到得到了與使用xlst方法相同的目標(biāo)文檔。實驗附件:實驗2、使用sax進(jìn)行xml的解析實驗環(huán)境:eclipse3.4實驗內(nèi)容:1、 使用sax進(jìn)行xml的解析 實驗步驟:在web服務(wù)開發(fā)過程中,我們經(jīng)常需要將xml文件解析成相對應(yīng)的java對象。要完成xml解析的工作,需要使用相應(yīng)的xml解析器。在實驗1的第2個實驗“使用dom接口進(jìn)行xml格式之間的轉(zhuǎn)換”中,我們已經(jīng)看到了如何使用dom解析器對xml文件進(jìn)行解析和修改,本實驗將使用另外一種解析器sax來完成xml文件的解析。與do

28、m在內(nèi)存中建立一棵節(jié)點(diǎn)樹并通過對樹的操作來完成對xml文件的處理相比,sax基于事件流的模型。解析器從順序掃描整個xml文件,當(dāng)遇到特定事件比如遇到元素起始標(biāo)簽、遇到元素閉合標(biāo)簽、遇到文件節(jié)點(diǎn)等,就會調(diào)用預(yù)先注冊的事件處理程序來完成相應(yīng)操作,從而完成整個文件的解析。與dom不同的是,sax只能進(jìn)行文檔的解析,而不能進(jìn)行文檔的修改。sax與dom的比較如下:domsax結(jié)構(gòu)基于樹的基于事件處理過程首先讀入整個文檔,然后在內(nèi)存中建立節(jié)點(diǎn)樹。程序通過訪問節(jié)點(diǎn)樹來完成xml的處理過程。程序提前注冊事件處理程序。解析器掃描文檔,當(dāng)遇到事件時觸發(fā)相應(yīng)的事件處理程序。易用性較復(fù)雜,但比較靈活。較易使用,但功

29、能有限可進(jìn)行的操作創(chuàng)建、解析、修改、刪除只能進(jìn)行解析。資源占用占用處理器和內(nèi)存較多占用內(nèi)存少,處理速度快。使用場景非順序訪問或要進(jìn)行修改掃描大的文檔。假設(shè)對于實驗1的訂單管理程序,程序在收到訂單請求后,需要將xml文檔解析成相應(yīng)的java對象,以便程序的進(jìn)一步處理。使用sax解析過程如下:第一步:在eclipse中新建項目xmlparser。創(chuàng)建包schema并將orders.xsd拷貝到該包下。第二步:首先,創(chuàng)建與orders.xsd中定義的類型相對應(yīng)的java類并放置于bean包下。為了完成解析程序,共創(chuàng)建了四個java類,如下所示:l order:與 orders.xsd中的oms:or

30、dertype類型相對應(yīng)。l orderheader:orders.xsd中的oms:busobj_header類型相對應(yīng)。l orderitem:與orders.xsd中的oms:busobj_item類型相對應(yīng)。l card:與orders.xsd中的oms:busobj_ccard類型相對應(yīng)。另外創(chuàng)建了一個表示付款方式的枚舉類型paymentmethod,因為oms:busobj_header的pymt_meth子元素只能取po和cc兩個值。第三步:在parser包下創(chuàng)建sax事件處理類orderhandler。因為sax解析器是通過在掃描文檔遇到相應(yīng)的事件時觸發(fā)提前注冊的事件處理程序來

31、完成解析的,因此要求程序員創(chuàng)建自己的事件處理程序。orderhandler繼承自org.xml.sax.helpers. defaulthandler類并重寫了其中的三個方法:l startelement:當(dāng)遇到一個元素開始標(biāo)簽的時候,會觸發(fā)該處理函數(shù)。l endelement:當(dāng)遇到一個元素的結(jié)束標(biāo)簽時,會觸發(fā)該處理函數(shù)。l characters:當(dāng)sax器解析出一個文本節(jié)點(diǎn)時,會觸發(fā)該處理函數(shù)。orderhandler中定義了三個實例變量:l order:解析元素及其子元素時,代表當(dāng)前解析的xml元素對應(yīng)的order對象。l currentitem:解析元素及其子元素時,代表當(dāng)前解析的xm

32、l元素對應(yīng)的orderitem對象。l currentelementname:當(dāng)解析出文本節(jié)點(diǎn)時,代表當(dāng)前文本節(jié)點(diǎn)所在的父元素的名稱。在三個重寫的處理函數(shù)中,基本思想是根據(jù)遇到的元素的名稱,分別進(jìn)行不同的處理。具體處理過程如下:l startelement:如果是元素,就實例化order變量。如果是元素,就實例化order變量的orderheader屬性。如果是元素,就實例化item變量。除此之外,使用currentelementname變量記錄當(dāng)前元素的名稱供characters方法使用。l endelement: 如果是元素,就說明當(dāng)前元素已經(jīng)解析完畢,item變量就是與解析完成的元素相對

33、的對象,因此要將該對象添加到order變量的items,即orderitem的列表中。除此之外,還要清除currentelementname變量,說明當(dāng)前元素已經(jīng)解析完成。l characters:根據(jù)currentelementname的值設(shè)定order或item對象的屬性。第四步:創(chuàng)建orderparser類作為order.xml的解析器。在解析過程中,為了保證文檔是正確的,應(yīng)當(dāng)在解析之前先進(jìn)行驗證。所以在orderparser中創(chuàng)建validate方法,實現(xiàn)如下:18. schemafactory schemafactory = schemafactory19. .newinstance

34、(xmlconstants.w3c_xml_schema_ns_uri);20. 21. source schemasource = new streamsource(this.getclass()22. .getresourceasstream(/schema/orders.xsd);23. 24. try 25. schema schema = schemafactory.newschema(schemasource);26. validator validator = schema.newvalidator();27. validator.validate(new streamsourc

35、e(f);28. return true;29. catch (exception e) 30. e.printstacktrace();31. return false;32. 該方法中首先創(chuàng)建一個模式工廠類,將通過其工廠方法newschema創(chuàng)建一個schema對象。schema可以看作驗證器的工廠,因此通過該對象可以創(chuàng)建一個驗證器對象。然后調(diào)用驗證器對象的validate方法,該方法會使用與schema對象相對應(yīng)的schema文件去驗證目標(biāo)xml文檔,如果有錯的話,就會拋出異常。第五步:在orderparser類中創(chuàng)建parse方法來完成xml文檔的解析。該方法實現(xiàn)如下:37. saxp

36、arserfactory spf = saxparserfactory.newinstance();38. spf.setnamespaceaware(true);39. saxparser sp;40. try 41. sp = spf.newsaxparser();42. orderhandler oh = new orderhandler();43. sp.parse(f, oh);44. return oh.getorder();45. catch (exception e) 46. e.printstacktrace();47. return null;48.首先創(chuàng)建一個sax解析器

37、工廠,并設(shè)定該工廠產(chǎn)生的解析器會提供對命名空間的支持。否則的話,orderhandler對象的startelement和endelement的入?yún)⒅衛(wèi)ocalname和namespce會為空。然后創(chuàng)建解析器對象并注冊給其orderhandler事件處理對象,最后調(diào)用parse方法來完成解析過程。第五步:創(chuàng)建main.java作為主程序。主程序中首先讀入order.xml,然后分別調(diào)用orderparser的validate和parse方法來完成文檔的驗證和解析。運(yùn)行程序,可以看到程序解析出了正確的信息:1. 訂單信息2. 訂單號:order0013. 訂單頭信息4. 銷售組織:ne5. 購買日

38、期:sat jan 01 00:01:00 cst 20116. 客戶號:cus0017. 購買方式:po8. 購買訂單號:po-0019. 到貨日期:2011-01-0710. 11. 訂單條目12. 條目號:00113. 存儲位置:ne0214. 數(shù)目:50.015. 數(shù)量單位:kg16. 單價:7.9517. 簡介:這是商品118. 19. 訂單條目20. 條目號:00221. 存儲位置:null22. 數(shù)目:5.023. 數(shù)量單位:個24. 單價:20.025. 簡介:這是商品226. 27. 訂單信息:緊急訂單實驗附件:實驗3、使用soapui查看soap消息實驗環(huán)境:soapui

39、3.6.1實驗步驟:soapui是一個通用的web服務(wù)客戶端工具,使用soapui可以方便的查看web服務(wù)的wsdl文件以及客戶端與服務(wù)器端通信所產(chǎn)生的soap消息,可以用于對所開發(fā)的web服務(wù)及客戶端進(jìn)行調(diào)試。本次實驗和實驗2、3均基于以下訂單處理場景:1、 假設(shè)客戶想要從網(wǎng)上訂購一些商品,他會發(fā)送一個“客戶訂單”,其中包括客戶編號、可選的訂購單號、可選的信用卡信息,以及一個要購買商品的列表。2、 訂單管理系統(tǒng)接收到“客戶訂單”后,會對訂單進(jìn)行處理,確定要訂購的商品以及需要的付款方式,與庫存管理系統(tǒng)進(jìn)行交互,根據(jù)當(dāng)前庫存決定可能的商品發(fā)貨日期。3、 最后,訂單管理程序為客戶發(fā)送一個響應(yīng)消息訂

40、單確認(rèn)信息,其中包括了訂購商品的付款信息以及預(yù)計的發(fā)貨日期,作為給用戶的收據(jù)。一個可能的例子如圖所示:為了突出soa程序設(shè)計開發(fā)中的問題,在對場景設(shè)計編碼過程中,使用一段簡單的碼代替了第2步中對“客戶訂單”的真實處理過程,從而將更多的注意力放在了客戶端與服務(wù)端的交互上。本實驗中使用的是soapui 3.6.1免費(fèi)版。與正式版相比,免費(fèi)版缺少了一些功能,但并不會對我們的使用造成太大影響。第一步:從實驗2的附件中找到wsserver項目并將該項目導(dǎo)入到eclipse中。運(yùn)行server.main.main,該類會把服務(wù)發(fā)布在http:/localhost:8088/requestorderserv

41、ice上,其wsdl可以通過http:/localhost:8088/requestorderservice?wsdl訪問。第二步:打開soapui。如果打開程序的時候,彈出如下錯誤窗口的話:那么打開/bin/ soapui-3.6.1.vmoptions文件并添加一行,內(nèi)容如下:-dsoapui.jxbrowser.disable=true重新運(yùn)行程序即可。依次選擇file-new soapui project,在彈出的窗口中輸入項目名稱以及wsdl的地址,點(diǎn)擊確定,如下圖所示:這樣就在soapui中新建了一個項目。soapui會識別出wsdl文件中所有的綁定和操作,在左側(cè)項目樹狀視圖上雙擊

42、,可以在打開的對話框中看到服務(wù)和綁定的相關(guān)屬性。該服務(wù)的屬性對話框如下圖所示:第二步:點(diǎn)擊確定之后,可以看到soapui已經(jīng)識別出wsdl中的服務(wù)與操作。雙擊request1,可以看出soapui根據(jù)wsdl中wsdl:types定義已經(jīng)準(zhǔn)備了請求soap消息的模板。替換其中的“?”占位符,將某些不需要的optional的節(jié)點(diǎn)刪掉,從而創(chuàng)建一個請求消息。第三步:點(diǎn)擊左上角的發(fā)送按鈕,可以在右邊看到服務(wù)器端返回的soap響應(yīng)消息:第三步:soapui可以用來對web服務(wù)進(jìn)行測試,從而幫助web服務(wù)開發(fā)人員對服務(wù)進(jìn)行調(diào)試。首先,soapui可以通過添加斷言(assertion)的方式對服務(wù)進(jìn)行功能

43、性測試。首先,給請求添加一個測試集:在彈出的對話框中依次輸入測試包和測試用例的名稱,點(diǎn)擊確定,可以看到soapui打開了測試用例編輯窗口,并且在左側(cè)項目樹狀視圖中可以看到相應(yīng)測試包的信息?,F(xiàn)在,就可以給請求添加斷言。soapui支持多種斷言,包括schema樣式、簡單字符串包含、xpath匹配、非soap錯誤、腳本斷言等多種斷言類型,可以進(jìn)行各種不同的斷言操作。可以點(diǎn)擊添加斷言按鈕給請求添加一個斷言:由于在返回的消息中會包括信息卡的持卡人姓名,因此可以在彈出的斷言類型選擇對話框中選擇包含斷言,包含的內(nèi)容填寫要發(fā)送的請求消息的持卡人姓名:重新發(fā)送請求,可以看到斷言成立:第四步:還可以使用soap

44、ui進(jìn)行負(fù)載測試,從而可以對服務(wù)的響應(yīng)時間等性能因素進(jìn)行測試??梢允褂萌绻路椒ㄌ砑訙y試集:在彈出的頁面填寫測試用例的名稱,并在彈出的測試用例編輯對話框中填寫相應(yīng)參數(shù)。以下是使用5個線程運(yùn)行20秒的測試結(jié)果,結(jié)果顯示了響應(yīng)時間、發(fā)送數(shù)據(jù)量等信息。還可以用如下方法添加對性能特征的斷言:這些斷言的使用方法與功能測試的斷言的使用方法相似,此處不再重復(fù)。以上是對soapui的簡單介紹。soapui是一個功能很強(qiáng)大的軟件,如果想要進(jìn)一步的了解的話,可以參照soapui的在線幫助:/getting-started/installing-soapui.html實驗附件

45、:無實驗4、使用jax-ws開發(fā)web服務(wù)服務(wù)器端實驗環(huán)境:1、 jdk1.62、 eclipse3.4實驗內(nèi)容:1、 使用服務(wù)器端點(diǎn)接口(sei)從wsdl開始開發(fā)2、 不使用jaxb來實現(xiàn)服務(wù)提供者與xml處理3、 使用標(biāo)注從現(xiàn)有java程序開始開發(fā)實驗步驟:一、使用服務(wù)器端點(diǎn)接口(sei)從wsdl開始開發(fā)開發(fā)一個web服務(wù)的服務(wù)器端的一種情況是從一個已經(jīng)存在的wsdl開始開發(fā),要實現(xiàn)符合此wsdl契約的web服務(wù),最直接的方式是使用服務(wù)端點(diǎn)接口(service endpoint interface,sei)。sei是根據(jù)jax-ws wsdl/java映射生成的java接口,在服務(wù)器端

46、實現(xiàn)該接口即可提供符合指定契約的web服務(wù)。假設(shè)我們現(xiàn)在已經(jīng)有了實驗1中提到的訂單處理系統(tǒng)的wsdl文件,如本實驗附件中的requestorder.wsdl所示。在該wsdl文件的wsdl:types元素定義中有如下元素:9. xs:schema targetnamespace=10. 11. 12. xs:schema targetnamespace=13. 15. 這兩個元素從外部文件中導(dǎo)入了兩個xml schema文件。在實際的開發(fā)過程中,經(jīng)常會出來某些數(shù)據(jù)已經(jīng)存在標(biāo)準(zhǔn)的格式(如訂單),使用這些標(biāo)準(zhǔn)的數(shù)據(jù)格式可以使系統(tǒng)更易理解并提高系統(tǒng)的可擴(kuò)展性。要生成sei,可以使用java se 6.0中的wsimport工具。該程序位于/bin目錄中。實驗步驟如下:第一步:新建文件夾wsdl并將requestorder.wsdl、faults.xsd與orders.xsd放在該目錄下。第二步:打開命令窗口(cmd)并跳轉(zhuǎn)到wsdl目錄下,運(yùn)行wsimport命令/bin/wsimport -d ./bin -s ./src -p server.sei requestorder.wsdl其中-d選項指明創(chuàng)建的class文件目錄

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論