J2ME课程综述.docx

上传人:b****5 文档编号:7777535 上传时间:2023-01-26 格式:DOCX 页数:19 大小:159.11KB
下载 相关 举报
J2ME课程综述.docx_第1页
第1页 / 共19页
J2ME课程综述.docx_第2页
第2页 / 共19页
J2ME课程综述.docx_第3页
第3页 / 共19页
J2ME课程综述.docx_第4页
第4页 / 共19页
J2ME课程综述.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

J2ME课程综述.docx

《J2ME课程综述.docx》由会员分享,可在线阅读,更多相关《J2ME课程综述.docx(19页珍藏版)》请在冰豆网上搜索。

J2ME课程综述.docx

J2ME课程综述

J2ME课程综述

目录

简介0

一、J2ME特点1

二、J2ME平台体系结构1

三、J2ME目标设备2

四、MIDlet应用程序的生命周期3

五、J2ME、J2SE与J2EE之间的比较5

1、Java2平台标准版(J2SE)5

2、Java2平台企业版(J2EE)6

3、Java2平台微型版(J2ME)6

六、J2ME程序设计的几个原则6

1、使用面向对象编程6

2、使用MVC模式6

3、自动存储用户设定6

4、设置关闭7

5、使用线程7

6、给定界面7

七、课程设计思路7

1、自定协议(最终类或接口)7

八、J2ME异常的处理16

总结18

简介

JavaME(JavaPlatform,MicroEdition)是为机顶盒、移动电话和PDA之类嵌入式消费电子设备提供Java语言平台,包括虚拟机和一系列标准化的JavaAPI。

它和JavaSE、JavaEE一起构成Java技术的三大版本,并且同样是通过JCP(JavaCommunityProcess)制订。

 [1]

JavaME(Java2MicroEdition)是Java2的一个组成部分,它与J2SE、J2EE并称。

一、J2ME特点

与J2SE和J2EE相比,JAVAME总体的的运行环境和目标更加多样化,但其中每一种产品的用途却更为单一,而且资源限制也更加严格。

为了在达到标准化和兼容性的同时尽量满足不同方面的需求,JAVAME的架构分为Configuration、Profile和OptionalPackages(可选包)。

它们的组合取舍形成了具体的运行环境。

Configuration主要是对设备纵向的分类,分类依据包括存储和处理能力,其中定义了虚拟机特性和基本的类库。

已经标准化的Configuration有-ConnectedLimitedDeviceConfiguration(CLDC)和ConnectedDeviceConfiguration(CDC)。

Profile建立在Configuration基础之上,一起构成了完整的运行环境。

它对设备横向分类,针对特定领域细分市场,内容主要包括特定用途的类库和API。

CLDC上已经标准化的Profile有MobileInformationDeviceProfile(MIDP)和InformationModuleProfile(IMP),而CDC上标准化的Profile有FoundationProfile(FP)、PersonalBasisProfile(PBP)和PersonalProfile(PP)。

可选包独立于前面两者提供附加的、模块化的和更为多样化的功能。

目前标准化的可选包包括数据库访问、多媒体应用、蓝牙等等。

二、J2ME平台体系结构

J2ME总共有3层体系。

J2ME的3层体系结构依照各种设备的资源特性,将J2ME技术架构分为简表(Profile)、配置(Configuration)和JavaVirtualMachine(JVM)3层,然后再进一步细分,这使J2ME能够在每一类设备的限制下工作,而同时提供最低限度的Java语言功能性。

1、Java虚拟机(JVM)层

这一层针对设备本地操作系统定制的Java虚拟机的实现,支持特定的J2ME配置,就像使用所有的Java技术一样,J2ME的核心也在一中虚拟机中。

2、配置(Configuration)层

面对的是大量各种不同的小型嵌入式设备,它们在外观和功能上均各不相同。

J2ME将这些设备进行分类,将一些共同提取出来形成适合于某个范畴中设备的规范,称为“配置”。

3、简表(Profile)层

简表层定义了特定系列设备上可用的应用程序编程接口(API)的最小集。

