Web服务开发技术实验指导书_第1页
Web服务开发技术实验指导书_第2页
Web服务开发技术实验指导书_第3页
Web服务开发技术实验指导书_第4页
Web服务开发技术实验指导书_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、web服务技术实验指导实验0、jax-ws概述3实验1、使用jaxp进行xml的转换6实验2、使用sax进行xml的解析11实验3、使用soapui查看soap消息15实验4、使用jax-ws开发web服务服务器端20实验5、使用jax-ws开发web服务客户端31实验6、web服务的打包与部署42实验0、jax-ws概述实验目的:1、jax-ws服务调用处理过程实验环境:名称下载地址jdk1.6soapui3.6.1eclipse3.4/downloads/download.php?file=/technology/epp/downloads/rel

2、ease/helios/sr2/eclipse-java-helios-sr2-win32.zipglassfish3.1实验内容:jax-ws(java api for xml web service)是javase和javaee中用于构建web服务客户端和服务器端的接口,它提供了一套可以帮助开发人员快速实现soa程序的工具。由于jax-ws使用了w3c定义的web服务的标准:http、soap、wsdl,因此具有较好的扩展性和灵活性。在jax-ws中,web服务的调用过程如下图所示:参数参数参数返回java sei 代理soap请求soap响应soap请求soap响应参数参数参数返回jav

3、a 对象java 方法调用soap消息交换java 方法调用1、 在客户端创建一个web服务端点的实例,该服务端点实现一个java接口,用jws的术语来说,这种接口叫做服务端点接口(sei)。通常情况下,sei实例是用java动态代理机制实现的。2、 当调用sei实例的方法时,jax-ws会把传递给它的参数序列化成与目标服务的wsdl指定的xml模式一致的xml片段,并最终将这些片段封装到soap请求消息中。3、 将消息传递给网络传输,向目标web服务交付消息。4、 服务器端在接收到soap消息后,会首先决定调用哪个wsdl操作。5、 在确定了目标wsdl操作之后,会决定调用哪个java类/方

4、法。这个过程叫做分发(dispatching)6、 将soap消息反序列化为java对象并传递给目标java类和方法,从而得到目标方法返回的java对象。7、 将返回的java对象再将反序列化为与目标wsdl操作指定的返回消息一致的xml片段。将这些片段包装成soap消息发送回客户端。8、 客户端将返回的xml片段反序列化为java对象并返回给调用者,从而完成对web服务的调用过程。从上面的过程可以看出,jax-ws可以分为三个部分:l 调用子系统:处理web服务客户端与服务器端的调用过程。l 序列化子系统:将java对象序列化为xml元素以及将xml元素反序列化了java对象。l 部署子系统

5、:将目标java对象部署为web服务从而使其可以通过soap消息调用。在整个调用过程中,很重要的一步就是决定调用哪个java类和方法的分发操作。要了解分发过程,首先就要对wsdl的样式有所了解,这可以参照附件中的“wsdl样式.mht”的内容。现在假设wsdl采用的是document/literal/wrapped样式,有一个获取一段时间内订单的方法如下:public class ordermanagerpublic order getorders(date start,date end);.将其发布为web服务后,wsdl部分内容如下所示:.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. .假设服务器端收到如下的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. 则整个分发过程如下所示:1、 根据soap消息底层协中的地址去识别相对应的soap:ad

7、dress(wsdl:75)元素。个例子中的两个地址并不完全相同(主机名分别为localhost与),但是对等的,因此需要分发程序进行一些处理。2、 在找到相对应的soap:address元素之后,就可以根据其父元素的wsdl:port元素的binding属性找到相应的wsdl:binding元素,然后根据wsdl:binding元素的type属性找到相应的wsdl:porttype元素。wsdl:porttype元素是一组wsdl:operation元素的集合,这与java类中有一组方法是相对应的。因此wsdl:porttype对应java类,wsdl:operation对

8、应java类中的方法。这样就可以根据类中的标注找到相应的类。3、 调用子系统从soap中找到包装器元素getordersdates。在document/literal/wrapped样式的wsdl中,所有输入参数是被包装在一个与要调用的wsdl:operation同名的元素中的,因此根据这个包装器元素就可以确定相应的wsdl:operation,然后就可以根据类中的标注找到相应的方法,并将输入参数按照标注指定的对应关系反序列化为类的调用参数,从而完成整个分发过程。实验附件:实验1、使用jaxp进行xml的转换实验环境:eclipse3.4实验内容:1、 使用xslt进行xml格式之间的转换2、

