270 likes | 601 Views
《Java 程序设计之网络编程 》. 教学课件. 重庆大学计算机学院 电子邮件: lizhx@126.com. J2ME 是 JAVA2 的微型版本,只支持 JAVA 标准规范中所定义的核心类函数库的子集。 J2ME 定位于嵌入式系统的应用上. 第 19 章 J2ME 概述. 主要内容. 19.1 J2ME 概述 19.2 J2ME 技术架构 19.3 MIDP 应用程序开发. 19.1 J2ME 概述.
E N D
《Java程序设计之网络编程》 教学课件 重庆大学计算机学院 电子邮件:lizhx@126.com
J2ME是JAVA2的微型版本,只支持JAVA标准规范中所定义的核心类函数库的子集。J2ME定位于嵌入式系统的应用上 第19章 J2ME概述
主要内容 • 19.1 J2ME概述 • 19.2 J2ME技术架构 • 19.3 MIDP应用程序开发
19.1 J2ME概述 • J2ME是JAVA2的微型版本只支持JAVA标准规范中所定义的核心类函数库的子集。比如,J2ME CLDC的规范之中,只支持java.lang.*,java.io.*,以及java.util.*的类函数库。并加入了一些支持嵌入式系统的扩展类函数库,如:javax.meicroedition.io.*类函数库。但是并不支持所有的JAVA基本类。
19.1.1 J2ME技术架构 • J2ME最基本的规范制定在JSR-68(Java规范编号第68号),在此规范里头定义了J2ME的技术架构
19.1.2 Configuration • 于是J2ME 先大致将所有的嵌入式设备大体上区分为两种:一种是资源有限;另外一种则是资源相对无限的设备 • J2ME把运算能力有限、电力有限这类的嵌入式设备称做Connected Liminted Device(可连接外界、资源有限的设备。
规定这类型的设备如果要能执行Java程序,则必须满足某些特定条件(CPU速度、内存、联机速度),这些必须满足的条件就定义在Connected Limited Device Configuration(CLDC)规范之中。 • 另外一种设备则称为Connoced evice(可连接、资源相对无限的设备),这种设备要能够执行Java程序的规范则定义在Connected Device Configuration(CDC)规范里面。
19.1.3 Profile • Profile是架构在Configuration之上的规范。所以每种Profile都会声明它是根植于哪种Configuration的。之所以有Profile的出现,是为了要更明确的区分出各种嵌入式设备之上的Java程序该如何开发,以及它们应该具有哪些功能。因此Profile中定义了与特定嵌入式设备非常相关的扩充类库。
通常Java程序在各种嵌入式设备上的用户界面该如何呈现就是定义在Profile上的(例如MIDP之中的LCDUI,Liminited Configuration Device User Interface).Profile之中也是定义了程序该如何和用户或设备产生互动(例如程序的生命周期,如何接受来自用户的信息)。Profile之中定义的扩充类库是根据底层Configuration内所定义的核心类库所建立,为了更符合特殊设备的需求,Profile会在Configuration之中的类增加新的方法,或是让方法抛出新的异常。
19.1.4 Optional Packages • 除了Configuration 与Profile之外,在J2ME规范之中还定义了厂商选择性实现(Optional Packages,选择性包)。所谓的厂商选择性实现,通常是一些本身具有独立价值的API,厂商可以依据自己的需求,选择性实现其中某些Optional Packages规范。
19.1.5 J2ME工业标准——JTW1 • JWTI(Java Technology for Wireless Industry)是一个综合性的规范,其目的是为了确保J2ME软件的可移植性。所以JWTI规范出了规范无线通讯平台(特别是手机)所必须支持的J2ME标准之外,也对既有规范中模糊不清的地方予以加强。
为了解决上述问题,进一步提高J2ME应用程序的可移植性,Sun Microsystems以MIDP2.0规范为核心,设计了JTWI规范。未来的无线通讯平台将不会支付和MIDP2.0规范,而且必须要符合JTWI规范。 • JTWI主要分为两个部分:规定平台必须支持的API、统一的应用程序执行环境。
19.1.6 JINI技术 • JINI是一种可以连接各种java平台的技术。不同java平台的程序经由JINI,能够彼此连接在一块,彼此分享对方的资源。其中,CLDC需要Gateway才能与JINI连接,原因在于他们没有RMI功能。而CDC可以实现RMI Optional Packages 以取得RMI功能。Smart Card 平台由于其特性使然,并没有经由JINI与其他Java版本的应用程序做沟通,只是在JINI所造成的广大分布式环境中作为认证用。
Jini 基础建设的核心包含以下几个部分: • Discovery Protocol:提供了如何让网路上任何种类的资源加入联盟的方式。 • eXtended RMI :Jini的元件彼此沟通时所使用的机制。 • Distributed Security:定义了Jini 联盟成员的使用权限。 • Lookup Service:用来展现联盟中的所有成员,以及帮助使用者寻找网路资源,或者负责提供联盟中的资源给使用者用。
19.1.7 Personal java • Personal Java是正规java版本的一个分支,其目的是能够让pda或手机执行java程序,目前在PocketPC或Symbian OS上都可以开发Personal Java应用程序。 • Personal Java规范并不属于J2ME的CLDC或者是CDC,虽然最后它将会够归到CDC的Personal Profile融合,但是目前其规范还是继续在发展中。之所以有这种情况,是因为长期以来已经有许多围绕着Personal Java的规范所实现出来的商业产品。
19.2 MIDP应用程序开发 • 这里讨论的J2ME无线应用开发主要是基于CLDC/MIDP的开发,其应用程序可运行于移植有KVM的手机、PDA等,这类设备由MIDP定义,即移动信息设备(MID),可看作垂直应用市场。 • MIDP应用程序的运行可以在模拟器上进行,也可以把应用程序通过IrDA、RS232或OTA等方式之一下载到目标设备上运行,通常情况下都是在模拟器上运行。
本部分采用的开发环境是Sun公司的J2ME Wireless Toolkit 2.2,大家可以在Sun公司网站上免费下载。其中,包含了程序运行需要的模拟器。当然,大家也可以采用其他功能更强大的开发工具,比如:Jbuilder、Eclipse等可视化开发工具。J2ME Wireless Toolkit的安装非常简单,只需要大家根按照提示一步一步的安装。
19.2.1 新建并运行MIDP程序 • 第一步:我们通过开始菜单,启动J2ME Wireless Toolkit 2.2工具集中的KtoolBar • 第二步:然后点击New Project按钮,在弹出的输入框中输入Project Name为HelloWorld,MIDlet Class Name为Hello。 • 第三步:点击Create Project,开始生成项目,工具会弹出MIDP配置简表。
第四步:这里接受生成的默认值(以后还可以修改)点击OK,工具提示我们把写好的Java源程序放到[WTK_HOME]\apps\HelloWorld\src目录之下第四步:这里接受生成的默认值(以后还可以修改)点击OK,工具提示我们把写好的Java源程序放到[WTK_HOME]\apps\HelloWorld\src目录之下 • 第五步:用程序编辑器编辑程序Hello.java,并保存到[WTK_HOME]\apps\HelloWorld\src目录之下。 • 第六步:保存好了之后,点击Build按钮,工具会为你编译程序。 • 第七步:再点击Run按钮,会弹出一个手机界面,显示程序运行结果。
19.2.2 综合示例 //应用程序生命周期,和J2SE一样,包java.lang.*是默认加载的 import javax.microedition.midlet.*; //MIDP用户界面 import javax.microedition.lcdui.*; public class Hello extends MIDlet implements CommandListener { private Display display; // 引用MIDlet的Display 对象 private TextBox textBox; // Textbox 显示一条消息 private Command cmdExit; // 设定按钮用于退出MIDlet public Hello() { // MIDlet构造程序 display = Display.getDisplay(this); cmdExit = new Command("Exit", Command.SCREEN, 1); textBox = new TextBox("My First MIDlet", "Hello, J2ME!", 50, 0); textBox.addCommand(cmdExit); textBox.setCommandListener(this); } // 必须要实现的接口,被应用管理软件调用来启动MIDlet public void startApp() { display.setCurrent(textBox); } public void pauseApp() { } // 必须要实现的接口 public void destroyApp(boolean unconditional) { } //必须要实现的接口 //检查一下是否选择了退出命令 public void commandAction(Command c, Displayable d) { if (c == cmdExit) {destroyApp(false); notifyDestroyed();}}}
import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class Test extends MIDlet implements CommandListener { private TextBox textbox; // Textbox 显示一条消息 private Display disp; // 引用MIDlet的Display 对象 private Command cmdExit; // 设定按钮用于退出MIDlet private Command cmdOK; // 确定按钮 private Alert alt; // 信息提示对象 public Test() { super(); disp = Display.getDisplay(this); // 获得当前MIDlet的Display对象 cmdExit = new Command("退出", Command.SCREEN, 1); // 新建两个控制按钮 cmdOK = new Command("阅读", Command.OK, 1); textbox = new TextBox("请输入待阅项目序号:", "", 40, 0); // 新建文本框 textbox.addCommand(cmdExit); // 添加控制按钮 textbox.addCommand(cmdOK); textbox.setCommandListener(this); // 开始侦听命令 }
protected void startApp() throws MIDletStateChangeException { alt = new Alert("登鹳雀楼");// 开始运行时显示信息,新建信息框对象 // 设置显示字符串 alt.setString("作者:(唐)王之涣"); alt.setType(AlertType.INFO); // 设置为普通阅读信息框 alt.setTimeout(Alert.FOREVER); // 信息窗口在按下DONE键后才能进入下一页面 disp.setCurrent(alt, textbox); // 显示信息窗口 } protected void pauseApp() {} protected void destroyApp(boolean arg0){} public void commandAction(Command arg0, Displayable arg1) { if (arg0 == cmdExit) { // 按下退出键时停止运行 destroyApp(false); notifyDestroyed(); } if (arg0 == cmdOK) { // 按下阅读键后阅读对应信息 TextBox textbox = (TextBox)arg1; // 得到用户输入的内容 String sInfo = textbox.getString();
if (sInfo.equals("1") || sInfo.equals("2") || sInfo.equals("3") || sInfo.equals("4")) { // 显示项目1的内容 // 根据所选项目选择要显示的内容 if (sInfo.equals("1")) alt.setString("白日依山尽"); if (sInfo.equals("2")) alt.setString("黄河入海流"); if (sInfo.equals("3")) alt.setString("欲穷千里目"); if (sInfo.equals("4")) alt.setString("更上一层楼"); alt.setTitle("您正在阅读短信" + sInfo); // 设置标题 } else{ alt.setString("很抱歉,暂时还没有您选择的项目,请重新输入!"); alt.setTitle("错误警告"); // 设置标题 } alt.setType(AlertType.INFO); // 设置为普通阅读信息框 alt.setTimeout(Alert.FOREVER); // 信息窗口在按下DONE键后进入下一页面 disp.setCurrent(alt, textbox); // 显示信息窗口 } } }