摘 要: 通过Java Servlet提供的Web服务、数据库连接访问和数据解析功能,实现了一个基于Java手机的典型移动物资管理系统,并且针对J2ME手机的数据传输格式解析、用户会话管理、统计图表生成和浮点运算等问题进行了探讨。
关键词: J2ME技术 JavaServlet MIDP移动信息设备描述 CLDC有限连接设备配置
1 J2ME概述
J2ME(Java 2 Platform Micro Edition)是SUN公司专门为小型的消费类电子设备(如蜂窝式电话、PDA个人数字助理和电视机顶盒等)而设计的Java2平台,用以实现信息设备的网络数据应用。通过J2ME技术和WAP无线应用协议,消费类设备不仅可以完成信息浏览、收发电子邮件、在线聊天、BBS讨论等传统的Internet应用,还可以利用J2ME提供的本地存储技术、多线程技术、图形控制技术和数据库处理功能,方便地实现在线游戏、本地化游戏、多媒体、电话簿、电子词典、统计图表和远程数据库处理等,从而实现丰富多彩的移动办公应用。
目前,全球J2ME蜂窝电话已成为中高端手机和信息设备的基本配置。J2ME已广泛应用于蜂窝电话、PDA、PocketPC、信息家电和车载系统设备中,成为移动设备和嵌入式系统访问互联网的热点技术。
J2ME定位于二大类产品:一类是高端消费类设备(如电视机顶盒、电冰箱、车载娱乐导航系统等),特点是运算能力相对较强,电力供应充足,内存大,高带宽网络连接;另一类是低端消费类设备(如手机、PDA等),特点是运算能力较弱,电力供应有限,内存小,低带宽非连续网络连接,连接受限。为此,J2ME提出了Configuration(配置)的概念,将消费类电子设备划分为连接设备配置CDC(Connected Device Configuration)和有限连接设备配置CLDC(Connected Limited Device Configuration)。CDC要求目标设备总内存大于2MB(至少512KB),32位或 64位处理器,虚拟机VM支持Java2虚拟机的全部功能;而CLDC则要求设备内存在160KB~512KB之间,处理器速度较慢,通常是靠电池供电,网络连接通常表现为间歇性连接而且带宽有限,使用新的微型Java平台KVM(Kilo VM)。Configuration定义了在相同类别的所有设备中都需要实现的最小Java虚拟机和类库等运行环境。
然而,消费类电器种类繁多,不同消费类电器家族对内存、用户界面、网络连接和可移植性方面的要求都有很大的差异,所以,仅划分为以上二大类配置是不够的。基于以上考虑,J2ME在Configuration基础上提出了Profile(描述)的概念。Profile定位于一个纵向设备类别或家族的特殊要求,提供configuration层中所缺少的设备功能(如UI图形界面、持续性存储)。Profile提供了应用程序级的接口,为消费类电子设备开发和装载的应用程序就建立在Profile层上(如图1所示)。目前定义的Profile有五类:移动信息设备描述MIDP(Mobile Information Devices Profile)、PDA描述、基础描述、个人Java描述和RMI描述。其中,MIDP是J2ME发展较为成熟的描述,它属于CLDC有限连接配置,目前已广泛应用于Java手机、双向寻呼、Palm和PDA设备中,成为移动数据应用的良好平台。本系统的移动数据应用模块就是基于CLDC/MIDP体系开发设计的。其软件体系结构如图1所示。

MIDP提供了connector对象,用于实现移动信息设备的数据连接和通信。connector对象包含了一系列基本函数,支持File(本地文件)、Socket(端口)、Comm(串口)、Datagram(数据报)和HTTP(超文本传输)协议,可以实现灵活的网络连接通信。从理论上讲,MIDP/J2ME可以使用Socket或者Datagram协议进行通信。但是,考虑到HTTP协议是互联网中最主要的通信协议之一,采用HTTP协议完成数据通信,使应用程序开发者可以用标准的Web工具(如Java Servlet、ASP、JSP、PERL等)产生动态的J2ME应用。因此本系统采用HTTP作为设备通信协议。
2 系统开发环境与模块划分
药品物资管理系统是基于MIDP/J2ME客户端和Java Servlet服务器平台实现的。系统功能模块主要包括用户登录与权限管理、药品信息查询、药品信息维护、药品入库、药品销售、药品台账统计与图表生成和公共查询模块等。图2为系统功能模块图。