简表在一个特定的配置上面实现。

应用程序时针对特定的简表编写的,因此可以移植到支持该简表的任何设备上。

另外,一个设备可以同时支持多个简表。

用户和开发人员看到最多的就是这一层。

三、J2ME目标设备

1、CDC支持的设备

使用CDC开发的J2ME应用程序的目标设备通常具有以下特征:

·可供Java平台使用的160到512千字节的总内存

·功率有限,常常是电池供电

·网络连通性,常常是无线的、不一致的连接并且带宽有限

·用户接口混乱,程度参差不齐;有时根本就没有接口

2、CLDC支持的设备

一些CLDC支持的设备,包括无线电话、寻呼机、主流个人数字助手(/pda/PDA),以及小型零售支付终端。

依照SunMicrosystems,CDC的目标设备通常具有以下特征:

 ·使用32位处理器

·2兆字节或更多可供Java平台使用的总内存

·设备要求的Java2“蓝皮书”虚拟机的全部功能

·网络连通性,常常是无线的、不一致的连接并且带宽有限

·用户接口混乱,程度参差不齐;有时根本就没有接口

一些CDC支持的设备,包括常驻网关、智能电话和通讯器、PDA、管理器、家用电器、销售网点终端以及汽车导航系统。

四、MIDlet应用程序的生命周期

理解J2ME的体系结构并不像想象的那么容易,我们觉得读更多的资料帮助也不大,我们直接迈向J2ME开发也许会对你解J2ME平台体系结构这个重要的概念有所帮助。

在MIDP中定义了一种新的应用程序模型MIDlet,它是被ApplicationManagementSoftware(AMS)管理的。

AMS负责MIDlet的安装、下载、运行和删除等操作。

AMS控制MIDlet的方法:

startApp()、pauseApp()、destroyApp(boolean);MIDlet主动请求AMS改变其状态的方法:

resumeRequest()、notifyPaused()、notifyDestroyed()。

在被AMS管理的同时,MIDlet可以和应用管理软件通信通知应用管理软件自己状态的变化,通常是通过方法notifyDestroyed()和notifyPaused()实现的

MIDlet有三个状态,分别是pause、active和destroyed。

在启动一个MIDlet的时候,应用管理软件会首先创建一个MIDlet实例并使得他处于pause状态,当startApp()方法被调用的时候MIDlet进入active状态,也就是所说的运行状态。

在active状态调用destroyApp(booleanunconditional)或者pauseApp()方法可以使得MIDlet进入destroyed或者pause状态。

值得一提的是destroyApp(booleanunconditional)方法,事实上,当destroyApp()方法被调用的时候,AMS通知MIDlet进入destroyed状态。

在destroyed状态的MIDlet必须释放了所有的资源,并且保存了数据。

如果unconditional为false的时候,MIDlet可以在接到通知后抛出MIDletStateChangeException而保持在当前状态,如果设置为true的话,则必须立即进入destroyed状态。

其状态转化图如图2所示:

五、J2ME、J2SE与J2EE之间的比较

在Java中,类库以包(package)的形式提供,不同版本的Java提供不同的包,以面向特定的应用。

Java2平台包括标准版(J2SE)、企业版(J2EE)和微缩版(J2ME)三个版本。

1、Java2平台标准版(J2SE)

StandardEdition(标准版)J2SE包含那些构成Java语言核心的类。

比如:

数据库连接、接口定义、输入/输出、网络编程。

2、Java2平台企业版(J2EE)

EnterpriseEdition(企业版)J2EE包含J2SE中的类,并且还包含用于开发企业级应用的类。

比如:

EJB、servlet、JSP、XML、事务控制。

3、Java2平台微型版(J2ME)

MicroEdition(微缩版)J2ME包含J2SE中一部分类,用于消费类电子产品的软件开发。

比如:

呼机、智能卡、手机、PDA、机顶盒。

他们的关系是:

J2SE包含于J2EE中,J2ME包含了J2SE的核心类,但新添加了一些专有类。

他们的应用场合、API的覆盖范围各不相同。

笼统的讲:

