Java ME的Web服务规范的深入分析

时间:2022-10-21 06:38:31

Java ME的Web服务规范的深入分析

摘要:介绍了Java ME的Web服务规范,比较了该规范定义的可选包与kXML和kSOAP之间的不同,指出了JavaME的JAX-RPC与Java SE/EE平台上的JAX-RPC 1.1之间的差异,并给出了这些差异给Java ME程序设计者带来的影响,为开发者提供了一些有价值的参考。

关键词:Java ME;Web服务;JSR 172;JAX-RPC

O引言

在有线网络环境中,Web服务已经成为实现企业业务系统之间协同工作的一种关键技术,Web服务也使企业更容易实现和影响新的服务交付类型,以及更方便在企业合作伙伴、企业和客户之间进行沟通。Web服务的下一步目标,就是在任何地点都可以使用无线移动设备访问企业应用或数据,也就是无线Web服务。目前,许多开源软件已经开始尝试为无线Web服务提供支持,如NanoXML,TinyXML,kXML,kSOAP和kXML-RPC等。不过,由于使用这些软件通常会增加无线移动设备客户端应用的大小,并且其编程接口也不统一,所以它们并不是企业最佳的选择。2004年3月,由JCP(Java Community Process)制定的、旨在为Java ME应用提供Web服务支持的JSR 172规范正式,它为企业寻求无线Web服务解决方案提供了一种新的选择。借助Java手持设备,特别是Java手机的普及,它极有可能成为Java平台上最佳的无线Web服务解决方案。本文对该规范进行了深入的分析,指出了它与企业已存在的有关标准或应用编程接口之间的不同之处,给出了一些建议,为Java ME平台上的Web应用的开发提供参考。

1 Java ME的Web服务规范简介

Java ME的Web服务规范,即JSR 172为Java ME应用增加了两大功能:一是使其能够访问基于SOAP/XML的远程Web服务;二是使其具有解析XML数据的能力。与这两大功能对应的两个可选包,即Web服务访问可选包和XML解析可选包可以单独或共同集成到Java ME设备的runtime(运行时环境)中。由此,开发者不必把这些功能包含到每一个使用它们的Java ME应用中,这对资源受限的设备如手机和PDA来说是非常必要的。Java ME目前包括两大体系结构,CLDC体系和CDC体系,JSR 172的这两个可选包可以在这两大体系上工作。

1.1 Web服务访问可选包

JSR 172中用于访问远程Web服务的API是JAX-RPC1.1(用于Java SE/EE平台)的―个子集,这里称之为Java ME的JAX-RPC。Java ME的JAX-RPC遵循如下核心Web服务规范:SOAP 1.1、WSDL 1.1、XML 1.0、XML Schema。不过它并不支持UDDI 2.0规范,因此利用它访问Web服务的Java ME应用将无法在运行中动态地“发现"Web服务。无论如何,Java ME的JAX-RI~符合WS-I基本概要1.0(WS-I Basic Profile1.0)。Java ME设备特别是基于CLDC的设备(比如手机)内存资源有限,处理能力较弱,并且一般没有一个确定的IP地址,JavaME的JAX-RPC目前只为Java ME设备提供消费Web服务的能力,而没有提供创建和部署Web服务的能力。除此之外,其体系结构遵循Web服务的标准结构,如图1所示。

作为Web服务的消费者(使用者),客户端包括Java ME应用程序,比如基于CLDC的MlDlet或基于CDC的Xlet,一个JAX-RPC Stub和相关支持类,以及JAX-RPC Runtime。

Java ME的JAX-RPC也遵循标准Web服务的调用模型和数据流。Java ME应用通过JAX-RPC Stub调用远程服务。JAX-RPC Stub隐藏了与JAX-RPC Runtime交互以及数据编码的复杂性。JAX-RPC Runtime负责管理远程调用和网络操作,调用过程遵循同步请求一响应模型,如图2所示。