系统使用JDK1.4作为Java虚拟机;使用JSWDK1.0.1提供服务器端环境,由Java Servlet提供Web数据服务;数据库采用SQLServer2000;J2ME客户端开发与模拟调试采用J2ME Wireless Toolkit和Sun ONE Studio 4 ME。系统数据处理模型如图3所示。

3 系统功能实现
限于篇幅,这里只给出数据查询(公共查询)、数据更新(药品销售)和统计图表(销售趋势分析)三个功能模块的实现,并结合公共查询模块的编码,给出J2ME和JavaServlet编程的整体架构。
3.1 公共查询实现
该模块针对普通用户提供了药品的模糊查询,无需登录验证和Session会话功能。考虑到药品信息查询涉及到几个相关联的表(如药品信息表、药品剂型表、药品分类表)等,在数据库端建立了视图以提高查询速度,简化了Servlet代码编程。
J2ME客户端公共查询界面主要代码为:
import javax.microedition.midlet.*;//引入MIDP/J2ME系统类
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
public class publicsearch extends MIDlet implements CommandListener {
//定义HttpConnection网络连接对象、输入流和输出流以
//处理数据
HttpConnection conn=null;
InputStream is=null;
OutputStream os=null;
……
public void startApp( ){ //启动MIDlet客户端界面,
//提示进行模糊物资查询
inputForm=new Form(″模糊查询:″);
cmdOK=new Command(″确定″,Command.SCREEN,1);
drugCode=new TextField(″输入药品名:″,null,10,
TextField.ANY);
inputForm.append(drugCode);
inputForm.addCommand(cmdOK);
inputForm.setCommandListener(this); //设置客户端按
//钮事件监听
display.setCurrent(inputForm);//设置inputForm
//为缺省界面
……
} //以下方法为用户点按提交选项后,系统向服务器提交用户查询请求
private void getDrugList( ){
conn=(HttpConnection)Connector.open(serurl);
//打开服务器连接
conn.setRequestMethod(HttpConnection.POST);
//以POST方式提交请求
conn.setRequestProperty(″User-Agent″,″Profile/
MIDP-1.0 Configuration/CLDC-1.0″);
conn.setRequestProperty(″Content-type″,″applica-
tion/x-www-form-urlencoded″);
os=conn.openOutputStream( );//打开输出流,
//提交查询数据
os.write(postData);
……//以下为Servlet响应后,J2ME客户端接收和分析返回数据
is=conn.openInputStream( );
synchronized(this) {
receiveData=new byte[1024];
int ch,len=0;
while((ch=is.read( ))!=-1)
receiveData[len++]=(byte)ch;
}
…… //获取接收数据,并进行格式处理,
} //完成药品列表的显示
J2ME客户端提交查询数据至服务器后,Java Servlet获取用户查询关键字,并通过JDBC与数据库系统相连接,搜索符合条件的记录,并将结果返回J2ME客户端。Servlet主要代码为:
String ypmc=request.getParameter(″ypmc″);//获取J2ME客户需查询的药品名称
ServletContext context=getServletContext( );
connectionPool=(ConnectionPool)context.getAttribute
(″connectionPool″);
Connection connection=connectionPool.getConnection( );
//从连接池获得数据库连接
Statement stmt=connection.createStatement( );
//创建查询语句并执行
sql=″select*from YPXXST where(药品名称 like ′%″+ypmc+″%′)″;
ResultSet rs=stmt.executeQuery(sql);
while(rs.next( )) {sb.append(rs.getString(″药品名称″));}
以上是用J2ME编程和JavaServlet数据传输处理的基本架构。
3.2 药品销售实现
该模块完成药品物资的销售出库操作,实现库存表和销售情况表的同步更新。为此,系统将其中相关的数据表建立了关系,以保证数据完整性。此外,由于J2ME设备显示屏幕的限制,系统采用了二级提示性选择输入或提示性直接输入的方式,用以提供友好的用户界面。
在服务器端,Servlet首先通过request.getParameter( )方法取得客户发送来的销售信息(包括表单号、付款方式、条形码、数量等)并进行有效性验证,再根据系统的Session会话信息,确定当前登录的销售人身份,从而完成相关数据表的同步更新。其主要代码如下:
……
//获取用户提交的表单号、付款方式、条形码、数量等信息
txm=request.getParameter(″txm″);
xslx=request.getParameter(″xslx″);
userid=(String)(session.getValue(″userid″));
//获取销售人会话
sql=″UPDATE YPXXB SET Kcl=?WHERE (ID=?)″;
//验证数据有效后,执行更新
prestmt=connection.prepareStatement(sql);
prestmt.setFloat(1,temp);
prestmt.setInt(2,ypid);
prestmt.executeUpdate( );
……
3.3 统计图表实现
统计图表功能在WAP设备数据处理中一般难以实现。本系统使用J2ME提供的Canvas图形类和相关方法,方便地实现了某时间段物品统计汇总曲线图表。
J2ME定义了一个Canvas类,用来绘制各类图形。为了更好地实现统计图表,又定义了三个Canvas类的子类:ArcCanvas、LineCanvas和RectCanvas,分别对应于生成饼图、折线图和柱状图。不同的线型类,其构造体的构造参数和绘图方法也不同。限于篇幅,这里不再给出统计图表的具体实现。
4 系统使用的其他技术
在系统开发中使用了一些相关技术并解决了一些问题,现进行一下简要总结。
(1)数据格式规约和分析。MIDP/J2ME的数据通信采用流式传输,因此对于较复杂数据字段提交或数据结果集合获取,编程时必须将这些复杂数据项目进行分离和处理,否则无法正确地处理查询请求和结果数据。本着实用原则,考虑到本系统数据处理内容相对简单,系统采用了特定字符标记来区分不同的数据单元。例如:对于简单数据查询结果(单一数据字段)传输,使用“:”来分隔数据项(例“白芷:金银花:”);而对于多字段单值数据查询结果传输,字段之间用“|”分隔,数据标题与数据之间用“:”分隔(例“白芷:30|金银花:18|”)。
(2)Session会话功能实现。尽管J2ME支持HTTP连接协议,但是不支持Session会话管理,因此必须在系统中加以实现。本系统采用了重写URL的方法来实现会话功能。
(3)浮点数值运算问题。MIDP/J2ME中不支持浮点运算和浮点表示。为了简化编码、完成浮点运算,系统在J2ME端所有数值传输和表示统一为字符串格式处理,并在Servlet端进行数值析取和运算,然后将数值结果以字符串形式返回给客户端。
(4)使用数据库连接池,提高了数据连接效率。
5 总 结
目前基于Java手机的移动信息管理和数据应用还很少,但J2ME已经为业界描述了一个Java移动计算和嵌入式应用的良好前景。通过J2ME客户端和Java Servlet服务器端的软件开发。本系统实现了一个基于J2ME/J2EE的典型物资管理系统,并在一些技术问题上进行了有益的探索。
参考文献
1 Sun Microsystems Inc.Mobile Information Device Profile (JSR-37)1.0a,2000
2 Riggs R著,李讯译.J2ME无线设备编程.北京:机械工业出 版社,2002
3 Tremble P著,王欣波译.J2ME应用程序开发.北京:人民邮电出版社,2002