9、 使用dom接口进行xml格式之间的转换。实验步骤:在soa系统的开发过程中,经常会遇到需要在不同格式之间进行数据转换的情况。本次实验使用jaxp(java api for xml processing)来进行不同xml格式之间数据的转换。假设现在有两个web服务:l 订单管理服务:该服务可以接收并处理新的订单。l 客户历史记录管理服务:该服务可以接收对客户历史记录的更新。而我们需要一个新的系统将上面两个web服务链接起来。在这个新的系统中,首先是订单管理服务接收新的订单,再把它们转换成客户历史记录,最后再将这些记录发送给客户历史记录管理服务。在这过程中,我们要把订单格式转换为客户历史记录格式

10、。订单与客户历史记录两种格式的xml模式文件夹分别为orders.xsd与custhistentries.xsd。两种数据格式及它们之间的对应关系如下图所示。客户历史记录cus001客户编号订单信息订单order001订单编号标头销售组织:.ne采购日期:2011-01-01客户编号:cus001支付方式:po定购单号:po-001保证交付日期:2011-01-07订单条目订单条目编号:goods001存储位置:ne02目标数量:50度量单位:kg每度量单位价格:7.95描述:这是商品1订单条目编号:goods002目标数量:5度量单位:个每度量单位价格:20描述:这是商品2订单编号:orde

11、r001定购单号:po-001商品编号:goods001商品编号:goods002其它信息:紧急订单紧急订单其它信息1、使用xslt进行xml格式之间的转换xslt(extensible stylesheet language transformations)是一种基于xml的一种强大且有效的数据转换引掣,可以很方便的解决数据转换的问题。xslt是声明式的语言,用于定义从原文档到目标文档的转换。xlst转换文件夹由一套模板规则组成(由xsl:template元素的实例代表),它们是根节点xsl:stylesheet元素的子元素。stylesheet元素中的各个子元素定义了如何根据原始文档来创建

12、目标文档的转换结构。xlst使用xpath语言来标识源文件中的数据块,在模板规则的帮助下,xpath表达式可以决定将相应的数据块放在目标文档的什么位置。程序开发步骤如下:第一步:打开eclipse,新建java项目xmltransform。新建java包schema,并将orders.xsd与cushistentries.xsd放在此包下,新建包xslt用于存放xslt文件,新建包code存放java代码。在项目根目录下新建文件夹xml并将用于转换的数据order.xml放在此目录下。第二步:在xslt包中新建文件order_to_history.xslt作为从订单记录到客户历史记录转换的样式

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的转换规则。在这段代码的开始处,可以看到一个模板元素匹配源文档中的”oms:orders”元素。在该模板元素的内部又定义了一个customerhistoryentries元素。模板内部的内容定义了目标文档的输出,所以这个模板提供了如何将一个oms:orders元素转换为一个css:customerhistoryentries的规则。在这个模板元素内,有一个指令元素。这个特殊指令告诉xslt处理器为oms:o

15、rders节点的子节点应用于样式表中的其它模板,并将转换的结果插入到目标文档中。这样一来就构造好了目标文档中的css:customerhistoryentries元素。从第19行开始定义了另一个用于匹配oms:order元素的模板。所以,如果oms:orders的所有子元素都是oms:order元素的实例,这些子元素就会由这个模板来处理并将处理结果插入到customerhistoryentries标签中。在该模板元素中又包含了另一个xsl:apply-templates指令,不过这个指令有一个select属性,其中的xpath表达式./oms:orderheader/ oms:purch_or

16、d_no对这个模板所匹配的子元素进行了限制。该xpath表达式说明了该该模板只适用于oms:orderheader的子元素oms:cust_no。这样就可以把oms:cust_no元素转换为css:customernumber元素,并将其插到目标文档的正确位置。该文件夹的剩余部分使用了另外一些模板元素定义了对源文档中的其它元素的处理,原理与此处相同,所以不再赘述。第三步:在java代码中处理xslt,可以使用jaxp(java api of xml processing)。jaxp中的javax.xml.transform.transformer类会根据样式表文件中指定的规则把源文档中转换成目

