级别: 初级 陈隽伟, 全球化认证实验室,IBM 中国软件开发试验室
2004 年 1 月 01 日 本文先介绍了 MIDP 的基本概念,然后描述配置 DB2 Everyplace 同步服务器以使其支持 MIDP 的详细步骤,并提供了范例代码。
简介
DB2 Everyplace 是 IBM 普适计算技术解决方案的重要组成部分, 通过 DB2 Everyplace 的支持, 一些移动性大的专业人员(如销售人员, 审计员, 技术支持人员, 医生)就能够在办公室以外的地方获取他们所需要的重要数据。
该产品的亮点之一就是能够很好地支持种类繁多的移动设备,本文将描述针对 MIDP 相关设备如何构建基于 DB2 Everyplace 的应用程序。
通过本文您将了解到下列内容:
- MIDP 的基本概念
- 如何配置 DB2 Everyplace 同步服务器以使之提供对 MIDP 的支持
- DB2 Everyplace 提供的 MIDP 客户端应用接口及其范例代码
开发测试环境
本文要求您安装配置了开发基于 DB2 Everyplace的 MIDP 应用程序完整的开发环境(下面为最简配置):
服务器:在该服务器中将安装配置同步数据源和 DB2 Everyplace 同步服务器。
WINDOWS 2K SP3 (本文的测试环境为英文版)
DB2 Universal Database Enterprise Edition V7.2 + FIXPACK9
WebSphere Application Server Advanced Enterprise Edition V4.0.2
DB2 Everyplace Enterprise Edition V8.1+FIXPACK2
其相关的问题可参考《IBM DB2 Everyplace V8.1 安装与用户指南》 或是另外一篇文章
《DB2 Everyplace 同步服务器管理配置指南》。
注意:
- 实际大数据量使用中,同步数据源与 DB2 Everyplace 同步服务器不推荐部署在同一台服务器上,上述配置是测试环境,这使得开发测试时较为便利。
- 同步数据源可以采用诸如 DB2 UDB,ORACLE,MS SQL SERVER 等多种数据源,但是 DB2 Everyplace 同步服务器所使用的数据库系统只能采用上述 DB2 UDB V7.2+FIXPACK9,目前,DB2 Everyplace 同步服务器V8.1 不支持 DB2 UDB V8.1,同步数据源也同样推荐使用 DB2 UDB V7.2.x。
移动设备:本文的测试环境主要覆盖开发人员最常涉及的移动设备及相关模拟器。
- PocketPC (本文的测试环境是 Compaq iPaq H3870,运行 PocketPC 2002 操作系统)
- Palm OS (本文的测试环境是 Palm OS 4.0)
- 其它 MIDP 相关设备 (WTK V1.04 模拟器,WebSphere Studio Device Developer V5.5 附带的 MIDP 模拟器)
在目标移动设备或相应模拟器上,您需要事先部署相应的 DB2 Everyplace 同步客户端软件和 WebSphere Micro Environment V5.5 作为 MIDP 客户端程序的运行环境,针对不同种类的移动设备相关的安装配置文件列表可在 WebSphere Studio Device Developer V5.5 联机帮助中得到。
开发工作站:在开发工作站上,您应该采用 WebSphere Studio Device Developer V5.5 作为您的开发工具,它采用 WebSphere Micro Environment V5.5 作为其应用程序的运行测试环境。
- WebSphere Studio Device Developer V5.0:简称WSDD,是 IBM 推出的一款专门针对移动设备开发的优秀的集成开发环境,它可以作为插件和 WebSphere Studio Application Developer 合成使用,目前其最新版本为 V5.0。
- WebSphere Micro Environment V5.5:简称 WME,是 IBM 推出的基于 J2ME 规范的JAVA 嵌入式运行环境,其广泛应用于各种类型的移动设备和嵌入式环境中,以此来为IBM DB2 Everyplace、IBM MQ Everyplace 等各种无线应用软件提供统一的部署环境。目前,其最新版本为 V5.5。
本文旨在帮助读者掌握如何构建基于 DB2 Everyplace 的 MIDP 应用程序。通过本文,您可以掌握针对 MIDP 相关设备,如何使用 IBM 最新的移动设备集成开发环境 WebSphere Studio Device Developer V5.0 和 WebSphere Micro Environment V5.5 运行测试环境进行基于 DB2 Everyplace 的移动设备应用程序开发。
MIDP 概述
本文不是专门讲述 MIDP 开发技术的文章,因此默认为读者对 MIDP 技术已有一定了解。
MIDP 的基本特点概述如下:Mobile Information Device Profile,定义了针对移动信息处理设备(主要指智能手机和一部分具有无线通信功能的PDA)的图形界面,输入和时间处理,持久性存储,无线电话网络连接之上的一些消息处理(例如短消息),安全等等 API,并且考虑到了移动信息设备的屏幕和内存限制。
开发基于 DB2 Everyplace 的 MIDP 应用程序
概述:由于 MIDP 相关设备种类繁多,及其特殊性,DB2 Everyplace V8.1 提供的该功能是在 Sun Wireless Toolkit 环境下开发部署,应用服务器首选推荐 Apache Tomcat Version 4.0.x,目标设备是一些具备 MIDP 功能的手机设备。如果读者的应用类似于此种情况,可以通过参看相关的产品文档得到很多帮助,文档列表如下:
- bin %DSYINSTDIR%\\Clients\\MIDP\\bin 包含一些能够运行 WTK 模拟器的脚本
- lib %DSYINSTDIR%\\Clients\\MIDP\\lib 包含一些相关的库文件
- docs %DSYINSTDIR%\\Clients\\MIDP\\doc 包含了一些相关的产品文档
- samples %DSYINSTDIR%\\Clients\\MIDP\\samples 包含了一个范例应用程序
但本文所要讨论的情况却不是如此。作者在项目实践中成功地测试基于 DB2 Everyplace 的 MIDP 应用程序运行在 WME5.5 环境下,应用服务器采用的是 WebSphere Application Server Advanced Enterprise Edition V4.0.2,目标设备采用的是 PocketPC 设备或是 Palm OS 设备,同时也在 WTK 提供的手机模拟器上经过测试。
服务器端安装配置:
为了支持 MIDP 相关设备的同步客户端顺利工作,我们需要在 DB2 Everyplace 服务器上安装相应的 Web 服务器软件,目前 DB2 Everyplace 产品支持两种 Web 服务器软件:
- WebSphere Application Server,Advanced Single Server Edition Version 4.x 或是后继版本。
- Apache Tomcat Version 4.0.x 或是后继版本。
作者在测试过程中采用的是 WebSphere Application Server Advanced Enterprise Edition V4.0.2,经过测试,是能够正常工作的。
安装配置遵循下列步骤:
-
运行 \\DB2Everyplace\\Server\\installableApps\\nt\\dsy_was40_install.bat,该脚本将在 DB2 Everyplace 同步服务器的 WebSphere 节点下创建应用程序服务器。
命令格式如下:
dsy_was40_install.bat "WAS_installation_directory" "WAS_node_name" "%DSYINSTDIR%" "%DSYSQLLIBINSTDIR%"
其中,WAS_installation_directory 是 WebSphere Application Server 的安装目录,WAS_node_name 是 WebSphere Application Server 节点名。
注:在实际使用中,常常会碰到 WAS V4 对应的服务 IBM_WS_Admin 服务无法启动,这通常是由于 WAS 需要配置为使用 JDBC 2.0,设置步骤如下:
1)停止"DB2 UDB JDBC Applet Server 服务"
2)执行 DB2 UDB 对应目录下的 SQLLIB\\java12\\usejdbc2.bat,将 JDBC 升级为 2.0 版本
3)重新启动"DB2 UDB JDBC Applet Server 服务"
这时,即可启动 IBM_WS_Admin 服务。
-
安装"IBM DB2 Everyplace 企业应用程序",并且重新生成 Web 服务器插件,该应用程序安装在步骤 1 所创建的应用程序服务器之中。该过程较为普通,如读者有疑问,请查阅相关手册,这里不再赘述。
-
通过步骤2,在"IBM DB2 Everyplace企业应用程序"安装好之后,还需要对该应用服务器的相关设置进行配置。随产品发布的安装文档中的设置是针对 WebSphere Application Server V5.x,这里将针对 WebSphere Application Server V4.x 的配置进行说明。
选中"IBM DB2 Everyplace 企业应用程序"所在的应用服务器,在其属性框内选择服务页,然后选择 Web 容器服务,如下图:
然后编辑其属性:
设置该应用服务器所对应的端口号,默认为 9080。
然后再返回服务页,选择会话管理器服务,如下图:
编辑其属性:
选中 Enable URL rewriting,不要选中 Enable SSL ID tracking 和 Enable cookies。
修改好上述配置后及时点击"更新",使得修改后的属性得以保存。
-
当我们遵循上述三步安装配置好该应用服务器和"IBM DB2 Everyplace 企业应用服务器",我们只是完成了应用服务器的框架,对于与 DB2 Everyplace 业务逻辑相关的 Servlet,还需要手工安装配置。具体步骤如下:
- 将业务逻辑文件 ..\\DB2Everyplace\\Clients\\MIDP\\lib\\FilterServlet.jar 复制到 ...\\DB2Everyplace\\WAS\\installableApps\\IBM_DB2_Everyplace.ear\\IBM_DB2_Everyplace.war\\WEB-INF\\lib 目录下。
- ..\\DB2Everyplace\\WAS\\installableApps\\IBM_DB2_Everyplace.ear\\IBM_DB2_Everyplace.war\\WEB-INF\\web.xml 做如下修改:
在 servlet 描述区的相应位置加入下面的定义:
<servlet id="Servlet_20">
<servlet-name>MIDP Filter Servlet</servlet-name>
<servlet-class>com.ibm.mobileservices.servlet.ServletDriver</servlet-class>
</servlet>
|
在 servlet 映射区的相应位置加入下面的定义:
<servlet-mapping id="ServletMapping_20">
<servlet-name>MIDP Filter Servlet</servlet-name>
<url-pattern>/db2efilter/*</url-pattern>
</servlet-mapping>
|
在完成上述修改后,保存该配置文件,重起应用服务器。
-
在上述步骤均完成后,可以通过访问下列地址来测试服务器是否安装配置成功。
请在开发机上访问 http://syncservername:9080/db2e/db2eFilter 来验证服务器是否安装配置成功,如果成功,将在浏览器中看到下面信息:
客户端运行环境:
为了在客户端顺利地运行相关应用程序,首先需要部署 WME5.5 到目标设备上,请查阅 WSDD 联机文档。
同步引擎客户端接口:
DB2 Everyplace 为 MIDP 相关设备提供的同步引擎接口较为独立,下面给出了在客户端代码中调用该同步引擎接口实现同步功能的基本步骤:
遵循下列步骤:
- 引入 DB2 Everyplace 同步服务的相关包
import com.ibm.mobileservices.isync.* ;
import com.ibm.mobileservices.isync.event.* ;
import com.ibm.mobileservices.isync.midp.* ;
- 实现接口 IsyncListener的eventIssued 方法,以便能够在进行同步的同时捕捉到所有事件通知。
- 得到 MIDPISyncProvider 的实例。
- 从步骤 3 所得到的 Provider 实例中得到一个 synchronization service 的实例。
- 从步骤 4 所得到的 Service 实例中得到一个 configuration store 的实例。
- 从步骤 5 所得到的 configuration store 实例中得到一个 synchronization driver 的实例
- 注册应用程序侦听器,使得在程序运行过程中我们可以随时获知发生的事件。
- 对所有已激活的预订集进行同步操作,同时不断地检查同步的返回值和状态。
- 关闭并且释放 MIDPISyncProvider 所申请的所有资源。
可以看出,DB2 Everyplace 客户端所需要遵循的同步过程是严格按照一定顺序和规范来进行的。
附件 1中提供了一段简单的范例代码告诉读者如何在自己的代码中实现最基本的同步操作。
本地数据存取接口:
MIDP 相关设备种类繁多,因此其采用的数据存储和管理机制需要有足够的跨平台,跨设备特性。通常其采用 RMS(Record Management System)来作为自己的数据存储管理解决方案。
本文对 RMS 不做过多的叙述,如果读者感兴趣,可查阅其它 RMS 相关技术文档。
DB2 Everyplace V8.1 这个版本在基础的 RMS 接口规范架构上设计了更为简单易用的本地数据存取接口,其核心即引入了对象 TableMetaData 来描述本地数据表模式。在移动设备上的本地数据中,每个 FastRecordStore 实例对应着传统意义上的一张数据表。在这个 FastRecordStore 的开头,记录着该表的元数据,即对应的 TableMetaData 对象;并且提供了简单易用的借口让我们可以通过该对象中存储的模式信息来对该 FastRecordStore 实例中的每条数据记录进行操作。
下面是在您的客户端 MIDP 应用程序中存取本地数据的基本开发步骤:
- 根据数据表的名字从同步服务提供者 MIDPISyncProvider 的实例中得到该数据表模式对象(TableMetaData)的实例。
- 打开或创建该数据表实例(FastRecordStore)。
- 根据该数据表实例和其模式对象,建立该数据表记录索引,以便于高效存取数据。
- 在该数据表实例基础上建立记录列举对象(FastRecordEnumeration),以便遍历该数据表中各记录。
- 遍历数据表中记录,根据模式对象(TableMetaData),作相关操作,这当中常常牵涉到
数据流操作,会经常使用下列 4 个类的相关操作:
- ByteArrayInputStream
- DataInputStream
- ByteArrayOutputStream
- DataOutputStream
注:
-
数据表对象(FastRecordStore)由两部分组成,开头是模式对象(TableMetaData),余下的部分是由各个数据记录依次排列而成。在每条记录的开始,有个标志字节(Flag Byte)来表示该记录的编辑状态,该字节初始为零(0000 0000),开发人员可以在代码中根据实际需要将其设置为 ISync.ROW_ADDED,ISync.ROW_CHANGED,ISync.ROW_DELETED 等值,同步操作时 MIDP 同步引擎会根据每条记录的标志位进行插入,更新,删除等相应操作。在一条记录当中,各个列的字段值会按照数据表模式中的先后顺序依次排列。这当中有些字段的值可能允许为空,如果该字段值可以为空,则对于该字段值会首先是一个是否为空值的布尔类型标志位,开发人员可以通过 DataInputStream.readBoolean 来得到该值。如果该值为 True,则该字段为空,紧挨着的将是下个字段的值;如果该值为 False,则该字段为非空,紧挨着的将是该字段。 具体如何判断使用可以在附件 2 中的范例代码中得到。
-
有关几种时间类型字段的特殊处理
- Date 类型
Date 类型的字段在本地数据表中是以一个整型值来表示的,我们需要通过特殊的位操作来得到其中的年、月、日值。
int dt = din.readInt(); // 得到一个 Date 类型字段
int year = dt >> 16; // 解析出"年"的值
int mon = (dt >> 8) & 0xFF; // 解析出"月"的值
int day = dt & 0xFF; // 解析出"日"的值
- Time 类型
Time 类型的字段在本地数据表中也是以一个整型值来表示的,我们需要通过特殊的位操作来得到其中的时、分、秒值。
int tm = din.readInt(); // 得到一个 Time 类型字段
int hour = tm >> 16; // 解析出"时"的值
int min = (tm >> 8) & 0xFF; //解析出"分"的值
int sec = tm & 0xFF; // 解析出"秒"的值
- TimeStamp 类型
TimeStamp 类型的字段在本地数据表中是以一个 8 字节长度的 long 类型值来表示的,前 4 个字节存储 Date 信息,后 4 个字节存储 Time 信息。
long ts = dinr.readLong(); // 得到一个 TimeStamp 类型字段
int dt = (int) (ts >> 32); // 得到前 4 个字节
int year = dt >> 16; // 解析出"年"的值
int mon = (dt >> 8) & 0xFF; // 解析出"月"的值
int day = dt & 0xFF; // 解析出"日"的值
int tm = (int) (ts & 0xFFFF); // 得到后 4 个字节
int hour = tm >> 16; // 解析出"时"的值
int min = (tm >> 8) & 0xFF; //解析出"分"的值
int sec = tm & 0xFF; // 解析出"秒"的值
附件 2中提供了一段简单的范例代码告诉读者如何在自己的代码中实现最基本的数据存取操作。
参考资料
关于作者  | |  | 陈隽伟,是 IBM 中国软件实验室上海全球化认证实验室的一员,目前专注于 WebSphere Everyplace 系列软件的相关开发。
|
对本文的评价
|