在Java ME应用中使用Web服务访问可选包主要包括如下3个步骤:(1)使用相关工具从WSDL文档产生一个JAx-RPCstub类;(2)在Java ME程序中创建―个该stub的实例;(3阙用该stub类的方法以访问远程Web服务。

1.2 XML解析可选包

JSR 172中用于解析XML的API是基于JAXP 1.2(用于Java SE/EE平台)和SAX 2的一个子集,这里称之为Java ME的JAXP。JSR 172规定XML解析器必须符合XML 1.0规范,但可以基于DTD确认也可以不确认。解析器须遵循XML 1.0规范中给出的确认或非确认规则。由于确认是一个代价高昂的操作,是否实现一个需要确认的解析器,由设备供应商根据其设备的内存资源大小和处理能力强弱决定。另外,JSR 172要求XML解析器必须支持XML名字空间,UTF-8和UTF-16字符编码,以及DTD,但对DOM和XSLT不作要求。Java ME的JAXP提供了解析XML文档所需的全部功能。事实上,在解析XML文档时,可能只需使用该JAXP的一部分功能。JavaME的JAXP的使用包含3个主要步骤:(1)编写应用程序的事件处理器(handler);(2)创建一个SAX解析器实例;(3)解析输入的XML文档。

2 JSR 172的可选包与kXML和kSOAP的比较

在JSR 172推出之前,Java ME应用通常使用kXML和kSOAP类库来解析XML数据和调用Web服务。JSR 172的出现并没有让kXML和kSOAP过时,原因是它们工作在较低层次,可以为开发者提供很大的灵活性。JSR 172的可选包与kXML和kSOAP主要有以下不同:

(1)XML解析模式不同。JSR 172中的XML解析可选包仅支持推式的SAX模式,而kXML支持推式的SAX、拉式的XMLPull,以及kDOM(轻量级的DOM)模式。由于SAX模式比较节省内存空间,因此比较适合Java ME设备。

(2)Web服务访问可选包以Java为中心,kSOAP以XML为中心。使用JSR 172的Web服务访问可选包,SOAP RPC调用如同Java本地RMI RPC调用,使用Web服务是非常直接和几乎透明的,不过开发者不能直接控制低层的SOAP消息。相反,kSOAP允许开发者窥探XML内部结构,增加定制的头/属性,以及操纵任意结点。

(3)Web服务访问可选包不支持扩充的类型映射,而kSOAP是支持的。因此kSOAP可以访问低层的SOAP结构,而可选包不可以。

(4)Web服务访问可选包支持Web服务网关(经由SPI即 服务提供者接口),从而可以优化系统的运行效率(比如在设备和网关之间使用二进制编码)。kSOAP直接访问Web服务,但由于Java ME设备的计算能力有限,对SOAP&XML消息的解析处理速度不是很高,因此与使用了Web服务网关的可选包相比,kSOAP的系统效率较低。

3 Java ME的JAX―RPC与JAX―RPC 1.1之间的差异及给开发者带来的影响

WS-I基本概要1.0通过对Web服务中的技术如SOAP1.1、XML 1.0、XML Schema、WSDL 1.1,以及UDDI 2.0的标准化,尽量保证不同的Web服务的互操作。JSR 172要求JavaME的JAX-RPC必须符合WS-I基本概要1.0,因此,Java ME的JAX-RPC会忽略掉JAX-RPC 1.1中不符合WS-I基本概要1.0的部分。遵循WS-I基本概要1.0可以增大Java ME应用使用各种Web服务的机会,不过,当Java ME应用在使用没有实现该概要的JAX-RPC 1.1 Web服务的时候,可能会遇到问题。

JAX-R1.1支持3种类型的调用:静态stub,动态(Dynamic Proxy),以及动态调用接口DII(Dynamic InvocationInterface)。静态stub缺乏灵活性,但代码最简洁;DII最灵活,但实现起来也最复杂。Java ME的JAX-RPC仅支持静态stub,开发者可使用WSDL到Java的映射工具来产生stub。缺乏对动态和DII的支持对Java ME应用并没有什么负面影响,在Java ME平台上静态stub工作得很好,惟一的不便之处是开发者必须提前产生这些stub。

JAX-RPC 1.1为Java应用提供了使用Web服务的能力,也提供了创建和部署Web服务的功能。Java ME的JAX-RPC目前只为Java ME设备提供使用Web服务的能力,开发者不能使用Java ME的JAX-RPC在Java ME设备上创建Web服务端点。

JAX-RPC 1.1指定了3种客户应用交互模型:同步请求一响应双向PRC、异步(非阻塞)请求一响应双向PRC,以及单向PRC。Java ME的JAX-RPC仅支持同步请求一响应双向PRC。缺乏对另外两种交互模型的支持对Java ME应用并没有多大影响,作为最流行的PRC交互模型,同步双向PRC对Java ME应用来说已经足够。开发者需要记住的是,使用同步双向PRC,请求发出之后Java ME应用会被阻塞,直到收到返回的响应或者抛出一个异常。为避免出现阻塞,开发者应该把RPC调用操作分派到一个单独的线程中。

JAX-RPC 1.1指出了SOAP与Java之间数据类型的映射关系。由于硬件平台的限制,Java ME的JAX-RPC并不支持JAX-RPC 1.1的所有的基本数据类型。比如,Java ME的JAX-RPC不支持类型java.math.BigDecimal。另外,如果设备采用CLDC 1.0配置层,浮点类型将被映射成String类型。类型映射限制可能会给开发者带来很大麻烦,开发者需要适应不能使用某些常用数据类型(包括dateTime、date和time类型)的JavaME环境,也需要为Java ME应用创建专门的WSDL文件,因为包含有不支持类型的WSDL文件不能产生Java ME应用使用的stub。

JAX-RPC 1.1支持soapenc:Array类型的数组以及wsdl:arrayType属性,而Java ME的JAX-RPC不支持它们。在JavaME的JAX-RPC中,当元素的maxOccurs属性大于1或者为unbounded时,就产生一个数组。不管怎样,在JAX-RPC 1.1和Java ME的JAX-P-uC中,Java数组元素类型都基于XML数组模式(schema)。由于不支持soapenc:Array和wsdl:arrayType,JavaME应用将不能消费使用它们描述的数组的Web服务。不过,由于WS-I概要不赞成使用soapenc:Array和wsdl:arrayType,所以它们对Java ME应用的影响很有限。

在对复杂类型的支持方面,JAX-RPC 1.1支持指定xsd:se-quence元素、xsd:all元素和xsd:simpleContent元素的xsd:com-plexType,并且同时支持xsd:attribute和xsd:attribute Group。JavaME的JAX-RPC仅支持指定xsd:sequence元素的xsd:complex-Type,并且不支持xsd:attribute、xsd:attributeGroup或xsd:any。因此,Java ME应用将不能消费那些包含有使用了它不支持的方法或属性描述的复杂类型的Web服务。另外,JAX-RPC 1.1支持枚举(enumeration)以及有约束的或使用了xsd:list的简单类型,而Java ME的JAX-RPC不支持它们,这会导致Java ME应用不能消费使用了这些特性的Web服务。

JAX-RPC 1.1支持Java类型和XML类型之间的扩充类型映射和序列化,而Java ME的JAX-RPC不支持扩充类型映射,这意味着开发者不能自己定义Java到XML的序列化。由于扩充类型映射的定义松散,不同的供应商对它的实现方法也不同,加之大多数Web服务并不使用它,所以Java ME应用开发者可以不理会它。

WSDL到Java映射方面,JAX-RPC 1.1支持wsdl:portType中的wsdl:operations名字重载,规定parameterOrder属性必须反映出PRC方法的参数顺序。遵循WS-I基本概要,Java ME的JAX-RPC规定wsdl:portType中的wsdl:operations的名字必须惟一,规定消息的各组成部分的顺序,而不是parameterOrder属性必须与PRC方法参数的顺序一致。由此,Java ME应用将不能消费那些重载wsdl:portType中的操作名的Web服务,不过,因为符合WS-I基本概要已经变得很盛行,操作名重载问题和参数顺序问题将会越来越少见。

JAX-RPC 1.1支持SOAP消息处理器(handler),开发者可以利用它实现附加的SOAP消息处理,比如加密消息或者缓存消息。Java ME的JAX-RPC不支持SOAP消息处理器,因此,Java ME应用不能在处理SOAP消息时实现一些高级特征。

JAX-RPC 1.1支持包含有以MIME格式编码的附件(attachment)的SOAP消息,Java ME的JAX-RPC不支持此类SOAP消息,由此带来的后果是Java ME的Web应用不能发送和接收复杂的参数值和返回值,比如图像或XML文档。

JAX-RPC 1.1支持RPC和文档(document)样式的操作,支持编码的(encoded)和文字的(1iteral)SOAP消息编码,而Java ME的JAX-RPC仅支持文档样式的操作和文字的SOAP消息编码。因此,Java ME应用将不能与依赖RPC和编码样式的Web服务相互操作。值得庆幸的是,为符合WS-I基本概要的要求,目前Web服务正在抛弃RPC/编码样式SOAP通信,转向文档/文字样式SOAP通信。

在JAX-RPC 1.1中,SOAP fault或者被映射到javax.xml.rpc.soap.SOAPFaultException,或者被映射到―个服务特有的异常类,或者被映射到RemoteException。而Java ME的JAX-RPC不支持SOAPFaultException,SOAP fault要么被映射到一个服务特有的Java异常类,要么被映射到RemoteException。为避免这些差异带来的影响,开发者应该在调用Web服务的时候,在catch语句块中使用RemoteException。

4结束语

JSR 172可选包为Java ME应用提供了访问远程Web服务和解析XML数据的能力。作为Java ME平台上专用的可选包,它们为企业寻求无线Web服务解决方案提供了一种新的选择,具有广阔的应用前景。开发者必须记住,这些可选包是专为资源受限的Java ME设备设计的,它们与企业已存在的有关标准或API之间有许多不同之处。只有充分了解这些不同,才可以为Java ME设备编写出有效的Web服务应用。

(注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。)

上一篇:凸现学科特色,打造精品力作 下一篇:开放型项目学习促进计算机应用能力培养的探索