1、它们的组合取舍形成了具体的运行环境。Configuration主要是对设备纵向的分类,分类依据包括存储和处理能力,其中定义了虚拟机特性和基本的类库。已经标准化的Configuration有- Connected Limited Device Configuration(CLDC)和Connected Device Configuration(CDC)。Profile建立在Configuration基础之上,一起构成了完整的运行环境。它对设备横向分类,针对特定领域细分市场,内容主要包括特定用途的类库和API。CLDC上已经标准化的Profile有Mobile Information Device
2、 Profile (MIDP)和Information Module Profile(IMP),而CDC上标准化的Profile有Foundation Profile(FP)、Personal Basis Profile(PBP)和Personal Profile(PP)。可选包独立于前面两者提供附加的、模块化的和更为多样化的功能。目前标准化的可选包包括数据库访问、多媒体应用、蓝牙等等。二、J2ME平台体系结构J2ME总共有3层体系。J2ME的3层体系结构依照各种设备的资源特性,将J2ME技术架构分为简表(Profile)、配置(Configuration)和Java Virtual Mach
3、ine(JVM)3层,然后再进一步细分,这使J2ME能够在每一类设备的限制下工作,而同时提供最低限度的Java语言功能性。1、Java虚拟机(JVM)层这一层针对设备本地操作系统定制的Java虚拟机的实现,支持特定的J2ME配置,就像使用所有的Java技术一样,J2ME的核心也在一中虚拟机中。2、配置(Configuration)层面对的是大量各种不同的小型嵌入式设备,它们在外观和功能上均各不相同。J2ME将这些设备进行分类,将一些共同提取出来形成适合于某个范畴中设备的规范,称为“配置”。3、简表(Profile)层简表层定义了特定系列设备上可用的应用程序编程接口(API)的最小集。简表在一个
4、特定的配置上面实现。应用程序时针对特定的简表编写的,因此可以移植到支持该简表的任何设备上。另外,一个设备可以同时支持多个简表。用户和开发人员看到最多的就是这一层。三、J2ME 目标设备 1、CDC支持的设备使用 CDC 开发的 J2ME 应用程序的目标设备通常具有以下特征: 可供 Java 平台使用的 160 到 512 千字节的总内存 功率有限,常常是电池供电 网络连通性,常常是无线的、不一致的连接并且带宽有限 用户接口混乱,程度参差不齐;有时根本就没有接口 2、 CLDC支持的设备一些 CLDC 支持的设备,包括无线电话、寻呼机、主流个人数字助手 (/pda/ PDA),以及小型零售支付终
5、端。依照 Sun Microsystems,CDC 的目标设备通常具有以下特征: 使用 32 位处理器 2 兆字节或更多可供 Java 平台使用的总内存 设备要求的 Java 2 “蓝皮书”虚拟机的全部功能一些 CDC 支持的设备,包括常驻网关、智能电话和通讯器、PDA、管理器、家用电器、销售网点终端以及汽车导航系统。四、MIDlet应用程序的生命周期理解J2ME的体系结构并不像想象的那么容易,我们觉得读更多的资料帮助也不大,我们直接迈向J2ME开发也许会对你解J2ME平台体系结构这个重要的概念有所帮助。在MIDP中定义了一种新的应用程序模型MIDlet,它是被Application Mana
6、gement Software(AMS)管理的。AMS负责MIDlet的安装、下载、运行和删除等操作。AMS控制MIDlet的方法:startApp()、 pauseApp()、destroyApp(boolean);MIDlet主动请求AMS改变其状态的方法:resumeRequest()、notifyPaused()、notifyDestroyed()。在被AMS管理的同时,MIDlet可以和应用管理软件通信通知应用管理软件自己状态的变化,通常是通过方法notifyDestroyed()和notifyPaused()实现的MIDlet有三个状态,分别是pause、active和destro
7、yed。在启动一个MIDlet的时候,应用管理软件会首先创建一个MIDlet实例并使得他处于pause状态,当startApp()方法被调用的时候MIDlet进入active状态,也就是所说的运行状态。在active状态调用destroyApp(boolean unconditional)或者pauseApp()方法可以使得MIDlet进入destroyed或者pause状态。值得一提的是destroyApp(boolean unconditional)方法,事实上,当destroyApp()方法被调用的时候,AMS通知MIDlet进入destroyed状态。在destroyed状态的MIDl
8、et必须释放了所有的资源,并且保存了数据。如果unconditional为false的时候,MIDlet可以在接到通知后抛出MIDletStateChangeException而保持在当前状态,如果设置为true的话,则必须立即进入destroyed状态。其状态转化图如图2所示:五、J2ME、J2SE与J2EE之间的比较在Java中,类库以包(package)的形式提供,不同版本的Java提供不同的包,以面向特定的应用。Java2平台包括标准版(J2SE)、企业版(J2EE)和微缩版(J2ME)三个版本。1、Java 2平台标准版 (J2SE)Standard Edition(标准版) J2S
9、E 包含那些构成Java语言核心的类。比如:数据库连接、接口定义、输入/输出、网络编程。2、Java 2平台企业版(J2EE) Enterprise Edition(企业版) J2EE 包含J2SE 中的类,并且还包含用于开发企业级应用的类。EJB、servlet、JSP、XML、事务控制。3、Java 2平台微型版(J2ME)Micro Edition(微缩版) J2ME 包含J2SE中一部分类,用于消费类电子产品的软件开发。呼机、智能卡、手机、PDA、机顶盒。他们的关系是:J2SE包含于J2EE中,J2ME包含了J2SE的核心类,但新添加了一些专有类。他们的应用场合、API的覆盖范围各不相
10、同。笼统的讲:J2SE是基础;压缩一点,再增加一些CLDC等方面的特性就是J2ME;扩充一点,再增加一些EJB等企业应用方面的特性就是J2EE。对J2EE更恰当的说,应该是JAVA2企业开发的技术规范,不仅仅是比标准版多了一些类。六、J2ME程序设计的几个原则1、使用面向对象编程虽然使用面向过程编程可以减小文件的尺寸,但是为了以后维护的方便和利于扩展,还是要使用面向对象编程。2、使用MVC模式 将模型、界面和控制分离。现在很多的程序将三者合一,但是如果你做的程序比较大的话,还是建议你进行分离。3、自动存储用户设定使用RMS来存储用户的信息,例如存储用户上次输入的用户名、密码、用户对于系统的设定
11、等,这样不仅可以减少用户的输入,而且对用户友好。很多程序甚至做了自动登陆等。4、设置关闭一些系统设置允许用户关闭,如背景音乐、背景灯显示等。5、使用线程将低级用户界面的绘制动作放在一个独立的线程里面去。6、给定界面在需要大量时间才能完成的工作时,给用户一个等待界面。七、课程设计思路网络开发思路主要是客户端和服务端的设置。在进行无线网络开发时需注意环境配置:将“2013”拷入tomat/webapps双击tomcat/bin里的startup开启服务器。现在就详细的讲解网络程序加自定义协议的程序编写:1、自定协议(最终类或接口)对自定义动作加以区分,制定自己的协议,如:登录1,接到1后服务器验证
12、,将验证结果返回:public final class MyProtocal / public interface MyProtocal public static final byte LOGIN = 0; /登载 public static final byte LIST = 1; /查询 public static final byte INSERT = 2; /插入public static final byte OK= 3;public static final byte ERROR= 4;2、案例(1)描述:登录后,出现主菜单,选择主菜单的查询和插入后分别执行相应的功能:图3预测结
13、果(2)类图:一个主程序类,一个协议,四个屏显图4 类图结构(3)核心代码:客户端:(以登录为例)new Thread()dos.writeByte(MyProtocal.MSG_LOGIN);dos.writeUTF(nameTextField.getString();dos.writeUTF(pwdTextField.getString();dos.flush();byte ms=dis.readByte(); if(ms=MyProtocal.OK) clientMIDlet.display.setCurrent(mainList); .start()服务端:switch(ms) cas
14、e MyProtocal.LOGIN: login(dis,dos);break; case MyProtocal.QUEUE: queue(dis,dos); case MyProtocal.INSERT: insert(dis,dos);dos.close();dis.close();public void login(DataInputStream dis,DataOutputStream dos)String name = dis.readUTF();String pwd=dis.readUTF();if(name.equals(liyi)&pwd.equals(123) dos.wr
15、iteByte(MyProtocal.OK); dos.flush();else dos.writeByte(MyProtocal.ERROR); 具体的程序代码:public class ClientMIDlet extends MIDlet Display display = Display.getDisplay(this); LoginForm loginform = new LoginForm(login,this); public ClientMIDlet() / TODO Auto-generated constructor stub protected void destroyA
16、pp(boolean arg0) throws MIDletStateChangeException / TODO Auto-generated method stub protected void pauseApp() protected void startApp() throws MIDletStateChangeException display.setCurrent(loginform);public class InsertForm extends Form implements CommandListener MainList mainList; ClientMIDlet cli
17、entMIDlet; Command backCommand=new Command(back,Command.EXIT,1); Command insertCommand=new Command(insert,Command.SCREEN,1); TextField scoreTextField=new TextField(score:,10,TextField.ANY); public InsertForm(String title) super(title); this.addCommand(backCommand); this.addCommand(insertCommand); th
18、is.setCommandListener(this); public void setInsertData(MainList mainList,ClientMIDlet clientMIDlet) this.append(welcom +LoginForm.name+,please insert:); this.append(scoreTextField); this.mainList=mainList; this.clientMIDlet=clientMIDlet; public void commandAction(Command c, Displayable d) if(c=backC
19、ommand) clientMIDlet.display.setCurrent(mainList); else new Thread() public void run() try HttpConnection hc = (HttpConnection)Connector.open(http:/localhost:8080/2013/ServerHttpServlet,Connector.READ_WRITE); hc.setRequestMethod(HttpConnection.POST);DataOutputStream dos=new DataOutputStream(hc.openO
20、utputStream(); dos.writeByte(MyProtocal.INSERT); dos.writeUTF(scoreTextField.getString(); dos.flush(); DataInputStream dis=new DataInputStream(hc.openInputStream(); byte ms=dis.readByte(); if(ms!=MyProtocal.OK) Alert alert=new Alert(Insert Rack alert.setType(AlertType.ERROR); alert.setTimeout(Alert.
21、FOREVER); alert.setString(没有插入成功 clientMIDlet.display.setCurrent(alert,InsertForm.this); else alert.setType(AlertType.CONFIRMATION);插入成功 catch (IOException e) e.printStackTrace(); .start(); public class LoginForm extends Form implements CommandListener TextField nameTextField=new TextField(name: Tex
22、tField pwdTextField=new TextField(pwd: Command loginCommand=new Command( static String name=null; static String pwd=null; public LoginForm(String title,ClientMIDlet clientMIDlet) mainList=new MainList(main,Choice.EXCLUSIVE,new String查询插入,null,clientMIDlet); this.append(nameTextField); this.append(pw
23、dTextField); this.addCommand(loginCommand); if(c=loginCommand)HttpConnection hc= dos.writeByte(MyProtocal.LOGIN); dos.writeUTF(nameTextField.getString(); dos.writeUTF(pwdTextField.getString();DataInputStream dis=new DataInputStream(hc.openInputStream(); System.out.println(con:+ms); if(ms=MyProtocal.
24、OK) /将合法的用户名和密码保存起来 name=new String(); name=nameTextField.getString(); pwd=new String(); pwd=pwdTextField.getString(); /跳转到主界面 clientMIDlet.display.setCurrent(mainList); / TODO Auto-generated catch block public class MainList extends List implements CommandListener Command goCommand=new Command(go Que
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1