J2SE是基础;压缩一点,再增加一些CLDC等方面的特性就是J2ME;扩充一点,再增加一些EJB等企业应用方面的特性就是J2EE。

对J2EE更恰当的说,应该是JAVA2企业开发的技术规范,不仅仅是比标准版多了一些类。

六、J2ME程序设计的几个原则

1、使用面向对象编程

虽然使用面向过程编程可以减小文件的尺寸,但是为了以后维护的方便和利于扩展,还是要使用面向对象编程。

2、使用MVC模式

 将模型、界面和控制分离。

现在很多的程序将三者合一,但是如果你做的程序比较大的话,还是建议你进行分离。

3、自动存储用户设定

使用RMS来存储用户的信息,例如存储用户上次输入的用户名、密码、用户对于系统的设定等,这样不仅可以减少用户的输入,而且对用户友好。

很多程序甚至做了自动登陆等。

4、设置关闭

一些系统设置允许用户关闭,如背景音乐、背景灯显示等。

5、使用线程

将低级用户界面的绘制动作放在一个独立的线程里面去。

6、给定界面

在需要大量时间才能完成的工作时,给用户一个等待界面。

七、课程设计思路

网络开发思路主要是客户端和服务端的设置。

在进行无线网络开发时需注意环境配置:

①将“2013”拷入tomat/webapps②双击tomcat/bin里的startup开启服务器。

现在就详细的讲解网络程序加自定义协议的程序编写:

1、自定协议(最终类或接口)

对自定义动作加以区分,制定自己的协议,如:

登录1,接到1后服务器验证,将验证结果返回:

publicfinalclassMyProtocal{//publicinterfaceMyProtocal

publicstaticfinalbyteLOGIN=0;//登载

publicstaticfinalbyteLIST=1;//查询

publicstaticfinalbyteINSERT=2;//插入

publicstaticfinalbyteOK=3;

publicstaticfinalbyteERROR=4;

}

2、案例

(1)描述:

登录后,出现主菜单,选择主菜单的查询和插入后分别执行相应的功能:

 

图3预测结果

(2)类图:

一个主程序类,一个协议,四个屏显

 

图4类图结构

 

(3)核心代码:

客户端:

(以登录为例)

newThread(){

dos.writeByte(MyProtocal.MSG_LOGIN);

dos.writeUTF(nameTextField.getString());

dos.writeUTF(pwdTextField.getString());

dos.flush();

bytems=dis.readByte();

if(ms==MyProtocal.OK){

clientMIDlet.display.setCurrent(mainList);

}

}.start()

服务端:

bytems=dis.readByte();

switch(ms){

caseMyProtocal.LOGIN:

login(dis,dos);break;

caseMyProtocal.QUEUE:

queue(dis,dos);break;

caseMyProtocal.INSERT:

insert(dis,dos);break;

}

dos.close();

dis.close();

publicvoidlogin(DataInputStreamdis,DataOutputStreamdos){

Stringname=dis.readUTF();

Stringpwd=dis.readUTF();

if(name.equals("liyi")&&pwd.equals("123")){

dos.writeByte(MyProtocal.OK);

dos.flush();

}

else{

dos.writeByte(MyProtocal.ERROR);

dos.flush();

}

}

具体的程序代码:

客户端:

publicclassClientMIDletextendsMIDlet{

Displaydisplay=Display.getDisplay(this);

LoginFormloginform=newLoginForm("login",this);

publicClientMIDlet(){

//TODOAuto-generatedconstructorstub

}

protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{

//TODOAuto-generatedmethodstub

}

protectedvoidpauseApp(){

//TODOAuto-generatedmethodstub

}

protectedvoidstartApp()throwsMIDletStateChangeException{

//TODOAuto-generatedmethodstub

display.setCurrent(loginform);

}

}

