详解基于J2ME平台下SOAP协议的应用

2024-05-10 06:17:04
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
二、SOAP协议介绍
SOAP(简单对象访问协议)是一种利用XML编码数据的数据传输协议。它是同类协议中要求最低的一个规范,只定义了协议所要求的最关键的部分,有意地忽略了垃圾收集、对象激活等方面的细节。像TCP/IP协议一样,SOAP协议也包括客户端和服务器两个部分。
SOAP客户端是一种创建XML文档的程序,该XML文档包含在分布式系统远程调用方法所需的信息。SOAP客户端不是传统意义上的程序,它除了用作普通的桌面应用程序外,还可以是一种Web服务器或基于服务器的应用程序。来自SOAP客户端的消息和请求一般是通过HTTP发送的。因而,SOAP文档可以穿过几乎所有的防火墙,从而能跨越不同的平台交换信息。
SOAP服务器只是用于监听SOAP消息的特殊代码,它可用作SOAP文档的分配器和解释器。外部Web服务可以与基于J2EE技术的应用程序服务器交互,这种应用程序服务器可以处理多种客户端的SOAP请求。
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左右。
规范只对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客户端的各种技术,对于企业应用系统的集成具有一定的推广价值。
原文出处:http://java.chinaitlab.com/embed/771670.html

转载于:https://blog.51cto.com/turtle/238122

详解基于J2ME平台下SOAP协议的应用相关推荐

  1. 《嵌入式Linux软硬件开发详解——基于S5PV210处理器》——1.2 S5PV210处理器

    本节书摘来自异步社区<嵌入式Linux软硬件开发详解--基于S5PV210处理器>一书中的第1章,第1.2节,作者 刘龙,更多章节内容可以访问云栖社区"异步社区"公众号 ...

  2. OSPFv2原理详解(基于RFC2328)+配置介绍+RFC2328翻译

    个人认为,理解报文就理解了协议.通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议. 虽然路由器自身可以对协议做一些独特的配置,但是报文仍然是协议的核心.例如,OSPF的完全末节 ...

  3. 《嵌入式Linux软硬件开发详解——基于S5PV210处理器》——2.5 WM8960音频编解码芯片...

    本节书摘来自异步社区<嵌入式Linux软硬件开发详解--基于S5PV210处理器>一书中的第2章,第2.5节,作者 刘龙,更多章节内容可以访问云栖社区"异步社区"公众号 ...

  4. 详解基于 Cortex-M3 的任务调度(下)

    文章目录 工程说明 实验结果 代码讲解 时钟节拍 任务切换 task_switch() PendSV_Handler 任务的代码 重要的全局变量 main() 函数 代码下载 在 详解基于 Corte ...

  5. 《嵌入式Linux软硬件开发详解——基于S5PV210处理器》——2.2 DDR2 SDRAM芯片

    本节书摘来自异步社区<嵌入式Linux软硬件开发详解--基于S5PV210处理器>一书中的第2章,第2.2节,作者 刘龙,更多章节内容可以访问云栖社区"异步社区"公众号 ...

  6. python selenium爬虫_详解基于python +Selenium的爬虫

    详解基于python +Selenium的爬虫 一.背景 1. Selenium Selenium 是一个用于web应用程序自动化测试的工具,直接运行在浏览器当中,支持chrome.firefox等主 ...

  7. Apollo进阶课程㉘丨Apollo控制技术详解——基于模型的控制方法

    原文链接:进阶课程㉘丨Apollo控制技术详解--基于模型的控制方法 PID控制是一个在工业控制应用中常见的反馈回路部件,由比例单元P.积分单元I和微分单元D组成.PID控制的基础是比例控制:积分控制 ...

  8. php 六边形 属性图 能力数值图,详解基于 Canvas 手撸一个六边形能力图

    一.前言 六边形能力图如下,由 6 个 六边形组成,每一个顶点代表其在某一方面的能力.这篇文章我们就来看看如何基于 canvas 去绘制这么一个六边形能力图.当然,你也可以基于其他开源的 js 方案来 ...

  9. AXI接口协议详解-AXI总线、接口、协议

    转自:https://cloud.tencent.com/developer/article/1695010 AXI接口协议详解-AXI总线.接口.协议 AXI 总线 上面介绍了AMBA总线中的两种, ...

最新文章

  1. k8s概念入门之apiserver-针对1.1.版本阅读
  2. python使用函数的优点-Python递归函数的优缺点
  3. 关于mysql中truncate
  4. VS 断点无法调试学习总结
  5. 委托学习总结(一)浅谈对C#委托理解
  6. Angular中怎样通过localStorage实现数据持久化-实现存储搜索历史为例
  7. IOS基础之使用UICollectionView纯代码创建
  8. c 调用c语言写的dll文件路径,手把手教你用C/C++语言创建及调试动态库DLL程序
  9. 访问nfs_通过NFS访问编年引擎
  10. axios 配置loading_用Axios Element 实现全局的请求 loading
  11. 【openjudge】 CDQZ challenge 4
  12. JAVA验证码识别和tesseract训练过程
  13. 华为GPON-MA5680T开局配置
  14. Mybatis整合Spring框架时所需的依赖
  15. 编码原则总结:面向对象设计的SOLID原则
  16. 2019.10.8 \t\n艾希练习
  17. 英语翻译太难?我一怒之下用爬虫写了两个翻译脚本
  18. 基于Matlab2012a的LineStretcher测线编号程序开发
  19. Matlab坐标系绘制
  20. Integer 用 == 比较时 127 相等 128 不相等

热门文章

  1. php 发送表单数据,php - 将表单数据发送到会话变量 - SO中文参考 - www.soinside.com...
  2. contenttype文件ajax_jquery ajax contentType设置
  3. python函数不包括参数函数_python中实现函数不限制参数的数量
  4. elm预测matlab,机器学习——极限学习(ELM)matlab代码分析
  5. php word 数学公式,如何在word中输入复杂的数学公式? 详细始末
  6. 计算机专业中职好就业不,内江计算机专业中职好不好
  7. impala java api 操作_Impala实践之六:使用Rest Api
  8. 更新卡住解决_iPhone手机无法正常下载/安装应用的解决方法
  9. VB怎样屏蔽 Alt+F4键
  10. SpringBoot实战(十一):MultipartException: Could not parse multipart servlet request