1、计算机论文:基于 J2ME 平台的 SOAP 协议研究与应用 摘 要:本文对于在 J2ME 平台下,利用 XML 解析器开发 SOAP 协议的基本方法进行了研究,介绍了 J2ME 平台和 SOAP 协议,其中重点探讨了 XML 的开发,提出了一种利用XML 解析器在 J2ME 平台上实现 SOAP 协议的方法,具有一定的推广价值。关键词:J2ME SOAP XML 嵌入式系统1 引言J2ME 作为嵌入式系统应用平台得到了迅速的发展,JAVA 语言固有的平台无关性使得基于J2ME 平台的嵌入式应用系统具有广阔的前景。受限于嵌入式设备及消费类电器硬件条件的限制,J2ME 平台提供的功能有限,如何能
2、够在有限的资源下拓展 J2ME 的功能,使得J2ME 平台能够处理 SOAP 协议是本文研究的重点。目前企业应用正在向面向 WEB 服务的 SOA 架构转变,嵌入式系统与企业应用系统的连接目前还处于 TCP/IP 协议、HTTP 协议等比较初级的阶段。随着企业应用系统提供的 WEB服务日益广泛和成熟,需要 J2ME 平台提供处理 SOAP 协议的需求也越来越多。SOA 架构是目前企业应用系统广泛部署的架构,实现 SOA 的关键问题之一就是对 SOAP协议的支持。本文分析了在 J2ME 平台中实现 SOAP 协议处理遇到的问题,提出了相应的解决方案。2 j2ME 介绍1 2 3J2ME(Java
3、 2 Platform Micro Edition)是为无线电子市场所设计的 JAVA 平台,包括 JVM规范和 API 规范。J2ME 定义了一套类库和虚拟机技术,这些技术可以使用户、服务提供商和设备制造商通过物理(有线)连接或无线连接,按照需要随时使用丰富的应用程序。J2ME 同时提供了 Java 语言一贯的跨平台性和安全性。为了支持用户和嵌入式市场提出的灵活性和可定制性要求,J2ME 被设计得更加模块化和可缩放化。J2ME 在设备原有的操作系统上建造了 3 层软件来实现这种要求:1JVM 层:这层基于宿主操作系统,按照某一种 J2ME 的配置实现了 JVM。2配置层:这层对于用户可见度要
4、低一些,但对简表层非常重要。它针对不同市场的需求,定义了 Java 虚拟机的最小功能集合和 Java 类库的最小集合。在 J2ME 设备中,JVM 与配置层紧密相连,它们体现了每一类设备的基本功能。3简表层:这层对于用户和应用程序提供者来说是最常见的。它针对特定市场的需求,定义了 Java 虚拟机的最小功能集合和 Java 类库的最小集合。J2ME 组件都围绕一个中心,这些中心被称为 configuration(配置) ,它们中间的每一个都是用于消费电子和嵌入设备的特别的类。目前配置分为 CLDC 和 CDC 两种。Connected limited device configuration(
5、有限连接设备配置,简称 CLDC)定义支持“devices that you hold in your hand(握在手中的设备) ”的应用程序接口和技术,这类设备的代表是PDA。Connected device configuration(连接设备配置 CDC )定义支持“devices that you plug into plug into the wall(插入墙的设备) ”的应用程序接口和技术,这类设备的代表是机顶盒。这两种配置不同的地方就在于它们应用于的装置的能力,CLDC 设备的处理器能力有限 (与台式机系统比较 ),并且存储器大小一般也只在 128 KB 到 512 KB 之间
6、。CDC 系统不同,它可能有 32 位或 64 位处理器,以及有限的存储容量,不过它的下限也得超过 512K。 上图解释配置和简表的体系结构。J2ME 的体系结构被横向地分成三层,纵向分成两部分。配置包括一个控制配置核心类的虚拟机,具体的简表位于每个配置之上。简表为相同消费电子设备的不同的生产商提供了标准化的 Java 类库,现在五个已知简表已经有了规范:Mobile information devices profile (MIDP) 移动电话和呼叫器 CLDC Personal digital assistant profile Palm 和 Handspring 的 PDA 设备 CLD
7、C Foundation profile 用于所有不需要 GUI 的 CDC 设备的标准简表 CDC Personal profile 替代 PersonalJava 的 Foundation 完善的简表 CDC RMI profile 提供 RMI 的 Foundation 完善的简表 CDC 3 SOAP 协议介绍4SOAP(简单对象访问协议)是一种利用 XML 编码数据的数据传输协议。它是同类协议中要求最低的一个规范,只定义了协议所要求的最关键的部分,有意地忽略了垃圾收集、对象激活等方面的细节。像 TCP/IP 协议一样,SOAP 协议也包括客户端和服务器两个部分。SOAP 客户端是一种
8、创建 XML 文档的程序,该 XML 文档包含在分布式系统远程调用方法所需的信息。SOAP 客户端不是传统意义上的程序,它除了用作普通的桌面应用程序外,还可以是一种 Web 服务器或基于服务器的应用程序。来自 SOAP 客户端的消息和请求一般是通过 HTTP 发送的。因而,SOAP 文档可以穿过几乎所有的防火墙,从而能跨越不同的平台交换信息。SOAP 服务器只是用于监听 SOAP 消息的特殊代码,它可用作 SOAP 文档的分配器和解释器。外部 Web 服务可以与基于 J2EE 技术的应用程序服务器交互,这种应用程序服务器可以处理多种客户端的 SOAP 请求。SOAP 定义了数据编码规则,称为基
9、准编码或“Section 5(第 5 节) ”编码,它是出自 SOAP规范中描述数据编码规则的内容。SOAP 编码可以简短地描述成简单值或复合值的集合。简单值可以是简单类型,如整型、浮点型和字符型,或者是 XML 架构规范第 2 部中定义的内置类型,包括各种数据类型,如字节型数组和枚举。计算机论文复合值包括结构、数组和 XML 架构制定组定义的复杂类型。SOAP 在标准化消息格式环境中,可以做所有它能完成的工作。消息的主体部分是“text/xml”形式的 MIME 类型,并且包含一个 SOAP 封套。该封套是一个 XML 文档。封套包含了报头(可选的)和报文(必须有的) 。封套的报文部分总是用
10、于最终接收的消息,而报头项目可以确定执行中间处理的目标节点。附件、二进制数字及其他项目可以附加到报文上。SOAP 提供了一种让客户端指定哪个中间处理节点必须处理报头项目的方法。由于报头与SOAP 消息的主体内容是互不相关的,所以可用它们给消息添加信息,而不会影响对消息报文的处理。4 SOAP 协议在 J2ME 平台中的实现如何真正地将移动设备融入到 Web Services 中去呢?这就需要使得 PDA、手机等成为 Web Services 的客户端,因此这些设备至少应该具有处理 XML 信息的能力。在 J2ME 平台中实现 SOAP 客户端的功能,使得嵌入式设备能够连接企业的 WEB 服务是
11、企业应用中比较常见的需求。J2ME 的基本类库中没有提供 SOAP 的支持,所以需要在 J2ME 平台中开发实现 SOAP 的处理功能。实现 SOAP 协议客户端的关键问题分为两个方面:J2ME 不同配置的数据类型不一样,导致与 SOAP 协议封装的数据类型不匹配;J2ME 平台没有提供对 XML 文件进行处理的功能。针对第一个问题,需要注意只能使用基本类型,对不匹配的数据类型采用使用基本类型复合的方式进行处理。针对第二个问题需要在 J2ME 中扩展对 XML 文件处理的功能。目前有有两种方法对 XML 文件进行解析。一种是采用 DOM 的方式,另外一种是采用 SAX 的方式。操作 DOM 是
12、一个与 XML 相互作用的简单方法,通常这个 XML 是一棵完整的XML 树,被解析成一个存放在存储器中的节点结构,你可以遍历这棵树。它非常简单易用,但是因为整棵树存在于存储器中造成存储器的负担,而对于嵌入式系统来说存储器的资源是有限的,因此这种方法的使用具有一定局限性。第二种方法在捕捉语法分析事件中,每当语法分析程序遇到数据中的特定结构,它就会遍历 XML 数据,然后把结果发回前面注册的一个事件监听器中。比如说,当语法分析程序遇到一个起始标记,如html,那么事件监听器将接收一个事件,通知它这个情况,并且向它传递任何所需的信息。相对DOM 方式的处理,SAX 方法对存储器的要求比较低,但是效
13、率要比 DOM 方式低。Enhydra 的 KXML 是一个只占很小存储空间的 XML 语法分析程序,对于 J2ME 应用程序非常适合。KXML 支持 DOM 语法分析和操作,但是不支持 SAX 语法分析。取而代之,它使用一种稍微不同的称为“Pull”的分析方法。下面是 KXML 采用 DOM 的方式处理 XML 数据的例子: 1.Document doc = new Document();23.parser = new XmlParser(abc);4.doc.parse( parser ); 第一行创建了一个文档对象,保存 XML 树。第三行从一个名为 abc 的 InputStreamR
14、eader中创建一个 KXML 语法分析程序。第四行传送这个语法分析程序到文档,然后让文档开始分析。XML 被递归分析,直到到达文档的结尾。当分析调用退出时,整个文档被装入内存,这时就可以对 XML 进行操作了。 1.Element root = doc.getRootElement();2.int child_count = root.getChildCount();34.for (int i = 0; i child_count ; i+ ) 56. Element kid = root.getElement(i);7.8. if (!kid.getName().equals(“abc“)
15、 9. continue;10. abc元素是根元素的直接子元素,可以遍历根元素的子元素,寻找 abc 标记,如果子元素不是一个 abc 标记,则返回。 1.int address_item_count = kid.getChildCount();2.3. for (int j = 0; j abc_item_count ; j+) 4 如果找到了 abc 子元素,开始遍历它的子元素,并把这些子元素的内容打印出来。通过 KXML 对 XML 的处理,可以进一步实现对 SOAP 数据的处理,实现 J2ME 平台对SOAP 协议的支持。J2ME Web Services 规范(JSR172)的制订
16、给 J2ME 平台增加两大功能:一是使其能够远程访问基于 SOAP/XML 的 Web Services;二是使其具有解析 XML 数据的能力。目前 JSR172的标准已经制定完成,为了实现这两大功能,JSR172 新定义了提供相应功能的两个可选包。这两个包占用内存非常少,XML-RPC 部分大概需要 25-30KB 的空间,而 XML 解析器则需要 35KB 左右。规范只对 JAX-RPC 的模型提供支持,也就是说仅支持同步的访问方式,使用 J2ME 客户端可以向服务器发送 RPC 请求和获得 RPC 响应。在 JSR 172 中实现的是 SAX 模式的解析器。能够解析 XML 之前首先需要
17、创建 SAXParser 的实例, SAXParserFactory factory = SAXParserFactory.newInstance();SAXParser saxParser = factory.newSAXParser();接下来要获得 XML 文件的输入流,并把它作为其中一个参数传递给 saxParser 的 parse 方法, InputStream is = this.getClass().getResourceAsStream(“phone.xml“);SaxParser.parse(is,new BasicHandler(this);DefaultHandler 是
18、 SAX2 默认的事件处理器基类,用于处理 XML 解析事件的方法如下: startDocument() startElement(java.lang.String uri, java.lang.String localName, java.lang.String qName, Attributes attributes) characters(char ch, int start, int length) endElement(java.lang.String uri, java.lang.String localName, java.lang.String qName) endDocume
19、nt()默认情况下,DefaultHandler 的上述方法什么也不做,因此必须自己扩展 DefaultHandler 并且覆盖上述的方法。程序中提供了一个 BasicHandler 用来处理 xml 文件。class BasicHandler extends DefaultHandler 在 BasicHandler 类中有两个成员变量 private Vector phones = new Vector();private Stack tagStack = new Stack();phones 用来存储我们已经解析出来的 Phone 对象,tagStack 则用来存放我们解析到的元素名称,
20、比如 sonyericsson,phone,name,colour 等。在文档解释结束后,也就是在endDocument()方法内我们把解析的结果显示在手机屏幕上,BasicHandler 的几个重要方法如下: public void startDocument() throws SAXException public void startElement(String uri, String localName, String qName, Attributes attributes)throws SAXException System.out.println(“the qName is “+
21、qName);if(qName.equals(“phone“) Phone phone = new Phone();phones.addElement(phone);tagStack.push(qName);System.out.println(“the tag stacks length is “+tagStack.size();public void endElement(String uri, String localName, String qName) throws SAXException System.out.println(“the end qName is “+qName);
22、tagStack.pop();5 结束语通过扩充 J2ME 平台对 XML 数据的处理,完成了 J2ME 平台对 SOAP 协议的支持。通过SOAP 协议能够使得基于 J2ME 平台的嵌入式设备无缝的连接到企业现有的应用系统,解决了嵌入式设备数据来源不足的问题,扩展了嵌入式系统的应用范围。本文从处理 XML数据出发,深入探讨了在 J2ME 平台中实现 SOAP 客户端的各种技术,对于企业应用系统的集成具有一定的推广价值。参考文献1 Yuan,Michael Juntao. Enterprise J2ME. Pearson Education 20032 胡虚怀,杨志,李焕. J2ME 移动设备
23、程序设计. 清华大学出版社 20053 施铮. J2ME 技术参考手册 . 电子工业出版社 20044 杨涛. SOAP:XML 跨平台 Web Service 开发技术. 机械工业出版社 2002本文由无忧论文网(会计)发表中心独家提供资源,如有雷同,纯属盗版。欢迎各位光临获取更多有用资料。无忧论文网:http:/教育论文网:http:/第一论文网 http:/核心论文发表网:http:/www.51fabiao.org古玩网 http:/www.china- http:/www.china- http:/ http:/ http:/ http:/ http:/ http:/ http:/ http:/ QQ:357500023 发表:15221741752 QQ:869156324