publicclassInsertFormextendsFormimplementsCommandListener{

MainListmainList;

ClientMIDletclientMIDlet;

CommandbackCommand=newCommand("back",Command.EXIT,1);

CommandinsertCommand=newCommand("insert",Command.SCREEN,1);

TextFieldscoreTextField=newTextField("score:

","",10,TextField.ANY);

publicInsertForm(Stringtitle){

super(title);

//TODOAuto-generatedconstructorstub

this.addCommand(backCommand);

this.addCommand(insertCommand);

this.setCommandListener(this);

}

publicvoidsetInsertData(MainListmainList,ClientMIDletclientMIDlet){

this.append("welcom"+LoginForm.name+",pleaseinsert:

");

this.append(scoreTextField);

this.mainList=mainList;

this.clientMIDlet=clientMIDlet;

}

publicvoidcommandAction(Commandc,Displayabled){

//TODOAuto-generatedmethodstub

if(c==backCommand){

clientMIDlet.display.setCurrent(mainList);

}

else{

newThread(){

publicvoidrun(){

try{

HttpConnectionhc=

(HttpConnection)Connector.open("http:

//localhost:

8080/2013/ServerHttpServlet",Connector.READ_WRITE);

hc.setRequestMethod(HttpConnection.POST);

DataOutputStreamdos=newDataOutputStream(hc.openOutputStream());

dos.writeByte(MyProtocal.INSERT);

dos.writeUTF(scoreTextField.getString());

dos.flush();

DataInputStreamdis=newDataInputStream(hc.openInputStream());

bytems=dis.readByte();

if(ms!

=MyProtocal.OK){

Alertalert=newAlert("InsertRack");

alert.setType(AlertType.ERROR);

alert.setTimeout(Alert.FOREVER);

alert.setString("没有插入成功");

clientMIDlet.display.setCurrent(alert,InsertForm.this);

}

else{

Alertalert=newAlert("InsertRack");

alert.setType(AlertType.CONFIRMATION);

alert.setTimeout(Alert.FOREVER);

alert.setString("插入成功");

clientMIDlet.display.setCurrent(alert,InsertForm.this);

}

}catch(IOExceptione){

e.printStackTrace();

}

}

}.start();

}

}

}

publicclassLoginFormextendsFormimplementsCommandListener{

TextFieldnameTextField=newTextField("name:

","",10,TextField.ANY);

TextFieldpwdTextField=newTextField("pwd:

","",10,TextField.ANY);

CommandloginCommand=newCommand("login",Command.SCREEN,1);

MainListmainList;

ClientMIDletclientMIDlet;

staticStringname=null;

staticStringpwd=null;

publicLoginForm(Stringtitle,ClientMIDletclientMIDlet){

super(title);

//TODOAuto-generatedconstructorstub

this.clientMIDlet=clientMIDlet;

mainList=newMainList("main",Choice.EXCLUSIVE,newString[]{"查询","插入"},null,clientMIDlet);

this.append(nameTextField);

this.append(pwdTextField);

this.addCommand(loginCommand);

this.setCommandListener(this);

}

publicvoidcommandAction(Commandc,Displayabled){

//TODOAuto-generatedmethodstub

if(c==loginCommand){

newThread(){

publicvoidrun(){

try{

HttpConnectionhc=

(HttpConnection)Connector.open("http:

//localhost:

8080/2013/ServerHttpServlet",Connector.READ_WRITE);

hc.setRequestMethod(HttpConnection.POST);

DataOutputStreamdos=newDataOutputStream(hc.openOutputStream());

dos.writeByte(MyProtocal.LOGIN);

dos.writeUTF(nameTextField.getString());

dos.writeUTF(pwdTextField.getString());

dos.flush();

DataInputStreamdis=newDataInputStream(hc.openInputStream());

bytems=dis.readByte();

System.out.println("con:

"+ms);

if(ms==MyProtocal.OK){

//将合法的用户名和密码保存起来

name=newString();

name=nameTextField.getString();

pwd=newString();

pwd=pwdTextField.getString();

//跳转到主界面

clientMIDlet.display.setCurrent(mainList);}

}catch(IOExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

}

}.start();

}

}

}

publicclassMainListextendsListimplementsCommandListener{

CommandgoCommand=newCommand("go",Command.SCREEN,1);

Que

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1