J2ME课程综述Word文件下载.docx
《J2ME课程综述Word文件下载.docx》由会员分享,可在线阅读,更多相关《J2ME课程综述Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
它们的组合取舍形成了具体的运行环境。
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()
服务端:
switch(ms){
caseMyProtocal.LOGIN:
login(dis,dos);
break;
caseMyProtocal.QUEUE:
queue(dis,dos);
caseMyProtocal.INSERT:
insert(dis,dos);
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);
}
具体的程序代码:
publicclassClientMIDletextendsMIDlet{
Displaydisplay=Display.getDisplay(this);
LoginFormloginform=newLoginForm("
login"
this);
publicClientMIDlet(){
//TODOAuto-generatedconstructorstub
}
protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{
//TODOAuto-generatedmethodstub
protectedvoidpauseApp(){
protectedvoidstartApp()throwsMIDletStateChangeException{
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);
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){
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{
alert.setType(AlertType.CONFIRMATION);
插入成功"
}catch(IOExceptione){
e.printStackTrace();
}
}.start();
}
publicclassLoginFormextendsFormimplementsCommandListener{
TextFieldnameTextField=newTextField("
name:
TextFieldpwdTextField=newTextField("
pwd:
CommandloginCommand=newCommand("
staticStringname=null;
staticStringpwd=null;
publicLoginForm(Stringtitle,ClientMIDletclientMIDlet){
mainList=newMainList("
main"
Choice.EXCLUSIVE,newString[]{"
查询"
插入"
},null,clientMIDlet);
this.append(nameTextField);
this.append(pwdTextField);
this.addCommand(loginCommand);
if(c==loginCommand){
HttpConnectionhc=
dos.writeByte(MyProtocal.LOGIN);
dos.writeUTF(nameTextField.getString());
dos.writeUTF(pwdTextField.getString());
DataInputStreamdis=newDataInputStream(hc.openInputStream());
System.out.println("
con:
+ms);
if(ms==MyProtocal.OK){
//将合法的用户名和密码保存起来
name=newString();
name=nameTextField.getString();
pwd=newString();
pwd=pwdTextField.getString();
//跳转到主界面
clientMIDlet.display.setCurrent(mainList);
}
//TODOAuto-generatedcatchblock
}
publicclassMainListextendsListimplementsCommandListener{
CommandgoCommand=newCommand("
go"
Que