类型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服务的交互性,注意数组中的内容,确保数组中的元素在每个平台上的含义都是相同的,并且避免发出含有空元素的数组.

Virmach($5.23/年)年付VPS闪购

每每进入第四季度,我们就可以看到各大云服务商的促销力度是一年中最大的。一来是年底的促销节日活动比较多,二来是商家希望最后一个季度冲刺业绩。这不还没有到第四季度,我们看到有些商家已经蠢蠢欲动的开始筹备活动。比如素有低价VPS收割机之称的Virmach商家居然还没有到黑色星期五就有发布黑五促销活动。Virmach 商家有十多个数据中心,价格是便宜的,但是机器稳定性和速度肯定我们也是有数的,要不这么低的...

gcorelabs远东khabarovsk伯力Cloud云服务器测评,告诉你gcorelabs云服务器怎么样

说明一下:gcorelabs的俄罗斯远东机房“伯力”既有“Virtual servers”也有“CLOUD SERVICES”,前者是VPS,后者是云服务器,不是一回事;由于平日大家习惯把VPS和云服务器当做一回事儿,所以这里要特别说明一下。本次测评的是gcorelabs的cloud,也就是云服务器。 官方网站:https://gcorelabs.com 支持:数字加密货币、信用卡、PayPal...

提速啦(24元/月)河南BGP云服务器活动 买一年送一年4核 4G 5M

提速啦的来历提速啦是 网站 本着“良心 便宜 稳定”的初衷 为小白用户避免被坑 由赣州王成璟网络科技有限公司旗下赣州提速啦网络科技有限公司运营 投资1000万人民币 在美国Cera 香港CTG 香港Cera 国内 杭州 宿迁 浙江 赣州 南昌 大连 辽宁 扬州 等地区建立数据中心 正规持有IDC ISP CDN 云牌照 公司。公司购买产品支持3天内退款 超过3天步退款政策。提速啦的市场定位提速啦主...

web是什么意思为你推荐
海外虚拟主机国内访问速度较快的海外虚拟主机有哪些呀网络服务器租用服务器租用 使用方法网站空间购买企业网站空间购买的网站空间具体需要多大的合适?便宜虚拟主机麻烦各位给我推荐一个比较便宜的虚拟主机,要质量好的。谢谢大家了大连虚拟主机大连华企智源是做网站的吗?美国虚拟主机推荐美国独立ip虚拟主机哪儿有,推荐下?www二级域名一级域名 二级域名 三级域名什么区别域名邮箱最好的邮箱域名有什么?org域名org域名怎么样域名抢注域名抢注是什么意思啊?
a5域名交易 新网域名管理 zpanel 主机评测 免费主机 双12活动 服务器日志分析 patcha 免费smtp服务器 流媒体加速 电信托管 宏讯 smtp服务器地址 中国电信测速网站 七牛云存储 网站防护 wordpress空间 forwarder web是什么意思 wannacry勒索病毒 更多