17、标文档。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转换文件夹的transformer对象。最后调用transformer的transform方法来完成实际的转换过程。第四步:运行程序,可以在xml文件夹下看到输出的custhistentry.xml文件。2、使用dom接口进行xml格式之间的转换。另一方面,我们也可以直接使用dom接口来完成xml的转换。dom是一种解析和修改xml文档的一种标准接口,它将xml文档转换为内存中的一棵由元素、属性和文本构成的树,通过对该节点树进行处理来完成对xml文

20、档的处理。本例中演示如何使用dom接口来完成与上例等价的转换,从而同时演示如何使用dom接口对xml文档进行读和写。第一步:在xmltransform项目中创建domxform类。该类是使用dom接口进行转换的主类。第二步: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文档的处理,首先要创建一个dom解析器工厂对象并使用该对象创建一个dom解析器。然后创建分别与源xml文档和目标xml文档相对应的document对象,并使用transformer对象将源xml文档读入与之相对应的document中,从而使其可以使用dom接口进行处理。第三步:根据目标文档的格式,在目标文档中创建新的节点,所需要的数据可以从源文档中查询。比如对于目标文档中的客户编号节点,可以通过以下方式添加: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方法创建了一个局部名称为customernumber的元素,它所在的命名空间是由string类型常量res_default_ns指定的。然后,使用document#getelementsbytagnamens方法在源文档中查找局部名称为cust_no,命名空间由string常量src_default_ns指定的元素,它在源文档中可以保证是惟一出现的。查找到的元素节点的第一个子节点是一个文本节点,文本节点的内容就是客户的编号。因此,可以读出该编号,在目标文档中使用document#createte

25、xtnode创建一个包含客户编号的文档结点,并使用element#appendchild方法将该文档节点添加为的子节点:customernumber的子节点。最后,再调用element#appendchild方法将:customernumber添加为:customehistoryentry的子节点。第四步:对于目标文档中的商品编号列表,可以使用与第三步相似的方法,找到源文档中的所有的商品编号节点,对于每一个节点,在目标文档中添加一个相应的节点。代码如下: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. 第五步:运行程序,可以看到得到了与使用xlst方法相同的目标文档。实验附件:实验2、使用sax进行xml的解析实验环境:eclipse3.4实验内容:1、 使用sax进行xml的解析 实验步骤:在web服务开发过程中,我们经常需要将xml文件解析成相对应的java对象。要完成xml解析的工作,需要使用相应的xml解析器。在实验1的第2个实验“使用dom接口进行xml格式之间的转换”中,我们已经看到了如何使用dom解析器对xml文件进行解析和修改,本实验将使用另外一种解析器sax来完成xml文件的解析。与do

28、m在内存中建立一棵节点树并通过对树的操作来完成对xml文件的处理相比,sax基于事件流的模型。解析器从顺序扫描整个xml文件,当遇到特定事件比如遇到元素起始标签、遇到元素闭合标签、遇到文件节点等,就会调用预先注册的事件处理程序来完成相应操作,从而完成整个文件的解析。与dom不同的是,sax只能进行文档的解析,而不能进行文档的修改。sax与dom的比较如下:domsax结构基于树的基于事件处理过程首先读入整个文档,然后在内存中建立节点树。程序通过访问节点树来完成xml的处理过程。程序提前注册事件处理程序。解析器扫描文档,当遇到事件时触发相应的事件处理程序。易用性较复杂,但比较灵活。较易使用,但功

29、能有限可进行的操作创建、解析、修改、删除只能进行解析。资源占用占用处理器和内存较多占用内存少,处理速度快。使用场景非顺序访问或要进行修改扫描大的文档。假设对于实验1的订单管理程序,程序在收到订单请求后,需要将xml文档解析成相应的java对象,以便程序的进一步处理。使用sax解析过程如下:第一步:在eclipse中新建项目xmlparser。创建包schema并将orders.xsd拷贝到该包下。第二步:首先,创建与orders.xsd中定义的类型相对应的java类并放置于bean包下。为了完成解析程序,共创建了四个java类,如下所示:l order:与 orders.xsd中的oms:or

30、dertype类型相对应。l orderheader:orders.xsd中的oms:busobj_header类型相对应。l orderitem:与orders.xsd中的oms:busobj_item类型相对应。l card:与orders.xsd中的oms:busobj_ccard类型相对应。另外创建了一个表示付款方式的枚举类型paymentmethod,因为oms:busobj_header的pymt_meth子元素只能取po和cc两个值。第三步:在parser包下创建sax事件处理类orderhandler。因为sax解析器是通过在扫描文档遇到相应的事件时触发提前注册的事件处理程序来

