基于J2ME平台下SOAP协议的应用
副标题#e#
J2ME作为嵌入式系统应用平台获得了迅速的成长,JAVA语言固有的平台无关 性使得基于J2ME平台的嵌入式应用系统具有辽阔的前景。受限于嵌入式设备及消 费类电器硬件条件的限制,J2ME平台提供的成果有限,如何可以或许在有限的资源下 拓展J2ME的成果,使得J2ME平台可以或许处理惩罚SOAP协议是本文研究的重点。
今朝企业应用正在向面向WEB处事的SOA架构转变,嵌入式系统与企业应用系 统的毗连今朝还处于TCP/IP协议、HTTP协议等较量低级的阶段。跟着企业应用系 统提供的WEB处事日益遍及和成熟,需要J2ME平台提供处理惩罚SOAP协议的需求也越 来越多。
SOA架构是今朝企业应用系统遍及陈设的架构,实现SOA的要害问题之一就是 对SOAP协议的支持。本文阐明白在J2ME平台中实现SOAP协议处理惩罚碰着的问题,提 出了相应的办理方案。
一、J2ME先容
J2ME(Java 2 Platform Micro Edition)是为无线电子市场合设计的JAVA平 台,包罗JVM类型和API类型。J2ME 界说了一套类库和虚拟机技能,这些技能可 以利用户、处事提供商和设备制造商通过物理(有线)毗连或无线毗连,凭据需 要随时利用富厚的应用措施。J2ME同时提供了Java语言一贯的跨平台性和安详性 。
为了支持用户和嵌入式市场提出的机动性和可定制性要求,J2ME被设计得更 加模块化和可缩放化。J2ME在设备原有的操纵系统上制作了3层软件来实现这种 要求:
1.JVM层:这层基于宿主操纵系统,凭据某一种J2ME的设置实现了JVM。
2.设置层:这层对付用户可见度要低一些,但对简表层很是重要。它针对不 同市场的需求,界说了Java虚拟机的最小成果荟萃和Java类库的最小荟萃。在 J2ME设备中,JVM与设置层细密相连,它们浮现了每一类设备的根基成果。
3.简表层:这层对付用户和应用措施提供者来说是最常见的。它针对特定市 场的需求,界说了Java虚拟机的最小成果荟萃和Java类库的最小荟萃。
J2ME组件都环绕一其中心,这些中心被称为configuration(设置),它们中 间的每一个都是用于消费电子和嵌入设备的出格的类。今朝设置分为CLDC和CDC 两种。
Connected limited device configuration(有限毗连设备设置,简称 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 之间。CDC系统差异,它大概有32位或64位处理惩罚器,以及有限的存储容量,不外 它的下限也得高出512K。
此主题相关图片如下:
上图表明设置和简表的体系布局。J2ME的体系布局被横向地分成三层,纵向 分成两部门。设置包罗一个节制设置焦点类的虚拟机,详细的简表位于每个设置 之上。
简表为沟通消费电子设备的差异的出产商提供了尺度化的 Java类库,此刻五 个已知简表已经有了类型:
Mobile information devices profile (MIDP) 移动电话和呼唤器 CLDC
Personal digital assistant profile Palm和Handspring的PDA 设备 CLDC
Foundation profile 用于所有不需要GUI的CDC设备的尺度简表 CDC
Personal profile 替代PersonalJava的Foundation完善的简表 CDC
RMI profile 提供RMI的Foundation完善的简表 CDC
#p#副标题#e#
二、SOAP协议先容
SOAP(简朴工具会见协议)是一种操作XML编码数据的数据传输协议。它是同 类协议中要求最低的一个类型,只界说了协议所要求的最要害的部门,有意地忽 略了垃圾收集、工具激活等方面的细节。像TCP/IP协议一样,SOAP协议也包罗客 户端和处事器两个部门。
SOAP客户端是一种建设XML文档的措施,该XML文档包括在漫衍式系统长途调 用要领所需的信息。SOAP客户端不是传统意义上的措施,它除了用作普通的桌面 应用措施外,还可以是一种Web处事器或基于处事器的应用措施。来自SOAP客户 端的动静和请求一般是通过HTTP发送的。因而,SOAP文档可以穿过险些所有的防 火墙,从而能超过差异的平台互换信息。
SOAP处事器只是用于监听SOAP动静的非凡代码,它可用作SOAP文档的分派器 息争释器。外部Web处事可以与基于J2EE技能的应用措施处事器交互,这种应用 措施处事器可以处理惩罚多种客户端的SOAP请求。
#p#分页标题#e#
SOAP界说了数据编码法则,称为基准编码或“Section 5”编码,它是出自 SOAP类型中描写数据编码法则的内容。SOAP编码可以简短地描写成简朴值或复合 值的荟萃。简朴值可以是简朴范例,如整型、浮点型和字符型,可能是XML架构 类型第2部中界说的内置范例,包罗各类数据范例,如字节型数组和列举。复合 值包罗布局、数组和XML架构拟定组界说的巨大范例。
SOAP在尺度化动静名目情况中,可以做所有它能完成的事情。动静的主体部 分是“text/xml”形式的MIME范例,而且包括一个SOAP封套。该封套是一个XML 文档。封套包括了报头(可选的)和报文(必需有的)。封套的报文部门老是用 于最终吸收的动静,而报头项目可以确定执行中间处理惩罚的方针节点。附件、二进 制数字及其他项目可以附加到报文上。
SOAP提供了一种让客户端指定哪其中间处理惩罚节点必需处理惩罚报头项目标要领。 由于报头与SOAP动静的主体内容是互不相关的,所以可用它们给动静添加信息, 而不会影响对动静报文的处理惩罚。
三、SOAP协议在J2ME平台中的实现
如何真正地将移动设备融入到Web Services中去呢?这就需要使得PDA、手机 等成为Web Services的客户端,因此这些设备至少应该具有处理惩罚XML信息的本领 。在J2ME平台中实现SOAP客户端的成果,使得嵌入式设备可以或许毗连企业的WEB服 务是企业应用中较量常见的需求。J2ME的根基类库中没有提供SOAP的支持,所以 需要在J2ME平台中开拓实现SOAP的处理惩罚成果。
实现SOAP协议客户端的要害问题分为两个方面:J2ME差异设置的数据范例不 一样,导致与SOAP协议封装的数据范例不匹配;J2ME平台没有提供对XML文件进 行处理惩罚的成果。
针对第一个问题,需要留意只能利用根基范例,对不匹配的数据范例回收使 用根基范例复合的方法举办处理惩罚。针对第二个问题需要在J2ME中扩展对XML文件 处理惩罚的成果。今朝有有两种要领对XML文件举办理会。一种是回收DOM的方法,另 外一种是回收SAX的方法。操纵DOM是一个与XML彼此浸染的简朴要领,凡是这个 XML是一棵完整的XML树,被理会成一个存放在存储器中的节点布局,你可以遍历 这棵树。它很是简朴易用,可是因为整棵树存在于存储器中造成存储器的承担, 而对付嵌入式系统来说存储器的资源是有限的,因此这种要领的利用具有必然局 限性。第二种要领在捕获语法阐明事件中,每当语法阐明措施碰着数据中的特定 布局,它就会遍历XML数据,然后把功效发回前面注册的一个事件监听器中。比 如说,当语法阐明措施碰着一个起始标志,如<html>,那么事件监听器将吸收 一个事件,通知它这个环境,而且向它通报任何所需的信息。相对DOM方法的处 理,SAX要领对存储器的要求较量低,可是效率要比DOM方法低。
Enhydra的KXML是一个只占很小存储空间的XML语法阐明措施,对付J2ME应用 措施很是适合。KXML支持DOM语法阐明和操纵,可是不支持SAX语法阐明。取而代 之,它利用一种稍微差异的称为“Pull”的阐明要领。
下面是KXML回收DOM的方法处理惩罚XML数据的例子:
1.Document doc = new Document();
2....
3.parser = new XmlParser(abc);
4.doc.parse( parser );
第一行建设了一个文档工具,生存XML树。第三行从一个名为abc的 InputStreamReader中建设一个KXML语法阐明措施。第四行传送这个语法阐明程 序到文档,然后让文档开始阐明。XML被递归阐明,直到达到文档的末了。当分 析挪用退出时,整个文档被装入内存,这时就可以对XML举办操纵了。
1.Element root = doc.getRootElement();
2.int child_count = root.getChildCount();
3....
4.for (int i = 0; i < child_count ; i++ ) {
5....
6. Element kid = root.getElement(i);
7.
8. if (!kid.getName().equals("abc")) {
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)的制订给J2ME平台增加两大成果:一是使 其可以或许长途会见基于SOAP/XML的Web Services;二是使其具有理会XML数据的能 力。今朝JSR172的尺度已经拟定完成,为了实现这两大成果,JSR172新界说了提 供相应成果的两个可选包。这两个包占用内存很是少,XML-RPC部门或许需要25 -30KB的空间,而XML理会器则需要35KB阁下。
#p#分页标题#e#
类型只对JAX-RPC的模子提供支持,也就是说仅支持同步的会见方法,利用 J2ME客户端可以向处事器发送RPC请求和得到RPC响应。在JSR 172中实现的是SAX 模式的理会器。可以或许理会XML之前首先需要建设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是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)
endDocument()
默认环境下,DefaultHandler的上述要领什么也不做,因此必需本身扩展 DefaultHandler而且包围上述的要领。措施中提供了一个BasicHandler用来处理惩罚 xml文件。class BasicHandler extends DefaultHandler在BasicHandler类中有 两个成员变量
private Vector phones = new Vector();
private Stack tagStack = new Stack();
phones用来存储我们已经理会出来的Phone工具,tagStack则用来存放我们解 析到的元素名称,好比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 "+qName);
if(qName.equals("phone")) {
Phone phone = new Phone();
phones.addElement(phone);
}
tagStack.push(qName);
System.out.println("the tag stack's length is "+tagStack.size ());
}
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println("the end qName is "+qName);
tagStack.pop();
}
竣事语
通过扩充J2ME平台对XML数据的处理惩罚,完成了J2ME平台对SOAP协议的支持。通 过SOAP协议可以或许使得基于J2ME平台的嵌入式设备无缝的毗连到企业现有的应用系 统,办理了嵌入式设备数据来历不敷的问题,扩展了嵌入式系统的应用范畴。本 文从处理惩罚XML数据出发,深入探讨了在J2ME平台中实现SOAP客户端的各类技能, 对付企业应用系统的集成具有必然的推广代价。