类型web是什么意思

web是什么意思  时间:2021-01-11  阅读:()

版权所有IBM公司2005商标Web服务编程技巧及窍门:改善J2EE与.
NET之间的互操作性,第2部分第1页,共8Web服务编程技巧及窍门:改善J2EE与.
NET之间的互操作性,第2部分管理集合、数组,乃至原始数据类型WangmingYe(yme@us.
ibm.
com)软件工程师IBM2005年2月01日该系列文章中的第2部分探索对于公共的互操作性的需求来源,该需求面向跨平台的Web服务集成.
跟随WangmingYe分析互操作的失败原因——使用某些数据类型,以及克服错误的方法(如使用集合、数组或原始数据类型).
引言该系列文章的第I部分讨论了在编码之前设计Web服务描述语言(WebServicesDescriptionLanguage,WSDL)和XMLSchema数据类型(XMLSchemadatatypes,XSD)的重要性,完全转换成文档或文字式样的基本原理,以及当开发Web服务的时候测试WS-IBasicProfile一致性的必要性.
本文阐明了数据类型的用法及其对互操作性产生的影响.
Web服务操作的输入参数及数据类型的返回值对于Web服务的互操作性产生非常大的影响.
Web服务用作XML文档转换的传送器.
当数据对象被放入Web服务栈中时,它们被序列化成XML数据表示.
另一方面,Web服务栈需要准确地知道如何将那些XML数据表示映射到本地应用程序环境的需求中(例如XML数据的反序列化).
XMLSchema定义驱动了映射.
XSD的目的是确保发送的类型在其他终端有可复写的版本.
但是由于基本技术(企业版Java2平台(Java2Platform,EnterpriseEdition,J2EE)与Mircosoft.
NET)的实现是不同的,所以XSD和那些平台上的本地数据类型之间的映射可能会不同.
某些差异可能导致反序列化的失败,而其它的可能导致信息失真.
在接下来的部分中,我将讨论一些有关数据类型的互操作性的问题,例如:提供商用于精确解释XMLSchema的工具是不存在的,XMLSchema代表弱类型的集合对象并将它们映射成正确的本地数据类型.
含有空元素的数组的XML表示不同于.
NET和IBMWebSphere.
由于缺乏本地和XSD数据类型所共享的一对一的映射,所以转译问题导致了信息的丢失或精度的降低.
developerWorksibm.
com/developerWorks/cn/Web服务编程技巧及窍门:改善J2EE与.
NET之间的互操作性,第2部分第2页,共8在Web服务方法签名中的复合数据类型集集合对象可能包括任何数据类型的元素.
因此,许多人把它们看作弱类型的数据结构.
这使得它们成为非常好的编程工具.
在面向对象的编程中,有大量的集合类型库.
例如,在Java中存在:java.
util.
HashtableVectorsHashmapSetArrayList而在C#中存在:System.
Collections.
HashtableSortedListQueueStackArrayList如果在整个Web服务中公布了这些集合类型,那么它们可能引发不能被解决的问题.
该问题是接收方如何能理解被序列化了的简单对象访问协议(SimpleObjectAccessProtocol,SOAP)消息,这些消息中包含弱类型对象元素及本地数据类型.
即使一些集合类型看上去与某些语言非常相似,例如C#中的System.
Collections.
ArrayList及Java中的java.
util.
ArrayList,记住集合中的元素是通用的参照.
为了准确地解组集合的XML表示,客户必须预先了解原始的具体类型.
这个任务交给工具包开发人员来解释Web服务提供者所发布的XMLSchemas并将SOAP消息映射到本地数据中——不是对于弱类型集合的简单任务.
现在,让我们来看一看Collection类型的XMLSchemas是什么样子.
这次,考虑部署在Microsoft.
NET框架上的Web服务.
假设InventoryService接受Product的System.
Collections.
ArrayList作为变量,为ArrayList中的每个产品设置新价格(增长了百分之10),并且返回System.
Collections.
ArrayList类型的新对象.
清单1.
在C#中Web服务的详细目录namespaceInventory{[WebService(Namespace="http://services.
inventory")]publicclassInventoryService:WebService{//increasetheproductpriceby10percentprivatestaticfloatinc_rate=0.
10F;publicstructProduct{publicstringname;publicintqty;publicfloatprice;}[WebMethod][XmlInclude(typeof(Product))]publicArrayListupdateProductPrice(ArrayListproducts){ArrayListnewList=newArrayList();ibm.
com/developerWorks/cn/developerWorksWeb服务编程技巧及窍门:改善J2EE与.
NET之间的互操作性,第2部分第3页,共8IEnumeratoreList=products.
GetEnumerator();while(eList.
MoveNext()){Productitem=(Product)(eList.
Current);item.
price=item.
price*(1+inc_rate);newList.
Add(item);}returnnewList;}}}在.
NET框架中的WSDL引擎生成了用于Collection类型、ArrayList以及Product复合类型的如下的XMLSchema:清单2.
用于ArrayList和Product的XMLSchema1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
从第9行到第13行(详见清单2)定义了复合类型xsd:ArrayOfAnyType,连同anyType元素的无界序列.
Products的ArrayList已经被翻译成了XMLSchema定义中的匿名元素序列.
这是所期望的;但是,它也引发了两个问题.
首先,其它的Collection类型也将被翻译成xsd:ArrayOfAnyType.
因此,在另一个平台上的SOAP工具包如何确定将它映射成哪种Collection类型其次,当没有指定类型的时候xsd:anyType就是缺省的类型.
清单2中的第11行是需要的,因为Collection中的对象是通用的参照——在运行之前并不知道类型.
当在另一个平台上的SOAP工具developerWorksibm.
com/developerWorks/cn/Web服务编程技巧及窍门:改善J2EE与.
NET之间的互操作性,第2部分第4页,共8包接收到序列化的对象时问题发生了.
您如何找出正确的序列化器来将XML载荷反序列化到具体的对象中事实上,JAX-RPC从清单2的xsd:ArrayOfAnyTypeschema中生成了如下的帮助类.
清单3.
用于xsd:ArrayOfAnyTypeschema的作为结果的帮助类publicclassArrayOfAnyTypeimplementsjava.
io.
Serializable{privatejava.
lang.
Object[]anyType;}从清单3中,您可以看到xsd:ArrayOfAnyTypeschema的不明确性已经导致JAX-RPC工具生成了帮助类.
该帮助类将通用的java.
lang.
Object[]数组作为它的私有字段,取代了具体的Product数组.
为了消除这种不明确性,您可以使用ArrayOfRealType来代替xsd:ArrayOfAnyType.
您应当仅公布具体类型的简单数组(也就是Product[]),将其作为Web服务方法的签名.
对于清单1中的Web服务,公布前端方法:清单4.
公布简单数组Product[]的前端方法[WebMethod][XmlInclude(typeof(Product))]publicProduct[]updateProductPriceFacade(Product[]products){ArrayListalist=newArrayList();IEnumeratorit=products.
GetEnumerator();while(it.
MoveNext())alist.
Add((Product)(it.
Current));alist=updateProductPrice(alist);Product[]outArray=(Product[])alist.
ToArray(typeof(Product));returnoutArray;}对于输入输出消息部分的新schemas是:清单5.
对于清单4中的新的Web服务的XMLSchema1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
ibm.
com/developerWorks/cn/developerWorksWeb服务编程技巧及窍门:改善J2EE与.
NET之间的互操作性,第2部分第5页,共816.
17.
18.
19.
从第8行到第12行,创建xsd:ArrayOfProductschema来表示具体的Product数组.
在schema中没有出现不确定的内容.
所以,最终Web服务客户端在反序列化Products数组的过程中没有遇到问题.
含有空元素的数组含有空元素的数组的XML表示不同于.
NET和WebSphere.
考虑清单6中所示的JavaWeb服务方法.
清单6.
返回含有空元素的数组的Java方法publicString[]returnArrayWithNull(){String[]s=newString[3];s[0]="ABC";s[1]=null;s[2]="XYZ";returns;}这里的String元素s[1]被赋为空值.
当.
NET客户端调用这个部署到WebSphere平台上的Web服务方法的时候,该String数组被序列化成:清单7.
来源于WebSphere的Web服务响应消息ABCXYZ数组中的第二个元素是设置xsi:nil="true".
这在Java中是非常有用的;Java客户端可以正确地将它反序列化成空的String值,该值是数组中的第二个元素.
然而,.
NET客户端将其反序列化成长度为0的字符串而不是空的字符串.
长长长0和长在面向对象的编程语言中是完全不同的概念.
现在,考虑另一个部署在WebSphere上的Web服务方法,如清单8所示.
清单8.
含有数组及其输入输出签名的Java方法publicString[]processArray(String[]args){//dosomethingtotheinputarrayandreturnitbacktotheclientreturnargs;}这次,Web服务方法将数组作为输入,处理它,并将这个数组返回到客户端.
假设.
NET客户端发出含有空元素的数组,代码如清单9所示.
developerWorksibm.
com/developerWorks/cn/Web服务编程技巧及窍门:改善J2EE与.
NET之间的互操作性,第2部分第6页,共8清单9.
.
NET客户端发出含有空元素的数组TestArrayServiceproxy=newTestArrayService();string[]s=newstring[3];s[0]="abc";s[1]=null;s[2]="xyz";//Console.
WriteLine("thelengthoftheinputarray="+s.
GetLength(0));string[]ret=proxy.
processArray(s);//Console.
WriteLine("thelengthoftheoutputarray="+ret.
GetLength(0));清单10展示了来源于.
NET客户端的SOAP请求.
清单10.
.
NET客户端发出的SOAP请求abcxyz.
NET客户端发出的SOAP请求省略了空元素s[1].
结果,返回的数组的长度不再与原始数组的长度一致.
如果这个数组的长度或者元素的索引对于客户端的逻辑来说是重要的,那么客户端将会失败.
最佳的实例不是将含有空元素的数组传递到Web服务的客户端及服务器上.
甚至原始的类型也能导致问题的出现XMLSchema通过提供了大量的类型模型来减弱了互操作性.
您可以构建WSDL消息及操作,因为XMLSchema能够识别Web服务所使用的特定的数据类型.
XSD提供了大量的类型以及简单的结构.
但是,每种编程语言都有一套自己的本地数据类型.
本地数据类型与XSD数据类型之间的一对一的映射是不存在的.
因此,在翻译过程中可能丢失信息,或者接收端不可能生成某些本地数据类型的映射.
无符号的数值类型(如xsd:unsignedInt长xsd:unsignedLong长xsd:unsignedShort和xsd:unsignedByte)是典型的例子.
在.
NET中,uint长ulong长ushort和ubyte类型直接地映射到那些xsd类型中,但是Java语言没有无符号的数值类型.
考虑到互操作性,不要公布那些在Web服务方法中的数值类型.
取而代之,您可以创建封装器方法来公布并传递那些数值类型,如xsd:string(使用C#中的System.
Convert.
ToString).
对于xsd:decimal长xsd:double和xsd:float类型,每个平台可能有不同的精度支持.
结果,如果您没有在整合之后测试Web服务那么可能会降低精度.
无论数据类型是数值类型还是引用类型,信息传递的一方都可能出现问题.
数值类型的对象位于栈中,但是引用类型的对象位于堆中.
这意味着引用类型可能有空指针,但是数值类型不能有空值.

如果XSD类型在一种语言中被映射成了数值类型,而在另一种语言中被映射成了引用类型,那么这可能导致问题的出现.
例如xsd:dateTime被映射成了System.
DateTime,这是C#中的数值类ibm.
com/developerWorks/cn/developerWorksWeb服务编程技巧及窍门:改善J2EE与.
NET之间的互操作性,第2部分第7页,共8型.
它也被映射成了java.
util.
Calendar,这是Java中的引用类型.
事实上,java.
util.
Date和java.
util.
Calendar都是引用类型.
在Java中,当引用类型没有引用任何对象时将其赋空值,这是公共的操作.
然而,如果.
NETWeb服务从Java客户端接收到数值类型为空值的数据时,将抛出System.
FormatException.
为了避免这个问题的出现,您可以定义复合类型来封装数值类型,并将这个复合类型置为空来表示空引用.
结束语在本文中,您可以看到由于使用某些数据类型而产生的一些互操作性的问题.
为了在使用数据类型时能够达到更好的互操作性,一般的规则是:尽量多地使用简单数据类型.
完全避免使用那些异样的复合类型,如ArrayList、Tree,甚至公共的Hashtable.
即使简单的数组通常都具有非常好的同Web服务的交互性,注意数组中的内容,确保数组中的元素在每个平台上的含义都是相同的,并且避免发出含有空元素的数组.

TMThosting:VPS月付55折起,独立服务器9折,西雅图机房,支持支付宝

TMThosting发布了今年黑色星期五的促销活动,即日起到12月6日,VPS主机最低55折起,独立服务器9折起,开设在西雅图机房。这是一家成立于2018年的国外主机商,主要提供VPS和独立服务器租用业务,数据中心包括美国西雅图和达拉斯,其中VPS基于KVM架构,都有提供免费的DDoS保护,支持选择Windows或者Linux操作系统。Budget HDD系列架构CPU内存硬盘流量系统价格单核51...

妮妮云(119元/季)日本CN2 2核2G 30M 119元/季

妮妮云的知名度应该也不用多介绍了,妮妮云旗下的云产品提供商,相比起他家其他的产品,云产品还是非常良心的,经常出了一些优惠活动,前段时间的八折活动推出了很多优质产品,近期商家秒杀活动又上线了,秒杀产品比较全面,除了ECS和轻量云,还有一些免费空间、增值代购、云数据库等,如果你是刚入行安稳做站的朋友,可以先入手一个119/元季付的ECS来起步,非常稳定。官网地址:www.niniyun.com活动专区...

搬瓦工最新套餐KVM,CN2线路

搬瓦工在国内非常流行的主机商,以提供低价的vps著称.不过近几年价格逐渐攀升.不过稳定性和速度一向不错.依然深受国内vps爱好者喜爱.新上线的套餐经常卖到断货.支持支付宝,paypal很方便购买和使用.官网网站:https://www.bandwagonhost.com[不能直接访问,已墙]https://www.bwh88.net[有些地区不能直接访问]https://www.bwh81.net...

web是什么意思为你推荐
虚拟主机虚拟主机是怎么一回事?已备案域名查询如何快速查询已备案域名并抢注vpsvps和服务器哪个比较划算ip代理地址ip代理有什么用?有图片..免费域名空间求1个免费空间送域名那种域名备案什么是域名备案?asp网站空间什么是ASP空间?100m网站空间100M网站空间可以存多少张图片和多少文字?北京网站空间自己弄一个简单的网站,大概需要办理什么,大概需要多少钱?重庆网站空间重庆建网站选择哪家比较好,还有域名空间等,
域名升级访问中 万网域名解析 怎样申请域名 80vps oneasiahost Hello图床 双12活动 新世界电讯 腾讯云分析 vip购优汇 129邮箱 如何安装服务器系统 安徽双线服务器 免费mysql数据库 联通网站 测试网速命令 重庆联通服务器托管 上海联通 美国主机 htaccess 更多