31、完成解析的,因此要求程序员创建自己的事件处理程序。orderhandler继承自org.xml.sax.helpers. defaulthandler类并重写了其中的三个方法:l startelement:当遇到一个元素开始标签的时候,会触发该处理函数。l endelement:当遇到一个元素的结束标签时,会触发该处理函数。l characters:当sax器解析出一个文本节点时,会触发该处理函数。orderhandler中定义了三个实例变量:l order:解析元素及其子元素时,代表当前解析的xml元素对应的order对象。l currentitem:解析元素及其子元素时,代表当前解析的xm

32、l元素对应的orderitem对象。l currentelementname:当解析出文本节点时,代表当前文本节点所在的父元素的名称。在三个重写的处理函数中,基本思想是根据遇到的元素的名称,分别进行不同的处理。具体处理过程如下:l startelement:如果是元素,就实例化order变量。如果是元素,就实例化order变量的orderheader属性。如果是元素,就实例化item变量。除此之外,使用currentelementname变量记录当前元素的名称供characters方法使用。l endelement: 如果是元素,就说明当前元素已经解析完毕,item变量就是与解析完成的元素相对

33、的对象,因此要将该对象添加到order变量的items,即orderitem的列表中。除此之外,还要清除currentelementname变量,说明当前元素已经解析完成。l characters:根据currentelementname的值设定order或item对象的属性。第四步:创建orderparser类作为order.xml的解析器。在解析过程中,为了保证文档是正确的,应当在解析之前先进行验证。所以在orderparser中创建validate方法,实现如下: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. 该方法中首先创建一个模式工厂类,将通过其工厂方法newschema创建一个schema对象。schema可以看作验证器的工厂,因此通过该对象可以创建一个验证器对象。然后调用验证器对象的validate方法,该方法会使用与schema对象相对应的schema文件去验证目标xml文档,如果有错的话,就会抛出异常。第五步:在orderparser类中创建parse方法来完成xml文档的解析。该方法实现如下: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.首先创建一个sax解析器

37、工厂,并设定该工厂产生的解析器会提供对命名空间的支持。否则的话,orderhandler对象的startelement和endelement的入参中localname和namespce会为空。然后创建解析器对象并注册给其orderhandler事件处理对象,最后调用parse方法来完成解析过程。第五步:创建main.java作为主程序。主程序中首先读入order.xml,然后分别调用orderparser的validate和parse方法来完成文档的验证和解析。运行程序,可以看到程序解析出了正确的信息: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. 数目:50.015. 数量单位:kg16. 单价:7.9517. 简介:这是商品118. 19. 订单条目20. 条目号:00221. 存储位置:null22. 数目:5.023. 数量单位:个24. 单价:20.025. 简介:这是商品226. 27. 订单信息:紧急订单实验附件:实验3、使用soapui查看soap消息实验环境:soapui

39、3.6.1实验步骤:soapui是一个通用的web服务客户端工具,使用soapui可以方便的查看web服务的wsdl文件以及客户端与服务器端通信所产生的soap消息,可以用于对所开发的web服务及客户端进行调试。本次实验和实验2、3均基于以下订单处理场景:1、 假设客户想要从网上订购一些商品,他会发送一个“客户订单”,其中包括客户编号、可选的订购单号、可选的信用卡信息,以及一个要购买商品的列表。2、 订单管理系统接收到“客户订单”后,会对订单进行处理,确定要订购的商品以及需要的付款方式,与库存管理系统进行交互,根据当前库存决定可能的商品发货日期。3、 最后,订单管理程序为客户发送一个响应消息订

40、单确认信息,其中包括了订购商品的付款信息以及预计的发货日期,作为给用户的收据。一个可能的例子如图所示:为了突出soa程序设计开发中的问题,在对场景设计编码过程中,使用一段简单的码代替了第2步中对“客户订单”的真实处理过程,从而将更多的注意力放在了客户端与服务端的交互上。本实验中使用的是soapui 3.6.1免费版。与正式版相比,免费版缺少了一些功能,但并不会对我们的使用造成太大影响。第一步:从实验2的附件中找到wsserver项目并将该项目导入到eclipse中。运行server.main.main,该类会把服务发布在http:/localhost:8088/requestorderserv

41、ice上,其wsdl可以通过http:/localhost:8088/requestorderservice?wsdl访问。第二步:打开soapui。如果打开程序的时候,弹出如下错误窗口的话:那么打开/bin/ soapui-3.6.1.vmoptions文件并添加一行,内容如下:-dsoapui.jxbrowser.disable=true重新运行程序即可。依次选择file-new soapui project,在弹出的窗口中输入项目名称以及wsdl的地址,点击确定,如下图所示:这样就在soapui中新建了一个项目。soapui会识别出wsdl文件中所有的绑定和操作,在左侧项目树状视图上双击

42、,可以在打开的对话框中看到服务和绑定的相关属性。该服务的属性对话框如下图所示:第二步:点击确定之后,可以看到soapui已经识别出wsdl中的服务与操作。双击request1,可以看出soapui根据wsdl中wsdl:types定义已经准备了请求soap消息的模板。替换其中的“?”占位符,将某些不需要的optional的节点删掉,从而创建一个请求消息。第三步:点击左上角的发送按钮,可以在右边看到服务器端返回的soap响应消息:第三步:soapui可以用来对web服务进行测试,从而帮助web服务开发人员对服务进行调试。首先,soapui可以通过添加断言(assertion)的方式对服务进行功能

43、性测试。首先,给请求添加一个测试集:在弹出的对话框中依次输入测试包和测试用例的名称,点击确定,可以看到soapui打开了测试用例编辑窗口,并且在左侧项目树状视图中可以看到相应测试包的信息。现在,就可以给请求添加断言。soapui支持多种断言,包括schema样式、简单字符串包含、xpath匹配、非soap错误、脚本断言等多种断言类型,可以进行各种不同的断言操作。可以点击添加断言按钮给请求添加一个断言:由于在返回的消息中会包括信息卡的持卡人姓名,因此可以在弹出的断言类型选择对话框中选择包含断言,包含的内容填写要发送的请求消息的持卡人姓名:重新发送请求,可以看到断言成立:第四步:还可以使用soap

44、ui进行负载测试,从而可以对服务的响应时间等性能因素进行测试。可以使用如果下方法添加测试集:在弹出的页面填写测试用例的名称,并在弹出的测试用例编辑对话框中填写相应参数。以下是使用5个线程运行20秒的测试结果,结果显示了响应时间、发送数据量等信息。还可以用如下方法添加对性能特征的断言:这些断言的使用方法与功能测试的断言的使用方法相似,此处不再重复。以上是对soapui的简单介绍。soapui是一个功能很强大的软件,如果想要进一步的了解的话,可以参照soapui的在线帮助:/getting-started/installing-soapui.html实验附件

45、:无实验4、使用jax-ws开发web服务服务器端实验环境:1、 jdk1.62、 eclipse3.4实验内容:1、 使用服务器端点接口(sei)从wsdl开始开发2、 不使用jaxb来实现服务提供者与xml处理3、 使用标注从现有java程序开始开发实验步骤:一、使用服务器端点接口(sei)从wsdl开始开发开发一个web服务的服务器端的一种情况是从一个已经存在的wsdl开始开发,要实现符合此wsdl契约的web服务,最直接的方式是使用服务端点接口(service endpoint interface,sei)。sei是根据jax-ws wsdl/java映射生成的java接口,在服务器端

46、实现该接口即可提供符合指定契约的web服务。假设我们现在已经有了实验1中提到的订单处理系统的wsdl文件,如本实验附件中的requestorder.wsdl所示。在该wsdl文件的wsdl:types元素定义中有如下元素:9. xs:schema targetnamespace=10. 11. 12. xs:schema targetnamespace=13. 15. 这两个元素从外部文件中导入了两个xml schema文件。在实际的开发过程中,经常会出来某些数据已经存在标准的格式(如订单),使用这些标准的数据格式可以使系统更易理解并提高系统的可扩展性。要生成sei,可以使用java se 6.0中的wsimport工具。该程序位于/bin目录中。实验步骤如下:第一步:新建文件夹wsdl并将requestorder.wsdl、faults.xsd与orders.xsd放在该目录下。第二步:打开命令窗口(cmd)并跳转到wsdl目录下,运行wsimport命令/bin/wsimport -d ./bin -s ./src -p server.sei requestorder.wsdl其中-d选项指明创建的class文件目录

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论