Merlin 的魔力:Swing 中的声音

Swing 体系结构一直为开发者提供创建类似于本地 UI 的 Java 应用程序用户界面的方法。Java 2 平台标准版(Java 2 Platform,Standard Edition)的最新版本进一步拓展了这个观念,它提供了一种将反馈声音与 UI 操作关联起来的机制 — 这里所说的反馈声音也就是用户习惯于从计算机扬声器中听到的哔哔声和叮当声。尽管该功能在缺省情况下是关闭的,John Zukowski 在 Magic 的魔力的这篇最新的文章中向您展示了如何发挥它的力量。 J2SE 版本 1.4 中新增了一项有趣的 Swing 功能。Swing 控件现在可以提供听觉反馈来对特定事件作出响应,不过缺省情况下这项功能是禁用的。新增的这项功能有助于 Swing 控件更好地模仿系统本地操作系统的控件的行为。 详细请参看: http://www-900.ibm.com/developerWorks/cn/java/j-mer0730/index.shtml <淘宝热门商品:
 

¥:28.00 

冲三皇冠疯抢啦 亲亲baby快乐驿站,宝宝用品童鞋童帽童装

*皇冠特色*纯手工,可爱特别的老虎护耳帽宝宝帽子童帽,46-48cm

 

3C数码配件 

江南精品馆----仪器机箱 仪表外壳 设备壳体大全


来源:程序员网

小小豆叮

JMS 1.1 通过统一的域简化了消息传递

JMS 构成了企业 Java 应用程序中消息传递的基础,但它一直以来都将点对点消息传递和发布/订阅消息传递当作完全独立的域来对待,这两种域的消息传递目标的类型截然不同。JMS 1.0.2 API 对同时使用这两种域的应用程序只提供很有限的支持,对开发与这两种域的目标能一起工作得同样好的可重用框架则不提供任何支持。JMS 1.1 统一了这两种域,从而克服了这一缺点。请与 J2EE 设计师和编写者 Bobby Woolf 一道,他将带您探讨使用 JMS 的最新版来开发 JMS 客户机代码是多么容易。 详细请参看: http://www-900.ibm.com/developerWorks/cn/java/j-jms11/index.shtml <淘宝热门商品:
 

2.35 元  

露连泉百货超级市场

阿尔卑斯喜缘喜糖 全市最低价

 

鲜花速递/蛋糕配送/园艺花艺 

瑞锦记锦缎喜糖袋〓婚礼特制●上等材质●流行韩


来源:程序员网

小小豆叮

JDBC驱动搜索列表(URL)

小小豆叮

(10)CDC API

第十章:CDC API
  • 介绍
    在这一章中,我们将描述 CDC 的目标设备和这些设备的要求。同时您也将了解到 CDC 支持的软件包和类。 
    由于本教程重点针对小型移动设备,我们将不会象学习 CLDC 是那样深入研究 CDC API。然而,我们会识别 CDC 所使用的 J2SE 软件包和类,以及 CDC 给 J2SE 软件包带来的附加功能。

 

  • CDC 的目标设备
    CDC 允许您为消费性电子产品和嵌入式设备开发应用程序,例如智能电话、双向寻呼机、PDA、家用电器、销售网点终端以及汽车导航系统等。这些设备运行 32 位微处理器,拥有超过 2 兆的内存,用于存储 C 虚拟机和库。 
    CDC 运行在 C 虚拟机 (CVM) 的顶部,与基础表关联在一起。基础表 (FNDp) 是一套 Java API,专为要求定制用户界面 (UI) 的高端设备服务,通常由设备制造商提供。

 

  • CDC API 概述
    CDC 是建立在 CLDC 顶部的 API,是整个 J2SE API 的一个更完整的子集。它还包含一个额外的软件包 -- javax.microedition.io 软件包 -- 包含 CLDC 中定义的所有相同的类和接口,及其它。 
    CDC 中的一些更值得注意的功能是 CLDC 中所没有的: 
    · 支持浮点数(包括 java.lang.Float、java.lang.Double 和 java.lang.StrictMath 类)

    · classloader 类 (java.lang.ClassLoader)

    · 支持本地进程 (java.lang.Process)

    · 高级多线程支持(包括支持线程组和更多线程)
    · 串行化的类 (java.io.Serialiable 和 java.io.Externalizable)

    · 映象 API(包括 java.lang.reflect 软件包)

    · 文件系统支持

    · 支持 J2SE 类型网络 (java.net)

    · 对 J2SE Collections API 更完全的支持

    · 为 javax.microedition.io 软件包增加一个 HttpConnection 接口。这样可为 HTTP 连接提供必要的方法和常量。

    · 支持 J2SE 的 java.lang.ref、java.math、java.security、java.security.cert、java.text、java.util.jar 和 java.util.zip 软件包。
<淘宝热门商品:
 

 

【广州商盟】意外金喜服装◎抵制暴利低价有好货◎收藏小店有惊喜

 

17.80 元  

居家家--18个月上四皇冠,家居类信用最高卖家

简家 四皇冠信用 鲸鱼USB暖手鼠标垫D4063 冬天上网必备


来源:程序员网

小小豆叮

(6)CLDC API

第六章:CLDC API
  • 介绍
    迄今为止,我们知道 CLDC 比较适合 J2ME,并且也已经建立了我们的开发环境。在这一章中,我们将更深入地探索 CLDC API。CLDC API 实际上只是 J2SE 的一个子集,它包括 java.lang、java.io 和 java.util,另加一个新软件包 -- javax.microedition。我们将逐个来研究这些软件包,并突出显示每一个包中的重要的类。 
    尽管每一个类都在 J2SE 中,但是没有必要让每一个类的 CLDC 实现都能实现 J2SE 支持的所有方法。您可以检查 CLDC API 文档以确认哪些方法是受支持的。文档的副本位于安装 J2ME CLDC 时创建的 j2me_cldc/docs 目录下。它提供 PDF 和 javadoc 两种格式。

 

  • java.lang
    CLDC java.lang 软件包是 J2SE java.lang 软件包的一个子集。与 J2SE 相比,它最引人注目的可能便是冗长的浮点操作了,特别是浮点 (Float) 和双精度 (Double) 类。如果使用浮点的话,这些冗余将涉及到所有其它的类。
    相对于 J2SE v1.3 API,CLDC API 中删去了几个其它的类。其中包括 ClassLoader、Compiler、InheritableThreadLocal、Number、Package、Process、RuntimePermission、SecurityManager、StrictMath、ThreadGroup、ThreadLocal 和 Void。 
    我们描述了可从下面几页表中的 CLDC java.lang 软件包中获取的主要的类。Java 开发人员对所有这些类的使用都应该是非常熟悉了。 
    除这些核心类之外,您还将看到 CLDC 支持的 Runnable 接口,正象 Exception 、Error 和其它有关的类一样。

 

  • java.lang 核心运行时类
    java.lang 软件包的核心运行时类有: 
    · Class -- 显示正在运行的 Java 应用程序中的类和接口。

    · Object -- 与在 J2SE 中相同,Object 是所有 Java 对象的基本类。

    · Runtime -- 为 Java 应用程序提供一种与运行时环境(Java 应用程序在其中运行)进行交互的方法。

    · System -- 提供一些静态的帮助方法,就像为 J2SE 提供方法一样。

    · Thread -- 定义 Java 程序的一个执行线程。
    · Throwable -- Java 语言中所有错误和异常的超级类。

 

  • java.lang 核心数据类型类
    java.lang 软件包中的核心数据类型类有: 
    · Boolean -- 包装 boolean 原始数据类型。 
    · Byte —- 包装 byte 原始数据类型。 
    · Character -- 包装 char 原始数据类型。 
    · Integer -- 包装 int 原始数据类型。 
    · Long -- 包装 long 原始数据类型。 
    · Short -- 包装 short 原始数据类型。

 

  • java.lang 帮助类
    java.lang 软件包的帮助类有:
    · Math -- 包含执行基本数学运算的方法。请注意,所有执行浮点值运算的方法都被省略了,仅保留了关于 integers 和 longs 的方法:abs()、min() 和 max()。

    · String -- 在 Java 中代表对象 String,就像在 J2SE 中一样。

    · StringBuffer -- 代表一个可以修改的串,就像在 J2SE 中一样。

 

  • java.io 输入类
    CLDC API 包含许多 J2SE 中共同使用的输入类。特别地,CLDC java.io 软件包中包括下面一些类: 
    · ByteArrayInputStream -- 包含一个内部缓冲器,它代表可能从输入流中读取的字节。

    · DataInput -- 一个接口,从二进制输入流提供字节以供读取并把它们转换成原始 Java 数据类型。DataInputStream 提供该接口的实现。

    · DataInputStream -- 允许应用程序以独立于平台的方式从基层输入流中读取原始 Java 数据类型。

    · InputStream -- 一个抽象类,它是所有代表字节输入流的类的超级类。

    · InputStreamReader -- 读取字节并把它们按照指定的字符编码方法转换成字符。
    · Reader -- 一种读取字符流的抽象类。
    注意:其中一些类可能不包含 J2SE 姊妹版支持的所有方法,就像在 java.lang 软件包中一样。尤其是省略了浮点和双精度方法。

 

  • java.io 输出类
    CLDC API 包含了许多 J2SE 中的共同使用的输出类。特别是,CLDC java.io 软件包中包括下面一些输出类: 
    · ByteArrayOutputStream -- 实现一个输出流,在此输出流中数据被写入字节数组。

    · DataOutput -- 一种接口,提供原始 Java 数据类型以供写入二进制输出流。DataOutputStream 提供该接口的实现。

    · DataOutputStream -- 一个输出流,允许应用程序以一种便捷的方式编写原始 Java 数据类型。

    · OutputStream -- 一个抽象类,它是所有代表字节输出流的类的超级类。

    · OutputStreamReader -- 给出字符,并按指定的字符编码方法将其转换为字节。

    · PrintStream -- 添加一种便捷的方法来打印数据值的文本表现形式。
    · Writer -- 编写字符流的一个抽象类。
    其中一些类可能不包含 J2SE 支持的所有方法,比如浮点和双精度方法。

 

  • java.util 收集类
    CLDC java.util 软件包中包含 J2SE java.util 软件包中最常用的类。这些类中包括四个收集类(实际是三个收集类和一个接口),以及日期/时间和实用程序类。 
    CLDC 支持的 java.util 收集类有:
    · Enumeration -- 一个接口,通过项目集允许对例程进行重复调用。

    · Hashtable -- 实现 hashtable,将键映射到值。

    · Stack -- 代表了一个后进先出 (LIFO) 的对象集合或堆栈。

    · Vector -- 代表可以调整大小的对象“数组”或者矢量。

 

  • java.util -- 其它的类
    CLDC 支持的 java.util 类中其余部分包括日期和时间类,以及 Random 实用程序类。下表中简要列出了这些类。
    · Calendar -- 一个抽象类,使用一套整型字段如 YEAR、MONTH、 DAY 等来获取和设置日期。

    · Date -- 代表特定的时间和日期,精确到毫秒级。

    · Random -- 一个实用程序类,用来生成 int 或 long 的随机值流。

    · TimeZone -- 代表时区的偏移量,也用于校正时间。

 

  • javax.microedition.io
    迄今为止,我们在 CLDC API 中看到的所有的类都是 J2SE API 的子类。CLDC 还包含一个附加的软件包 -- javax.microedition.io。 
    在这个包里唯一被定义的类就是 Connector 类,也称为工厂类,包含创建 Connection 对象或输入、输出流的方法。 
    当动态识别一个类的名字时,Connection 对象就被创建了。类名称的识别基于平台名称和被请求连接的协议。描述目标对象的参数串应该满足 RFC 2396 规范所要求的格式。请使用下列格式: 
    {scheme}:[{target}][{params}]
    {scheme} 是一个协议的名称,如 http 或 ftp。{target} 通常是一个网络地址,但是面向非网络的协议则可能把它当作一个相当灵活的字段来处理。还有一些参数,如 {params} 被指定为一系列形如 ";x=y" 的分配形式(例如,;myParam=value)。

 

  • javax.microedition.io 帮助接口
    除类属连接工厂类之外,javax.microedition.io 软件包中还包含下列面向连接的接口: 
    · Connection -- 定义了最基本的连接类型。这个接口也是此软件包中所有其它连接接口的基本类。

    · ContentConnection -- 定义了一个可以通过内容的流连接。

    · Datagram -- 定义了一个类属数据报接口。

    · DatagramConnection -- 定义了类属数据报连接和它必须支持的性能。

    · InputConnection -- 定义了一个类属输入流连接和它必须支持的性能。

    · OutputConnection -- 定义了一个类属输出流连接和它必须支持的性能。

    · StreamConnection -- 定义了一个类属流连接和它必须支持的性能。

    · StreamConnectionNotifier -- 定义了一个流连接的通告程序必须具有的性能。
<淘宝热门商品:
 

9.80 元  

恒睿日本长筒棉袜批发网

疯狂促销 韩国进口复古百搭格子围巾风扉全球明星必备 只要9.8

 

268.00 元 

绝对NO1新版mirifem魔力丰丰胸片


来源:程序员网

小小豆叮

(9)MIDP API

第九章:MIDP API
  • 介绍
    移动信息设备简表 (MIDP) 适合类似于蜂窝电话和寻呼机这样的设备。MIDP,就象 KJava 一样,同样也建立在 CLDC 之上。MID 简表提供一种标准的运行时环境,允许在终端用户设备上动态地配置新的应用程序和服务。
    在本章中,我们将详细地讨论 MID 定义的七个软件包。我们还将建立一个 MIDP 应用程序示例。

 

  • UI 设计注意事项
    MIDP 包括一个低级的 UI API 和一个高级的 UI API。低级的 API 允许您完全访问一个设备的显示屏,也允许访问原始键和指针事件。然而,使用低级 API 时, 没有可用的用户界面控件。应用程序必须精确地绘制出按钮和其它所有的控件。 
    相反,高级 API 提供简单的用户界面控件但不能直接访问原始的输入事件或显示屏。由于显示屏的尺寸和 MIDP 设备输入方法的差异,控件显得很抽象。MIDP 的实现确定了绘制控件的方法,也确定了如何管理用户输入。 
    让我们在后面的章节里更进一步了解 MIDP 的软件包和类。

 

  • MIDP API
    MIDP 包含四个核心 CLDC 软件包 (java.lang、java.io、java.util 和 javax.microedition.io),另加下面的三个特定于 MIDP 的软件包: 
    · javax.microedition.lcdui 
    · javax.microedition.midlet 
    · javax.microedition.rms
    我们将在本章的后面部分详细介绍特定于 MIDP 软件包。除了上面新的软件包之外,MIDP 还向核心 CLDC 软件包添加了四个新类,如下所示。 
    · java.util.Timer -- 用于为后台线程中将来要执行的任务确定时间。

    · java.util.TimerTask -- 被 java.util.Timer 类使用,用来为后台线程中稍后的执行定义任务。

    · javax.microedition.io.HttpConnection -- 一个接口,为 HTTP 连接定义必要的方法和常量。

    · java.lang.IllegalStateException -- 一个 RuntimeException, 指出在不合法或不合适的时间已经调用的一个方法。

 

  • MIDlet 介绍
    MIDlet 是一个 Java 类,它扩展了 javax.microedition.midlet.MIDlet 抽象类。实现 startApp()、pauseApp()和 destroyApp()方法,这些方法类似于 J2SE 的 java.applet.Applet 类中的 start()、stop()和 destroy()方法。 
    除了扩充 javax.microedition.midlet.MIDlet 的主 MIDlet 类之外,一个 MIDP 应用程序通常还包括其它一些类,这些类能随它们的资源一起被打包成为 jar 文件 -- 称之为 MIDlet 套件。一个 MIDlet 套件中的不同 MIDlet 能共享 jar 文件的资源,尽管不同套件中的 MIDlets 不能直接相互作用。 
    MIDlet 在应用程序生命周期中有三种可能的存在状态 -- 运行状态、暂停状态、销毁状态。运行状态,正如其名称所暗示的,意味着 MIDlet 正在运行中。这种状态始于 startApp 方法被调用时。在暂停状态中,MIDlet 持有的所有资源将被释放,但是它准备着再次被运行。调用 notifyPaused 方法时,MIDlet 处于暂停状态。在销毁状态中,MIDlet 已经永久地将其自身关闭,释放所有的资源,等待着废物清理程序的处理。它是通过 notifyDestroyed 方法来调用的。 
    在接下来的两页中,我们来看一个简单的 HelloWorld MIDlet。

 

  • HelloWorld MIDlet
    与使用 KJava HelloWorld 应用程序一样,这个 MIDlet 也会在 MIDP 设备的显示屏上显示 "Hello World!" 和 Exit 按钮,按下该按钮会终止应用程序。 
    HelloWorld.java 文件以下面的代码行开始,这些代码行导入稍后会在 HelloWorld 类中使用的类: 

    import javax.microedition.midlet.MIDlet;
    import javax.microedition.lcdui.Command;
    import javax.microedition.lcdui.CommandListener;
    import javax.microedition.lcdui.Display;
    import javax.microedition.lcdui.Displayable;
    import javax.microedition.lcdui.Form;
    由于 HelloWorld 类是一个 MIDP 应用程序,它扩展了 MIDlet。它也实现 CommandListener 接口来处理事件: 

    public class HelloWorld extends MIDlet implements CommandListener
    下面的方法是一个缺省构造程序,它创建一个新表单,在上面初始化控件,然后显示出来: 

    private Form form;

    public HelloWorld()
    {
    // Create a new form on which to display our text
    form = new Form("Test App");

    // Add the text "Hello World!" to the form
    form.append("Hello World!");

    // Add a command button labeled "Exit"
    form.addCommand( new Command( "Exit", Command.EXIT, 1 ) );

    // Register this object as a commandListener
    form.setCommandListener( this );

    调用 startApp() 方法启动应用程序与小应用程序的启动方法很象。在 MIDle 的一次执行中它可能会被调用多次。如果 MIDlet 暂停,pauseApp() 将会被调用。要重新启动 MIDlet,需调用 startApp()。仅须执行一次的主初始化代码应该放置在构造程序中: 

    public void startApp()
    {
    // Get a reference to the display, and show the form
    Display display = Display.getDisplay(this);
    display.setCurrent( form );

    pauseApp() 被调用使得 MIDlet 处于暂停状态。在此应用程序中,当进入暂停状态时,我们没执行任何操作;但是我们仍然需要在 MIDlet 中实现 pauseApp 方法,因为它是父 MIDlet 类中的抽象方法。 
    public void pauseApp() { }
    destroyApp() 被调用,破坏了 MIDlet 并使其处于销毁状态。在此应用程序中,我们通过将引用设为 null,释放了对表单的引用。 
    public void destroyApp(boolean unconditional)
    {
    form = null;
    }
    commandAction() 方法是事件处理程序,被请求实现 CommandListener 接口。目前,它破坏了应用程序并通知应用程序管理软件 MIDlet 已经完成。 

    public void commandAction(Command c, Displayable d)
    {
    // Destroy this MIDlet
    destroyApp(true);

    // Notify the application management software that this MIDlet
    // has entered the destroyed state
    notifyDestroyed();
    }

 

  • MIDP 软件包
    除标准 CLDC 软件包之外,MIDP 还包含三个附加的软件包: 
    · javax.microedition.lcdui -- 定义用来控制 UI 的类。这个软件包既包含高级 UI 类(例如 Form、Command、DateField 和 TextField 等),又包含低级 UI 类(允许用低级方式控制 UI)。

    · javax.microedition.midlet -- 包含 MIDP 主类中的一个,MIDlet 类,为 MIDP 应用程序提供访问关于其运行所在环境信息的权限。

    javax.microedition.rms -- 定义一个类的集合,这些类为 MIDlet 提供了永久存储并随后重新得到数据的机制。
<淘宝热门商品:
 

 

专做VIVI昕薇瑞丽韩日女装~

 

6.80 元  

北欧橱窗

三冠 三角形强力吸墙角架/置物架/杂物架 承重3公斤 不伤墙面0.14


来源:程序员网

小小豆叮

(4)J2ME简表

第四章:J2ME简表
  • J2ME 简表是什么?
    如我们在前面教程中提及的,一个简表定义了受支持设备的类型。例如,移动信息设备简表 (MIDP),定义了蜂窝电话的类。它把一些特定于域的类加入J2ME 配置中来定义对类似设备的使用。已经为 J2ME 定义了两个简表:KJava 和 MIDP 。它们都构建在 CLDC 之上。KJava 和 MIDP 都和 CLDC 及小型设备相关联。 
    简表被构建在配置的顶部。由于简表是特定于运行应用程序的设备的大小(内存的数量),所以,某个简表是与某种特定的配置相关联的。 
    在纲要简表上,您可以创建自己的简表,这种纲要简表也称为基础表,它对于 CDC 也是可用的。然而,在本教程和本节中,我们将只重点学习建立在 CLDC 上的 KJava 和 MIDP 简表。

 

  • 简表 1:KJava
    KJava 是归 Sun 公司所有的简表,它包含 KJava API。KJava 简表建立在 CLDC 配置的顶部。KJava 虚拟机,KVM,像标准的 J2SE 虚拟机那样接受相同的字节代码和类文件格式。
    KJava 包含一个特定于 Sun 的、运行在 Palm 操作系统上的 API。这个 KJava API 和 J2SE 抽象视窗工具包 (AWT) 有很多地方都是相同。然而,由于它不是一个标准的 J2ME 软件包,它的主软件包是 com.sun.kjava。在以后的教程中开发一些示例应用程序时会学到更多关于 KJava API 的知识。

 

  • 简表 2: MIDP
    MIDP 适合诸如蜂窝电话和寻呼机等移动设备。MIDP 和 KJava 一样,也是建立在 CLDC 之上的,并且提供一个标准的运行时环境,允许在终端用户设备上动态地部署新的应用程序和服务。 
    MIDP 是一个公共的、为移动设备设计的工业标准简表,它不依赖某个特定的商家。对于移动应用程序开发来说,它是一个完整的、受支持的基础。 
    MIDP 包含下列软件包,前面 3 个是核心 CLDC 软件包,另加 3 个特定于 MIDP 的软件包。我们将在后面的教程中讨论每个软件包: 
    · java.lang 
    · java.io 
    · java.util 
    · javax.microedition.io 
    · javax.microedition.lcdui 
    · javax.microedition.midlet 
    · javax.microedition.rms

 

  • MIDP 取代 KJava
    正如我们在前面的章节中提及的,KJava 是 Sun 公司所拥有的一个 API。它不作为一种完整的、功能齐全的简表,而是作为一种示范,示范简表如何与 CLDC 一起工作。根据 CLDC 发行说明 (其中包含 CLDC 下载版本):
    在软件包 com.sun.kjava 中提供的 GUI 类不是连接限制设备配置 CLDC 的一部分。Java 2 平台袖珍版的正式 GUI 类,将通过 Java Community Process 分别定义并被包含进 J2ME 简表中。
    不管这个事实存在与否,KJava 简表已经被早期的采用者广泛使用了。在 2001 年 JavaOne 的开发商会议上,Sun 公司宣称早期 Palm 操作系统的 MIDP 可用性(MID 简表的最初发行版焦点主要集中在无线电话上)。 Palm 操作系统 MIDP 的规格是由 Java Community Process (JCP) 定义的。因此,它是独立于供应商的。当前众多限制中的一个 -- 它将随时间消失 -- 就是 Palm 操作系统的 MIDP 需要最新的 Palm 操作系统,3.5 版。
    在我们写这个教程的同时, Palm 操作系统的 MIDP 的规范仍然在随着 JCP 不断发展,其细节也会随时改变。尽管目前还无法确定其发行日期,但是规范一旦出台,将必然减少对 KJava 的需求。
<淘宝热门商品:
 

 

义乌三冠店→大量贩の热销女性用品(零售+批发)

 

110.00元  

动感娱乐中心(修身堂 减肥咖啡 瘦身咖啡 神奇咖啡)


来源:程序员网

小小豆叮

(5)设置您的开发环境

第五章:设置您的开发环境
  • 介绍
    在这一章,我们将学习如何下载和安装开发 J2ME 应用程序 必需的软件。现在就让我们开始吧,首先学习 Windows 或 UNIX 环境下下载和安装 CLDC。目前 CLDC 1.0 发行版包含 Win32、Solaris 和 Linux 平台上的 CLDC 执行。我们将在您的 Palm 设备上安装 KVM ,然后学习如何编译 Palm 数据库开发工具。 
    下一步,您将学到如何下载和安装 Palm 操作系统仿真器 (POSE) 以及如何把 Palm 设备中的 ROM 映像传送到您的 PC 以便和仿真器一起使用。 
    最后,我们来看一看如何下载和安装 J2ME 无线工具包,该 工具包可用来开发 MIDP 设备的 J2ME 应用程序。

 

  • 在 Win32 或 UNIX 中下载和安装 CLDC
    在 Windows 或 UNIX 平台上安装 CLDC 和 Sun 的 KVM 软件 : 
    1. 下载 CLDC。需要下载和安装的两个软件包为: j2me_cldc-1_0_2-fcs-winunix.zip 和 j2me_cldc-1_0_2-fcs-kjava_overlay.zip。

    2. 解压第一个软件包。 
    o 在 Windows 环境下,您可以把包里的内容解压至根目录 c:\ 下。

    o 在 UNIX 环境下,把内容解压至您喜欢的目录下。可以是 主目录,但如果您为这台机器的所有用户安装的话,就把它安装在经常安装共享应用程序文件的地方( 例如,通常是类似 /usr/local 或 /opt 的目录。)
    在安装目录下,会创建一个新的文件夹 j2me_cldc,并且它 还包含下列子目录:jam、docs、build、tools、api、kvm、samples 和 bin。
    3. 将第二个软件包解压至刚在 CLDC 安装过程中创 建的 j2me_cldc 目录下。如:Windows 下的 c:\j2me_cldc,或者 UNIX 下的 /usr/local/j2me_cldc 或 /opt/j2me_cldc。如果出现提示,则覆盖现有的所有文件。

    4. 把目录 j2me_cldc/bin 添加到 PATH 中,以免每 次运行 CLDC 程序 kvm 和提前验证时都要键入完全路径。

 

  • 在您的 PDA 上安装 CLDC 和 KVM
    使用 PDA 设备的 HotSync 功能在您的 Palm 操作系统上安 装 kvm.prc 和 kvmutil.prc 文件。从 Windows 环境安装以下文件: 
    1. 把 PDA 放置在其初始位置。

    2. 在 Palm 设备的桌面上,单击安装图标。

    3. 单击浏览按钮选择目录 c:\j2me_cldc\bin。

    4. 选择文件 kvm.prc 和 kvmutil.prc。注意在相同 的目录下有各种其它的 prc 文件 -- 这些文件包含一些示例应用程序,您可能希望安装这些应用程序用 来试验。

    5. 在 PDA 的初始位置按下 HotSync 按钮来安装选 中的 prc 文件。

    6. 在 PDA 上,定位任一个刚安装的文件。单击 PDA 上的两个文件中的一个图标来装入和运行应用程序。现在就可以设置堆的最大尺寸和屏幕输出选项。

 

  • 编译 Palm 数据库工具
    通过安装 CLDC 软件包,您已经设置了开发环境。现在您可 以访问分别位于 j2me_cldc/docs 和 j2me_cldc/bin/api/classes 中的文档和类。
    j2me_cldc/tools 是和两个软件包同时安装的其它目录中的 一个目录,存储着用来生成 .prc 文件的实用程序。这些实用程序允许您在 PDA 上安装 J2ME 应用程序 。为了能使用目录 j2me_cldc/tools 中的工具,您必须首先编译类文件: 
    1. 进入或转入 j2me_cldc/tools/palm 目录。

    2. 创建一个称为 classes 的子目录。

    3. 通过键入下面的一行命令来编译 .java 源文件:  
    4. 
    5. javac -d classes src/palm/database/*.java
    现在类已经编译好了,可以在类的子目录中找到。

    6. 把 src/palm/database/Wrapper.prc 和 src/palm/database/DefaultTiny.bmp 文件复制到类目录中去。 
    现在您已经成功编译了 Palm 数据库工具的类文件并把它们 放在了 j2me_cldc/tools/palm/classes 和它的子目录里。您可以加入整个路径到 Java CLASSPATH 的 类的子目录中。或者,当使用 Palm 数据库工具时,您可以把它加入到指定 java 命令行的 CLASSPATH 中。

 

  • 安装 Palm 操作系统仿真器 (POSE)
    Palm 操作系统仿真器 (POSE) 应用程序软件仿真不同的 PDA 模型。仿真器允许在下载 PDA 应用程序到 PDA 之前,对它们进行开发、测试和调试。POSE 可从 Palm 操作系统仿真器 Web 站点上是免费获取(请参阅参考资料)。 
    它的二进制版本仅可用于 Windows。尽管 POSE 也可以在 UNIX 环境中运行,但您必须从 Palm OS Web 站点上下载源文件然后对它们进行编译,以适合您特定的 UNIX 平台。 
    在 Windows 下下载和安装 POSE: 
    1. 从 Palm OS Web 站点上下载 POSE 的最新压缩文 件。

    2. 将压缩文件中的内容解压至自己的目录下。

    3. emulator.exe 文件现在已经在 POSE 的安装目录 中了。当启动时,emulator.exe 就运行 Palm 操作系统仿真器。

 

  • 上载 ROM 映像
    为了使用仿真器,目标 PDA 需要一个 ROM 的副本(“ROM 映像”)。ROM 提供一个可以被 POSE 仿真器精确模仿的操作系统。ROM 映像可以从一些制造厂商处获 得,但是您也能从自己的 PDA 上下载一个 ROM 映像。 
    为了察看您的桌面或工作站上的 Palm 计算机的 ROM 映像, 您可以使用 POSE 从 PDA 上下载 ROM 映像。 
    注意:经常变动的用户 (handspring users) 必须使用常规 的串行电缆和 COM 端口,而不能使用 USB 电缆。
    操作步骤: 
    1. 启动与 Palm 设备一起提供的 Palm 桌面软件, 然后单击安装图标。

    2. 浏览 POSE 目录并选择 ROM Transfer.prc 文件 。

    3. 把 Palm 设备放置在其初始位置。

    4. 在初始位置按下 HotSync 按钮,开始安装文件。 当完成这个过程时,会有一个 ROM Transfer 的图标显示在您的 Palm 设备上。

    5. 为传送 ROM 映像,您必须退出 HotSync 管理器 ,并确认它不在 PC 上运行。然后把您的 Palm 设备留在初始位置。

    6. 在您的 Palm 设备上单击 ROM transfer 图标。
    7. 在您的 PC 上,转到 POSE 目录下并运行 emulator.exe 程序。出现模拟器窗口。

    8. 在您的 PC 上,从菜单中选择 Download 按钮。 在您的 Palm 设备上,单击 Begin Transfer 按钮。ROM 映像的传送需要几分钟。

    9. 当传送完成时,会提示您选择一个目录来保存文 件。在 POSE 目录中以 palm.rom 为名保存该文件。

    10. 在 Palm 操作系统仿真器 窗口中,选择 New。出 现 New Session Emulator 窗口。

    11. 在 New Session Emulator 窗口中选择恰当的设 置,然后单击 Browse 按钮选择刚刚传送过的 ROM 文件、palm.rom。

    12. 最后,单击 OK 按钮。 
    如果传送成功,可以看见一个 Palm 设备的映像加载在您的 PC 或工作站监视器上。

 

  • 下载和安装 J2ME 无线工具包 (J2ME Wireless Toolkit)
    J2ME 无线工具包提供一个完整的开发环境来编写和测试 MIDP 应用程序。下载包括工具、文档和仿真环境,例如,一个与 Forte for Java 集成的模块。
    目前,J2ME 无线工具包仅支持 Windows 98 第二版、 Windows NT 4.0 和 Windows 2000 是可用的,不支持 Windows 95。J2ME 无线工具包的 Solaris 和 Linux 版本在本教程编写的同时正处于筹划之中。
    在 Windows 环境下安装 J2ME 无线工具包请按如下步骤:
    1. 下载 J2ME 无线工具包。 
    2. 运行 j2me_wireless_toolkit-1_0_1-fcs.exe 安 装无线工具包。 
    当系统提示您提供安装目录时,请确保该安装目录的完全合 法的路径中不包含任何空格。这将帮助您在今后使用工具包时避免可能出现的问题。
    如果您计划使用 Forte for Java 进行开发的话,在 Setup Type 对话框中选择 Integrated setup。
<淘宝热门商品:
 

138.00 元  

免邮-七色瘦减肥胶囊-店主亲试劲减30斤前后照片

 

¥:21.0 

【华佗天然居】天然花草茶花茶中草药中药材

花草茶之瘦腿茶:迷迭香+柠檬草+马鞭草30包21元包快递美容减肥茶


来源:程序员网

小小豆叮

(8)使用Kjava事件处理的开发

第八章:使用Kjava事件处理的开发
  • 介绍
    在这一章,我们将学习 KJava 事件处理,并用简单的绘图应用程序 Scribble 来示范它是如何工作的。
    KJava 事件处理模型不如 J2SE 的 action-listene 模型先进。通过使 Spotlet 类子类化,所有感兴趣的事件都是可访问的,无论怎样,KJava 应用程序都将完成这项工作。目前,只有 spotlet 受到了事件的关注。为了关注 spotlet,我们使用 register()。如要停止,则使用 unregister()。 
    注意:如果您用 WANT_SYSTEM_KEYS 注册一个 spotlet ,设备不会通过按下按钮和排队等候停止它的应用程序来自动终止这个应用程序。相反,按下按钮事件会通报这个应用程序,然后负责适当地处理事件。除非当按下按钮时您提供一种通过调用 System.exit 终止应用程序的方法,否则这个应用程序将会继续不确定地运行。唯一能终止这个应用程序的方法就只有重启该设备。
    KJava 支持三种基本类型事件:显示屏上笔的移动、键盘输入和电子束定向发送/接收。另外,还有一种全面的包罗万象的方法 -- unknownEvent()。在后面的章节中我们将讨论这些不同的事件类型。

 

  • 处理笔的移动
    处理 PDA 显示器上笔的移动的事件处理程序有:penDown、penMove 和 penUp。 
    当用户将笔在显示器上移动时,penDown() 方法将被调用,它传递显示器上笔的放置点的 X 和 Y 轴坐标。
    public void penDown( int x, int y )
    当用户在显示器上移动笔时 penMove() 过程将被调用。X 和 Y 轴坐标定义笔的当前位置。
    public void penMove( int x, int y )
    当用户将笔从显示器上移开时 penUp() 过程将被调用,它传递两个参数:笔被移开点的 X 和 Y 轴坐标。
    public void penUp( int x, int y ) 

 

  • 处理键盘输入,电子束定向发送/接收,以及未知事件
    在 J2SE AWT 中,接口 java.awt.event.KeyListener 包含处理不同键盘事件的 keyPressed、keyReleased 和 keyTyped。与此相比,KJava 则只有一个函数,keyDown()。
    如果用户在可书画区写下一个字符,按下计算器或菜单图标,或者是按下任何“硬键”(缺省情况下,Date Book、Address、page up、page down、To Do List 或是 Memo Pad key )时,事件 keyDown 就会被调用。参数 keyCode 标识用户输入的键的代码。如果按了其中一个“硬键”,事件 keyDown 就开始匹配这个类中定义过的相应常量中的一个。
    public void keyDown( int keyCode )
    beamReceive() 方法被用于接收从红外线 Palm 设备传来的数据包。数据以一种字节数组的方式被接收,并用虚拟机自动分配这些数据。
    public static boolean beamReceive( byte[] data )beamSend() 方法不是一个事件处理程序,但是它显然与 beamReceive() 相关联,所以我们在这儿还是要提一下。这种方法被用来给发送到另一个红外线 Palm 设备的数据包定向。在给数据定向时,您可以调用这个函数,但是目标设备必须在接收数据的 spotlet 中注册一个 beamReceive 处理器。
    public static boolean beamSend( byte[] data )
    unknownEvent 是一个常规的所有未知事件处理例程。
    public void unknownEvent( int event, java.io.DataInput in )

 

  • Scribble 应用程序介绍
    现在我们了解了事件处理的基础,我们即将进入更为高级一些的 J2ME 开发。在本章中,我们将开发 Scribble 应用程序。我们不会逐行描述代码,但是,我们将描绘重要的代码行和每个方法的目的。您可从参考资料上访问完整的代码清单。
    Scribble 应用程序是一个独立的应用程序,示范使用 Sun 公司的 KJava API 开发 Palm 操作系统。Scribble 允许您在显示屏上徒手绘图,或添加想要的正规文本。

 

  • 开始使用 Scribble
    在 HelloWorld 应用程序中,我们需要导入 Scribble 应用程序要使用的类。下面是标识被 Scribble 使用的类的文本块: 

    import com.sun.kjava.Bitmap;
    import com.sun.kjava.Button;
    import com.sun.kjava.Dialog;
    import com.sun.kjava.Graphics;
    import com.sun.kjava.HelpDisplay;
    import com.sun.kjava.Spotlet;
    Scribble 类扩展了 J2SE 中使用的 Spotlet 类。它从定义最终的静态类变量开始。 
    public class Scribble extends Spotlet
    类变量 g 担当了对单独的 Graphics 对象的引用,该对象在类中始终被使用: 

    static Graphics g = Graphics.getGraphics ();

 

  • 定义方法和事件处理程序
    此外,main() 定义了应用程序的主要入口。 

    public static void main(String[] args)
    默认的构造程序,Scribble 初始化成员变量,清屏并画出初始框架。 

    public Scribble()
    paint() 方法负责更新或刷新显示。它使用类变量 g -- 一个 Graphics 对象,类似于 Java 2 AWT 中使用的 Graphics 对象。 
    private void paint()
    penDown() 方法执行事件处理程序来处理在屏幕上放置笔的事件。它通过 X 和 Y 坐标来定位。在 Scribble 中,程序测试 Clear 或 Exit 按钮是否被按下,如果按下的话,就处理相应的事件。 

    public void penDown(int x, int y)
    keyDown() 方法处理那些在 Palm 设备的即兴书画框内随手写下的东西。传送到这个方法中的整型值 keyCode 就是输入的字符键值。在 Scribble 应用程序中,我们存储了成员变量 lastKey 中被按下的键,然后调用 paint() 方法刷新屏幕。 
    public void keyDown(int keyCode)
    penMove() 方法处理在屏幕上拖动笔的事件。在 Scribble 中,它负责用笔绘画。 

    public void penMove(int x, int y)
    使用的最后一个方法 clearDrawingArea(),在用户按下 Clear 按钮时由 penDown 事件处理程序调用。由于它仅在 Scribble 类的内部使用,所以 clearDrawingArea() 是一个私有方法。 

    private void clearDrawingArea()
<淘宝热门商品:
 

 

淘宝紫砂壶第一皇冠!淘宝最大的信用度第一的紫砂壶大卖家!

 

128.00 元  

【广州商盟】*大学生淘宝皇冠第一店-鞋神--三人行出口剩余旗舰店

【大学生皇冠店】new balance纽巴伦378经典款 天蓝


来源:程序员网

小小豆叮

(7)使用Kjava GUI组件的开发

第七章:使用Kjava GUI组件的开发
  • 介绍
    本章中,我们来学习如何使用 KJava API 进行 GUI 开发。首先看一下 KJava GUI 开发的介绍,然后使用 KJava API 开发我们的第一个 J2ME 应用程序。HelloWorld ,将示范一个使用 CLDC 的简易 J2ME 应用程序、KJava 简表以及 Palm 操作系统的 KVM。
    在下一章我们继续进行 KJava GUI 开发,构建另一个应用程序并重点学习事件处理模块。

 

  • Spotlet 介绍
    KJava API 提供了一套开发 Palm 操作系统设备应用程序的类。KJava 提供了一个 Spotlet 类,com.sun.kjava.Spotlet,它和 J2SE Canvas 类在添加用于事件处理的回调方法上类似。因此,应用程序可以扩展 Spotlet 类,不使用合适的事件处理方法也可提供需要的功能。 
    应用程序可以创建并使用多个 spotlets 来显示不同的窗口。就像使用 J2SE Canvas(一个负责画出自身以及放置在其上的 GUI 控件的 spotlet)一样。 
    在我们的两个 KJava 示例中,都将使用 Spotlet 类。这两个示例中一个是很快就看到的 HelloWorld 应用程序,另一个是 Scribble 应用程序,后者将在使用 KJava 事件处理的开发这一章中构建。

 

  • KJava 应用程序 HelloWorld
    这个应用程序将在屏幕中央显示 "Hello World!" 和一个 Exit 按钮,按下后即终止该应用程序。HelloWorld.java 开始时使用下面的几行代码导入将在后面的 HelloWorld 类中使用的类: 

    import com.sun.kjava.Button;
    import com.sun.kjava.Graphics;
    import com.sun.kjava.Spotlet;
    下面的代码行将 HelloWorld 类定义为扩展 Spotlet: 

    public class HelloWorld extends Spotlet
    请记住 Spotlet 类提供用于处理事件的回调功能。在这个简单的示例中,我们只对一个事件感兴趣,即用户何时按下 Exit 按钮。下一个代码行存储对 Exit 按钮的引用: 

    private static Button exitButton;
    如同在 J2SE 中一样,main() 方法定义程序的主要入口点。对于 J2ME 应用程序,main 也定义了入口点。在本例中,main() 创建了一个新的 HelloWorld 类的实例,它运行我们的应用程序。 

    public static void main(String[] args)
    {
    (new HelloWorld()).register(NO_EVENT_OPTIONS);
    }
    下一个代码块定义了构造程序。在构造程序中,我们首先创建一个 Button 并为其加上 "Exit" 标签。按钮起初是不可见的。当我们得到对图形对象的引用后,此按钮成了一个可画的屏幕,先清屏然后在屏幕中央画出文本 "Hello World!"。最后,我们在屏幕上添加 Exit 按钮。 

    public HelloWorld()
    {
    // Create (initially invisible) the "Exit" button
    exitButton = new Button("Exit",70,145);

    // Get a reference to the graphics object;
    // i.e. the drawable screen
    Graphics g = Graphics.getGraphics();
    g.clearScreen();

    // Draw the text, "Hello World!" somewhere near the center
    g.drawString("Hello World!", 55, 45, g.PLAIN);
    // Draw the "Exit" button
    exitButton.paint();
    }
    最后,我们定义 penDown 事件处理程序,用来简单地检查 Exit 按钮是否被按下。如果已按下,就退出应用程序。 

    public void penDown(int x, int y)
    {
    // If the "Exit" button was pressed, end this application
    if (exitButton.pressed(x,y))
    System.exit(0);
    }

 

  • HelloWorld -- 完整的代码清单
    以下便是 Palm 设备的 HelloWorld 应用程序的完整代码示例: 

    import com.sun.kjava.Button;
    import com.sun.kjava.Graphics;
    import com.sun.kjava.Spotlet;

    /**
    * Simple demonstration, "Hello World" program. Note that Spotlet is
    * the class that provides callbacks for event handling.
    */
    public class HelloWorld extends Spotlet
    {
    /** Stores a reference to the "Exit" button. */
    private static Button exitButton;
    /**
    * Main entry point for this program.
    */
    public static void main(String[] args)
    {
    (new HelloWorld()).register(NO_EVENT_OPTIONS);
    }
    /**
    * Constructor: draws the screen.
    */
    public HelloWorld()
    {
    // Create (initially invisible) the "Exit" button
    exitButton = new Button("Exit",70,145);

    // Get a reference to the graphics object;
    // i.e. the drawable screen
    Graphics g = Graphics.getGraphics();
    g.clearScreen();

    // Draw the text, "Hello World!" somewhere near the center
    g.drawString("Hello World!", 55, 45, g.PLAIN);

    // Draw the "Exit" button
    exitButton.paint();
    }
    /**
    * Handle a pen down event.
    */
    public void penDown(int x, int y)
    {
    // If the "Exit" button was pressed, end this application
    if (exitButton.pressed(x,y))
    System.exit(0);
    }
    }

 

  • KJava GUI 组件
    除 Spotlet 类之外,KJava API 还定义了一些基础 GUI 组件。下面列出了由 KJava 提供的一些更基础 GUI 组件。注意它们与 J2SE AWT 同名组件的相似性。 
    · Button -- 定义了一个简单的 GUI 按钮。按钮可以包含文本标签如 "OK" 或 "Cancel",也可以包含位图图象。

    · Checkbox -- 定义了一个 GUI 复选框组件,它可以是已选中的,也可以是未选中的。

    · Dialog -- 定义了一个弹出式、模式对话框,包含标题、文本字符串和一个 "Dismiss" 按钮。
    · Graphics -- 这个类和其 J2SE 姊妹版很类似,提供各种绘图的方法。

    · RadioButton -- 定义了一个有两个状态的单选按钮。通常被用作一组使用 RadioGroup 对象分组的 radio 按钮的一部分,在某一时刻只能使用一个。

    · RadioGroup -- 代表一组单选按钮,在某一时刻只能有一个处于开着或选中状态。

    · ScrollTextBox, SelectScrollTextBox -- 定义了一个带滚动条的文本框组件,用户可在该组件中输入多行文本。它和 J2SE TextArea AWT 组件功能相似。

    · Slider -- 定义了一个图形化滑块,使用该组件,用户可以沿着刻度尺拖动标志来选择一个值。

    · TextBox -- 定义了一个基本的文本框,但仅用于显示少量文本。对于大量文本,请使用 ScrollTextBox。
    · TextField -- 定义了一个文本框提供给用户进行输入。与 J2SE TextField AWT 组件相似。

    · ValueSelector -- 一个接受用户输入的整型值的 GUI 组件。用户可以选择 "+" 来递增该值,也可以选择 "-" 来递减该值。

 

  • 其它的 KJava 类
    KJava 定义了一些附加的类。在早期的开发工作中很少用到它们,但是它们的用处还是很值得一提的,因为说不定今后开发时就会用到它们。 
    · Bitmap -- 表示一个黑白两色的位图图象。

    · Caret -- 仅被 TextField 使用。(API 文档指出这个类可能是 TextField 类私有的)。

    · Database -- 给 Palm 操作系统数据库管理器提供一个接口。

    · DialogOwner -- 由希望显示模式对话框的类使用的接口。

    · HelpDisplay -- 定义了一个简单的帮助对话框。

    · IntVector -- 并不是真正意义上的 GUI 组件,该类提供一个可扩展的整型矢量,很象 java.util.Vector。
    · List -- 并不是真正意义上的 GUI 组件,它是另一个代表一列对象的帮助类,就象java.util.Vector。

    · ScrollOwner -- ScrollTextBox 使用的类。

    · VerticalScrollBar -- 定义了一个垂直滚动条组件。
<淘宝热门商品:
 

188.00 元 

深大玉妹Shenda Yummy粉刺液、去痘王,

 

88.00 元 

双皇冠 狂卖2000条!Levis 超赞牛仔裤


来源:程序员网

小小豆叮

(2)开发J2ME应用程序

第二章:开发J2ME应用程序
  • 介绍
    在这一章中,我们将复习一下在为小型设备开发应用程序时需要牢记的一些注意事项。我们将看一下在使用 J2SE 编译 J2ME 应用程序时调用编译器的方法。最后我们将探究打包和部署,以及在这个过程中提前验证所扮演的角色。

 

  • 设计开发小型设备应用程序要注意的事项
    为小型设备开发应用程序,需要您在设计阶段制定某种策略。最好是在开始编写代码之前,战略性地为小型设备设计应用程序。由于无法考虑到所有的 "gotchas" ,在开发应用程序之前更正代码是一件很痛苦的工作。 
    下面是一些可以考虑的设计策略:
    · 保持程序简单。除去不必要的功能,如果可能的话,将它们做成独立的、次要的应用程序。 

    · 程序越小越好。这一点对所有的开发者来说应该是显而易见的。越小的程序占用的设备内存越少,并且花费的安装时间越少。可考虑将您的 Java 应用程序打包,作为压缩的 Java 档案 (jar) 文件。

    · 运行时占用最少的内存。为尽可能减少运行时占用的内存,使用标量类型代替对象类型。同时,不依赖垃圾收集程序。您应该在使用完对象时将对象引用置空,这样可有效管理内存。另外一种减少运行时所需内存的方法是使用“惰性”实例,它仅在必需时才分配对象。其它一些减少小型设备上过量和峰值内存使用的方法有快速释放资源、重新使用对象以及避免异常。

 

  • 设计开发移动设备应用程序的注意事项
    开发移动设备应用程序的规则与我们前面提及的开发小型设备的相同:先设计再编码。让我们检查一下开发移动设备应用程序时可考虑的一些设计建议: 
    · 让服务器做大部分的工作。将计算性较强的任务放到服务器上,让服务器为您做这些工作。让移动设备处理界面和最少的计算工作,而让服务器做繁重的工作。当然,您为其开发应用程序的移动设备对设备连接到服务器上的难易程度和频率有重要影响。 

    · 谨慎地选择编程语言。J2ME 仍然处于成长期,可能还不是最好的选择。根据您的需要,选择其它的面向对象语言,如 C++,可能会更好。

 

  • 性能注意事项
    为性能而编码。下面有一些以获得最优性能为目标的编码方法:
    · 使用局部变量。访问局部变量比访问类成员更快。
    · 避免字符串串联。字符串串联不仅会降低性能,而且会增加应用程序的内存峰值占用量。

    · 使用线程,避免同步。任何运行时间超过 1/10 秒的操作都需要一个独立的线程。避免同步同样能提高性能。

    · 使用模型视图控制器 (MVC) 分离模型。MVC 将代码中控制显示的逻辑分离出来。

 

  • 编译注意事项
    同其它的 Java 应用程序一样,您在打包和部署应用程序之前要先进行编译。尽管有了 J2ME,您仍然使用 J2SE 编译器并且需要用适当的选项来进行调用。
    特别的,您需要使用 -bootclasspath 选项来指示编译器使用 J2ME 类,而不是 J2SE 类。不要在编译器的 CLASSPATH 中设置配置类。这样将导致运行时错误,因为不管 CLASSPATH 中有什么,编译器将首先自动搜索 J2SE 的核心类。换句话说,编译器将无法引用特定 J2ME 配置中缺少的类或方法,结果导致在尝试运行应用程序时出现运行时错误。

 

  • 打包和部署注意事项
    由于 J2ME 是为内存有限的小型设备设计的。大部分常用的 Java 提前验证已经从虚拟机中除去以形成一个较小的覆盖区域。结果,在配置之前提前验证 J2ME 应用程序就很有必要。在运行时会附加一个检查以确保这个类在提前验证之后还没有改变过。 
    如何严格执行提前验证或者检查类的正确性依靠的是工具包。CLDC 提供一个称为提前验证的命令行实用程序,它能够进行实际的验证并且可以把一些额外的信息插入到类文件中去。MIDP 使用无线工具包,这种工具包提供一种 GUI 工具,也可从命令行运行这种工具。
    部署工作取决于您要部署的平台。应用程序必须以一种适合 J2ME 设备类型的格式进行打包和配置,就如简表定义的那样。
<淘宝热门商品:
 

鲜花速递/蛋糕配送/园艺花艺 

瑞锦记锦缎喜糖袋〓婚礼特制●上等材质●流行韩

 

278.00 元  

拍趣-拍你喜欢 享受乐趣

3皇冠 大遥控 灿凌RMBOX368(高清DVD/RMVB硬盘播放器) AOK


来源:程序员网

小小豆叮

(11)总结

第十一章:总结
  • 总结
    在本教程中,我们已经考察了 J2ME 的背景,研究了 J2ME 的配置和简表。让我们再来看看怎样为开发 J2ME 应用程序设置开发环境。 
    我们讨论了一些论题,如与连接限制设备配置 (CDLC) API 共同使用的 K 虚拟机 (KVM) 和 KJava 简表,以及也使用 CLDC 的移动信息设备简表 (MIDP) 。同时我们还简要介绍了用于大型应用程序的连接设备配置 (CDC)。 
    最后,教您一步步建立了一个简单的 HelloWorld 应用程序,让您了解了能用 J2ME 做些什么。我们还使用 CLDC 和 KJava 开发了 Scribble(一个基本的绘图应用程序)和一个小型的 MIDP 应用程序。 
    虽然仍处于成长阶段,适用于移动设备的 Java 已经改变了人们的商务和个人通讯方式。随着 J2ME 的发展和移动设备技术的更加成熟,支持商务和个人移动通讯的应用程序也会得到发展和普及。

 

  • 参考资料
    请使用下面的参考资料深入探讨 J2ME 并扩展您的无线编程知识。
    · KJava 示例应用程序 zip 文件包含 HelloWorld.java 和 Scribble.java 的完整源代码以及支持文件。

    · MIDP 示例应用程序 zip 文件包含 HelloWorld.java 的完整源代码以及与 J2ME 无线工具包一起使用的支持文件。

    · 欲获得全面的 J2ME 知识(包括本教程中使用的所有 API 和 VM 下载),请访问官方 J2ME 主页。

    · Sun 和 IBM 均提供各种版本的 Java 2 SDK。

    · 下载 Palm 操作系统仿真器 (POSE)。

    · IBM VisualAge Micro Edition,最近被 JavaPro 杂志提名为最好的嵌入式开发工具,将为您提供快速创建无线设备的嵌入式 Java 应用程序所需的所有支持。 

    · 您对自 1999 年以来 J2ME 所发生的改变感兴趣吗?请阅读 Todd Sundsted 的 "J2ME grows up"(developerWorks,2001 年 5 月),它深受近来由 Sun Java 提倡者 Bill Day 主持的全天技术会议的影响。

    · 如果您有关于 J2ME 的问题,请访问我们的无线 Java 编程论坛获取帮助。

    · 无线编程很好地扩展了 Java 平台的应用领域。请访问 developerWorks 上的 Wireless page 获取有关信息。
<淘宝热门商品:
 

 

【家倍乐床上笔记本电脑桌专利厂家批发零售店】

 

68.00元  

海洋新奇特购物天堂


来源:程序员网

小小豆叮

Robocode 基本原理之方向剖析

很多研究Robocode的 玩家都被其中的方向及坐标弄糊涂了。下面就跟着Skyala.Li一起来揭开其中的奥妙。 首先我们来看看一段英文的翻译及说明: heading - absolute angle in degrees with 0 facing up the screen, positive clockwise. 0 <= heading < 360. bearing - relative angle to some object from your robot's heading, positive clockwise. -180 < bearing <= 180 heading:是机器人方向与屏幕正上方的角度差,方向在0到360之间. bearing:是机器人的某个部件如雷达发现的目标与方向的角度差,顺时针为正角度在-180到180之间 看了这段文字大家可能还是不太明白,整个屏幕哪个是0度角,整个是坐标原点呢? 顺时针与逆时针的方向如何区分? 详细请进入: http://www-900.ibm.com/developerWorks/cn/java/l-robocode/index.shtml <淘宝热门商品:
 

205.00 元  

东菱小熊贝尔莱德艾美特(面包机酸奶机挂烫机电暖器礼品小家电)

双皇冠,产地代理『艾美特暖风机HP2009』2000W功率,浴居两用

 

¥:6.98 

四皇冠 值得您收藏的包店 冲五冠 5i贝贝外贸包店◢

◣四冠◆贝妈家◢出口英国★荔枝纹钉扣简约短款钱包◆特价6.99


来源:程序员网

小小豆叮

JAVA 语言中链表和双向链表的实现

链表是一种重要的数据结构,在程序设计中占有很重要的地位。C语言和C++语言中是用指针来实现链表结构的,由于JAVA语言不提供指针,所以有人认为在JAVA语言中不能实现链表,其实不然,JAVA语言比C和C++更容易实现链表结构。JAVA语言中的对象引用实际上是一个指针(本文中的指针均为概念上的意义,而非语言提供的数据类型),所以我们可以编写这样的类来实现链表中的结点。 class Node { Object data; Node next; // 指向下一个结点 }   将数据域定义成Object类是因为Object类是广义超类(所有类的祖先),任何类对象都可以给其赋值,增加了代码的通用性。为了使链表可以被访问还需要定义一个表头,表头必须包含指向第一个结点的指针和指向当前结点的指针。为了便于在链表尾部增加结点,还可以增加一指向链表尾部的指针,另外还可以用一个域来表示链表的大小,当调用者想得到链表的大小时,不必遍历整个链表,下图是这种链表的示意图。 我们可以用类List来实现链表结构,用变量Head、Tail、Length、Pointer来实现表头。存储当前结点的指针时有一定的技巧,Pointer并非存储指向当前结点的指针,而是存储指向它的前趋结点的指针,当其值为null时表示当前结点是第一个结点。那么我们为什么要这样做呢?这是因为当我们删除当前结点后仍需保证剩下的结点构成链表,如果Pointer指向当前结点,则会给操作带来很大困难。那么如何得到当前结点呢,我们定义了一个方法cursor(),返回值是指向当前结点的指针。类List还定义了一些方法来实现对链表的基本操作,通过运用这些基本操作我们可以对链表进行各种操作。例如reset()方法使第一个结点成为当前结点。insert( Object d )方法在当前结点前插入一个结点,并使其成为当前结点。remove()方法删除当前结点同时返回其内容,并使其后继结点成为当前结点,如果删除的是最后一个结点,则第一个结点变为当前结点。 链表类List的源代码如下: import java.io.*; public class List { /* 用变量来实现表头 */ private Node Head=null; private Node Tail=null; private Node Pointer=null; private int Length = 0; public void deleteAll()   /* 清空整个链表 */ { Head = null; Tail = null; Pointer = null; Length = 0; } public void reset()   /* 链表复位,使第一个结点成为当前结点 */ { Pointer = null; } public boolean isEmpty( )   /* 判断链表是否为空 */ { return( Length == 0 ); } public boolean isEnd()   /* 判断当前结点是否为最后一个结点 */ { if ( Length == 0 ) throw new java.lang.NullPointerException(); else if ( Length == 1 ) return true; else return( cursor() == Tail ); } public Object nextNode() /* 返回当前结点的下一个结点的值,并使其成为当前结点 */ { if ( Length == 1 ) throw new java.util.NoSuchElementException(); else if ( Length == 0 ) throw new java.lang.NullPointerException(); else { Node temp = cursor(); Pointer = temp; if ( temp != Tail ) return( temp.next.data ); else throw new java.util.NoSuchElementException(); } } public Object currentNode() /* 返回当前结点的值 */ { Node temp = cursor(); return temp.data; }   public void insert( Object d ) /* 在当前结点前插入一个结点,并使其成为当前结点 */ { Node e = new Node( d ); if ( Length == 0 ) { Tail = e; Head = e; } else { Node temp = cursor(); e.next = temp; if ( Pointer == null ) Head = e; else Pointer.next = e; } Length++; } public int size() /* 返回链表的大小 */ { return ( Length ); } public Object remove() /* 将当前结点移出链表,下一个结点成为当前结点, 如果移出 的结点是最后一个结点,则第一个结点成为当前结点 */ { Object temp ; if ( Length == 0 ) throw new java.util.NoSuchElementException(); else if ( Length == 1 ) { temp = Head.data; deleteAll(); } else { Node cur = cursor(); temp = cur.data; if ( cur == Head ) Head = cur.next; else if ( cur == Tail ) { Pointer.next = null; Tail = Pointer; reset(); } else Pointer.next = cur.next; Length--; } return temp; } private Node cursor() /* 返回当前结点的指针 */ { if ( Head == null ) throw new java.lang.NullPointerException(); else if ( Pointer == null ) return Head; else return Pointer.next; }   public static void main( String[] args ) /* 链表的简单应用举例 */ { List a = new List(); for ( int i = 1; i <= 10; i++ ) a.insert( new Integer( i ) ); System.out.println( a.currentNode() ); while ( !a.isEnd() ) System.out.println( a.nextNode() ); a.reset(); while ( !a.isEnd() ) { a.remove(); } a.remove(); a.reset(); if ( a.isEmpty() ) System.out.println("There is no Node in List \n"); System.in.println( " You can press return to quit\n" ); try { System.in.read(); // 确保用户看清程序运行结果 } catch( IOException e ) {} } } class Node /* 构成链表的结点定义 */ { Object data; Node next; Node( Object d ) { data = d; next = null; } } 读者还可以根据实际需要定义新的方法来对链表进行操作。双向链表可以用类似的方法实现只是结点的类增加了一个指向前趋结点的指针。 我们可以用这样的代码来实现: class Node { Object data; Node next; Node previous;   Node ( Object d ) { data = d; next = null; previous = null; } } 当然双向链表基本操作的实现略有不同,这里就不再详述了。链表和双向链表的实现方法,也可以用在堆栈和队列的实现中,这里就不再多写了,有兴趣的读者可以将List类的代码稍加改动即可。 参考文献:《网络编程语言JAVA》 孙淑玲、王太权、陈意云 中国科技大学出版社 <淘宝热门商品:
 

6.80 元  

北欧橱窗

三冠 三角形强力吸墙角架/置物架/杂物架 承重3公斤 不伤墙面0.14

 

 

自然美人 红酒面膜及口碑护理产品


来源:程序员网

小小豆叮

Java 理论和实践:我必须对那些内容进行文档编制吗?

Java 语言按照 Javadoc 注释约定采用了一种集成的方法来进行 API 文档编制。Javadoc 工具可以帮助生成好的 API 文档,然而大多数 Java API 文档却很糟糕。因为它是源代码的一部分,所以 API 的文档编制职责最终还是落到了工程师身上。在本文中,Brian 对 Java 文档编制实践的当前状态进行了严厉的批评,同时提供了一些关于如何编写更有用的 Javadoc 的准则。 详细文章请浏览 http://www-900.ibm.com/developerWorks/cn/java/j-jtp0821/index.shtml <淘宝热门商品:
 

 

黑龙江商盟】棋子儿平价美妆店-烟熏彩妆/假睫毛大全/新娘用品

 

¥:9.99 

【黑龙江商盟】棋子儿平价美妆店-烟熏彩妆/假睫毛大全/新娘用品

买十送一全网最低价高级无痕透明根部自然浓密凌乱假睫毛仿真毛发


来源:程序员网

小小豆叮

用Java制作属性编辑器

作者长期从事网管软件的开发工作,网络设备的配置管理模块,需要对网络设备的大量参数进行配置工作,设计、开发配置管理模块的界面成为整个网管系统的难点,尤其是用Java语言开发时,需要编制大量的界面布局、事 件处理等代码,网管软件开发的主要工作量就集中在此。制作一个类似于Delphi、JBuilder等可视化开发工具的对象查看器的参数配置控件用于项目的优点是显而易见的: 1、界面显得很专业; 2、容易做到使整个系统的风格趋于一致; 3、使用灵活,代码量大大减小; 4、…… 最终的使用效果如下图所示: 作者本人把它称为属性编辑器,它的主要特征是:是一个两列多行的表格,第一列用来显示属性名称,第二列用来显示和编辑属性值;属性值的显示和编辑可以有多种方式,如文本框输入、下拉框选择、组合框选择、自定义的弹出式对话框等;当属性被编辑后,可以向感兴趣的对象发出通知。 下面就属性编辑器的设计思路和编制过程进行具体的解释说明。 设计思路 根据属性编辑器的主要界面特征,选择JTable作为编辑器的基类。JTable是Swing中最复杂的组件之一,它主要被用来显示数据行和数据列,它可以为每个数据单元分别提供绘制器和编辑器,是典型的MVC(模型Model、视图View、控制Control)模式的实现者。 设计属性编辑器为一个两列的JTable,每一行数据的第一列存放不重复的字符串,作为属性的名称;第二列保存Object对象,根据其具体数据类型,设置其单元绘制器和单元编辑器,一般单元绘制器用系统默认的JLabel即可,而单元编辑器则必须提供定制的控件,如对字符串型数据,用JTextField或者JComboBox;对布尔型数据,用JCheckBox;对特殊类型,可以提供JDialog,对话框的主要界面可以由使用本属性编辑器的程序员自行定制。 属性编辑器还要提供相关接口,如属性值是否只读;属性值变化时必须通知监听者;等等; 属性编辑器的具体设计,请参见下图,限于篇幅,该图只简单列举了几个主要的类之间的关系和一些重要的变量和方法: 属性编辑器的制作过程 属性编辑器是从JTable上继承下来的,必须给它定义一个DefaultTableModel的子类,用来作为属性编辑器的数据模型,存放属性名和属性值,因为它只在属性编辑器内部使用,所以可以定义为属性编辑器的内部类: public class PropertyEditor extends JTable { protected class PropertyEditorModel extends DefaultTableModel{ public PropertyEditorModel() { super(0, 2); // 只有两个列 } public String getColumnName(int col) { return " "; // 不需要列标题 } public boolean isCellEditable(int row, int col) { if(col == 0) return false; // 第一列是属性名,不可编辑 else // 属性值是否可编辑要看用户指定的情况 return ((Boolean)propertyEditable.get(this.getValueAt(row, 0))).booleanValue(); } } } 要实现定制的单元绘制器和编辑器,必须覆盖JTable的getCellEditor和getCellRenderer方法,那些已经做好的绘制器、编辑器和该属性值是否允许编辑都可以根据属性名保存在Hashtable里,需要的时候根据属性名取出来: /** * 每一个属性项都对应一个单元编辑器,用Hashtable来保存这些编辑器 */ protected Hashtable propertyEditors = new Hashtable(10); /** * 每一个属性项都对应一个单元渲染器 */ protected Hashtable propertyRenderers = new Hashtable(10); /** * 属性是否可编辑 */ protected Hashtable propertyEditable = new Hashtable(10); /** * 获取指定单元格的编辑器 * @param row 行 * @param col 列 */ public TableCellEditor getCellEditor(int row, int col) { TableCellEditor editor = null; if(col == 1) { // 属性值列才需要编辑器。这个判断条件不要也可,效率会低一点。 editor = (TableCellEditor)propertyEditors.get(this.getValueAt(row, 0)); } if(editor == null) { // 没找到编辑器,则用系统默认的。 editor = super.getCellEditor(row, col); } return editor; } /** * 获取指定单元格的渲染器 */ public TableCellRenderer getCellRenderer(int row, int col) { TableCellRenderer renderer = null; if(col == 1) { renderer = (TableCellRenderer)propertyRenderers.get(this.getValueAt(row, 0)); } if(renderer == null) { renderer = super.getCellRenderer(row, col); } // 给表格元素提供Hint提示 if(renderer instanceof JComponent) { Object v = this.getModel().getValueAt(row, col); if(v == null) { // 属性值有可能为空,则取属性名;属性名必不为空。 v = this.getModel().getValueAt(row, 0); } ((JComponent)renderer).setToolTipText(v.toString()); } return renderer; } 如何确定哪个属性用哪一种编辑器呢?可以根据用户程序员传入的参数来确定,对传入的整数型数据,则用LongCellEditor;字符串型的当然用StringCellEditor了,其它依次类推。以整数型来举例: /** * 在属性表中增加整数属性,允许为空值,编辑器和渲染器为long型编辑器和渲染器。 * 当属性值为空值时,必须写成: * addProperty("pName", (Long)null) * @param propertyName 属性名 * @param longNumObj 属性初始值 */ public void addProperty(String propertyName, Long longNumObj) { if(propertyName == null) throw new RuntimeException("Coding error : property name can NOT be null !"); Object[] row = new Object[2]; row[0] = propertyName; row[1] = longNumObj; appendRow(row); // 往表格增加行 propertyEditors.put(propertyName, longEditor); // 添加整型编辑器 propertyRenderers.put(propertyName, longRenderer); // 添加整型绘制器 propertyEditable.put(propertyName, new Boolean(true)); // 设置该属性允许编辑 } 给属性编辑器加上get和set接口: /** * 根据属性名得到属性值 * @param propertyName 属性名 */ public Object getPropertyValue(String propertyName) { Object retValue = null; for(int i = 0; i < ptm.getRowCount(); i++) { if(ptm.getValueAt(i, 0).equals(propertyName)) { retValue = ptm.getValueAt(i, 1); break; } } return retValue; } /** * 设置属性值 * @param propertyName 属性名 * @param newValue 新的属性值 */ public void setPropertyValue(String propertyName, Object newValue) { for(int i = 0; i < ptm.getRowCount(); i++) { if(ptm.getValueAt(i, 0).equals(propertyName)) { ptm.setValueAt(newValue, i, 1); break; } } } 好了,属性值编辑器的大框架已经完成了,下面以整数型的单元编辑器为例,简单说明单元编辑器的制作方法,双精度型和字符串型的和它类似,最复杂的用户自定义对话框型的,留待读者自己看源代码吧(反正源代码里面有详细的注释的J)。 /** * 创建并初始化long型数据的编辑器和渲染器 */ private void createLongEditorRenderer() { final JTextField longTextField = new JTextField("0", 5); // 用文本输入框做输入控件 longTextField.setHorizontalAlignment(JTextField.LEFT); longEditor = new DefaultCellEditor(longTextField) { private Object previousValue = null; public Object getCellEditorValue() { if(longTextField.getText().equals("")) return (Long)null; else return new Long(longTextField.getText()); } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { Component c = super.getTableCellEditorComponent(table, value, isSelected, row, column); previousValue = value; // 开始编辑前记下初始值 return c; } public boolean stopCellEditing() { Long lv = null; // 如果输入了,要判断是否是整数 if(!longTextField.getText().equals("")) { try { lv = new Long(longTextField.getText()); }catch(Exception e) { cancelCellEditing(); // 用户输入了非数字,则还原到未编辑状态 return true; } } if((previousValue == null) ? (previousValue == lv) : previousValue.equals(lv)) { cancelCellEditing(); // 修改前后的值相等则认为属性值未修改 return true; } return super.stopCellEditing(); } }; longEditor.setClickCountToStart(2); // 控件失去焦点时,停止编辑,接受已输入的数据 longTextField.addFocusListener(new FocusAdapter() { public void focusLost(FocusEvent e) { longEditor.stopCellEditing(); } }); // 渲染器用系统默认的JLabel,但字符靠左 longRenderer = (DefaultTableCellRenderer)this.getDefaultRenderer(Long.class); longRenderer.setHorizontalAlignment(JLabel.LEFT); } 当属性值被修改了的时候,程序员可能想知道哪个值被修改了,修改后的新值是什么,然后可以做一些界面上的控制。那需要我们为属性值编辑器增加监听器,以便及时通知实现了监听器接口的类。 先定义一个监听器列表 protected EventListenerList propertyListeners = new EventListenerList(); /** * 增加一个属性值变化监听器 */ public void addPropertyUpdateListener(PropertyUpdateListener l) { propertyListeners.add(PropertyUpdateListener.class, l); } /** * 表格数据变化,由表格模型触发 */ public void tableChanged(TableModelEvent e) { super.tableChanged(e); // 如果是属性值的列发生数据变化,要通知属性值变化监听器 if(e.getType() == TableModelEvent.UPDATE && e.getFirstRow() == e.getLastRow() && e.getColumn() == 1) { String pName = (String)ptm.getValueAt(e.getFirstRow(), 0); Object nValue = ptm.getValueAt(e.getFirstRow(), 1); firePropertyUpdated(pName, nValue); } } /** * 通知属性值变化监听器 * @param propertyName 属性名 * @param newValue 属性变化后的新值 */ protected void firePropertyUpdated(String propertyName, Object newValue) { Object[] listeners = propertyListeners.getListenerList(); for (int i = listeners.length - 2; i >= 0; i -= 2) { if (listeners[i] == PropertyUpdateListener.class) { ((PropertyUpdateListener)listeners[i + 1]).propertyUpdated(propertyName, newValue); } } } 总结 本文介绍了一种应用广泛的基于Swing的java界面控件PropertyEditor的设计思路和编写过程,读者可以从中体会到MVC模式把模型和视图分开的优点,并能加深对java语言中的重要特性——接口的认识。对本文所附的代码,读者可以任意引用。欢迎读者与我联系,共同探讨java技术。我的Email是:throw_exception@yahoo.com.cn <淘宝热门商品:
 

100.00 元 

韩国手表正品intercrew品牌手表LED手表

 

¥:22.00 

荣红喜商贸公司--迎三钻,贺店庆,所有产品低价疯狂销售中


来源:程序员网

小小豆叮

EJB 2.1中实现Web Service

EJB2.1(Enterprise JavaBeans 2.1)正式推荐版本已经出台,它产生的动力主要是Enterprise JavaBeans对支持Web Service的需求,同时也是因为Micr osoft .NET的发布,它对J2EE或者说对Java技术来说已经构成了巨大威胁。在新版本的EJB2.1中,主要的变化主要集中在基于SOAP和WSDL的Web Service上。EJB已经成为一种新的Web Service平台。它对Web Service的支持主要体现在三个新的Web Service API上:分别是JAX-RPC(Java API for XML-RPC,它基本上是通过SOAP实现的Java RMI,为RPC格式的SOAP消息提供远端接口)、SAAJ(SOAP API with Attachments for Java,它模仿SOAP消息的结构,同时也有功能有限的消息分发能力)和JAXM(Java API for XML Messaging,它类似于JMS,提供发送和接收SOAP消息的消息架构),利用它们可以实现与其它类型的Web Service进行通讯,而且还允许无序的会话Bean和消息驱动的Bean来作为Web Service使用,使它们能够被任何与 SOAP1.1兼容的客户端所访问。例如:使用SOAP,我们就可以从其它平台Web Service来调用无序的会话Bean的方法,象微软的.NET,Perl,Apache Axix和其他的语言和平台。EJB2.1中新的Web Service功能能够提供一种前所未有的跨平台互操作性,它主要是建立在两个崭新的J2EE SOAP工具包JAX-RPC和JAXM。 Web Service代表了分布式计算的最新潮流,可能是自1995年Java的出现和1998年XML出现以来最重要的技术了。其实,给Web Service下一个准确的定义是很难的,因为Web Service并不是任何特殊技术或者平台所特有的,Web Service是一种网络应用程序,以XML形式的文档,使用SOAP和WSDL进行信息交换。要更好地理解这句话的含义,你必须先理解SOAP和WSDL,下面是有关这方面的定义: SOAP:简单对象访问协议(Simple Object Access Protocol),是在W3C的支持下,由Microsoft,IBM和其他公司开发的,基于XML格式的一种协议,它是可伸缩和可扩展的,不象以前的DCE RPC, CORBA IIOP, Java RMI-JRMP以及DCOM,它已经被几乎所有的开发厂商所认可和接受。 WSDL:Web服务描述语言(Web Service Description Language),也是在W3C的支持下,由Microsoft,IBM和其他公司开发的,XML格式的语言,用来对Web Service进行描述,包括期望的消息格式类型、所使用的Internet协议和Web Service的Internet地址。 其实,Web Service代表了一种新的分布式对象技术,它和CORBA IIOP和Java RMI很相似,但也有许多差异,最大的差异应该就是真正的平台无关性。尽管Java RMI和CORBA IIOP都声称自己是平台无关的,但实际上,它们都需要它们自己的平台。要使用Java RMI,你需要一个Java虚拟机和Java编程语言,对使用其它语言的开发者如Visual Basic或C++来说,Java RMI并不是平台无关的。CORBA IIOP也是有局限性的,IIOP协议通常需要一个特定的架构如CORBA ORB,也只有少数几个厂商支持CORBA。另一方面,Web Service着重描述信息交换的协议,而不是着重描述对这些协议的实现,换句话说,你可以用任何语言,在任何平台上,以任何你自己喜欢的方式来创建Web Service。 Web Service另外一个好处就是,不象其它的分布式对象体系,它建立在现有的技术架构的基础之上,因此大多说厂商很容易实现。SOAP和WSDL都是基于XML的,而XML已经被广泛支持,XML解析器在几乎每一种开发语言中都有,因此,处理SOAP消息和WSDL文档的基础已经存在了。此外,Web Service消息通常是通过TCP/IP进行交换的,也已经被几乎所有的平台和语言所支持。 JAX-RPC和EJB JAX-RPC(Java API for XML-RPC)实质上就是通过SOAP访问的Java RMI。它和“本地的”Java RMI (Java RMI-JRMP)和Java RMI-IIOP很象,但是它是以SOAP作为通讯协议。要实现JAX-RPC,最低要求是必须对通过HTTP访问的SOAP支持RPC编码,但是,我们仍然可以提供对其他编码方式、消息格式和Internet协议的支持。JAX-RPC能够被用来从会话、实体和消息驱动的Bean来调用Web Service的操作。JAX-RPC能够用来访问其它平台的Web Service。例如:一个无序的会话Bean可能会使用JAX-RPC来调用.NET Web Service的方法。如下图所示: <淘宝热门商品:
 

 

极限特攻-新奇产品仓库   金秋时节好礼送不停

 

145.00 元 

八心八箭瑞士钻石六爪旁镶钻经典钻戒指


来源:程序员网

小小豆叮

设计Pattern观念知多少

世界第一本OO字典主编Donald Firesmith预言:从现在到1999年,OO样式观念的进展将在OO技术领域之中一枝独秀,具有革命性。 经典之着--软体样式(Design Patterns)是1995年排行第一的OO书籍,新一代杰出软体师皆人手一册。 于此,说明一些样式的观念,叙述样式与物件观念的结合发展过程,并列出从1964至1996年2月之间的45篇重要书籍和文章,供您参考。 Δ人们何时会用到样式呢﹖ 在进退维谷的困境中。例如﹐孔明面对司马懿的兵临城下﹐攻守皆有危机。例如﹐为了保健﹐家庭常存有药罐﹐但小孩婴儿常会误食。例如﹐想和男友结婚﹐但又怕伤父母之心。 Δ为什么人们会去寻找样式﹖ 在进退维谷之状况下﹐未曾面对过﹐尚无经验者往往会不知所措、进退失据﹐才会感到此状况是个困境。在不知所措时﹐常心想﹕别人是否也遭遇过类似情况﹖他们是如何面对呢﹖自然会想去请教专家或向别人学习﹐尝试套用别人的做法(样式)来解决自己的困境。 Δ使用样式时﹐有何感觉﹖ 心头郁闷一扫而空的感觉。 柳暗花明又一村的感觉。 四两拨千斤的感觉。 「要是没有这一招﹐我真的不知如何是好」的感觉。 Δ为什么会有柳暗花明又一村的感觉呢﹖ 样式常朦胧依俙可见﹐而非显而易见。是由经验中推敲出来﹐去芜存菁后的间接性方案(indirect solution)。 例如﹐孔明的「空城计」是细心推敲而得的构思﹐而不是信手招来的简单直接方案﹐而必须从丰富的经验之中提炼出来的。 已有的经验愈丰富、或样式的运用愈熟练﹐就会觉得样式是极明显的方案。 Δ为何依样(式)画葫芦﹐但仍常有「画虎不成反似犬」之情形呢﹖ 样式是抽象的模板(template)﹐让您套用它、修正它、加上环境(context) 因素﹐才会得到具体可行的方案(solution)。所以样式告诉您理想的方案像什么、有那些特性﹔同时也告诉您些规则﹐让您依循之﹐而产生适合于环境的具体方案。 当规则的掌握不灵活、或无法充分融入外在环境因素﹐可能无法得到具体有效的方案。 Δ为什么设计师经常使用样式呢﹖ 设计品常需融入环境因素﹐并使环境与设计品构成和谐的整体。在设计过程中﹐常会面临环境的各种需求和条件﹐来自不同方面的需求可能会互相冲突而呈现不和谐的现象。因而不断运用样式来化解冲突使其变为均衡和谐﹐亦即不断把环境因素注入样式中而产生有效的方案来使冲突之力量不再互相激荡。 有效的设计专家﹐会大量运用其惯用之样式﹐而不会一切从头创造新方案(reinvent the wheel)。 Δ为什么好的设计品会令人感到快活(alive) 呢﹖ 样式运用得好﹐能化解冲突为详和﹐问题(problem) 也迎刃而解﹐自然令人感到舒畅。 好的设计师以流畅的方式将令人舒畅的样式组合而成设计品﹐其设计品自然令人感到快活。 Δ什么是流畅的组合方式呢﹖ 样式的组合就如同写作文章﹐样式是字汇 或成语﹐而设计品就如同写作出来的句子或文章。 写作文章时﹐人们依循文法规则及风格而将字汇成语流畅地组合成句子﹐再流畅地组合成文章。 每位作家皆有各自的一套规则和风格来写作文章。同理﹐每位设计家皆各有一套规则来变样式流畅地组合成为设计品。 于是﹐ 一堆字汇、成语 + 一套规则(文法和风格)≡ 一个自然语言 同样地, 一堆样式 + 一套规则 ≡ 一个样式语言(pattern language) 最理想的是﹕人人心中的样式语言能大同小异。 由于规则仍藉由样式表达出来﹐所以 { 样式} ≡ 一个样式语言 Δ样式与reuse 之间有何关系﹖ 样式是设计专家「屡试不爽」的妙招﹐所以只有reusable的样式才会长存于专家心中﹐即样式必有个特性 reusable。 Δ为什么样式语言像树木的基因(gene)呢﹖ 如同一般语言﹐含有限的字汇、成语和文法规则﹐而能进行无限多种的组合﹐产生无限的句子及文章。 样式语言﹐含有限的样式﹐而设计师能进行无限的组合﹐产生无限种的设计品。 在无限组合与变化之中﹐因大家使用极相近的样式语言﹐使得设计品呈现出一致性(uniformity)。 树的基因的作用﹕使千千万万的树没有两棵是一模一样﹐但却具有高度的一致性。基因让树木之间的一致性(uniformity)与变化性(variety) 维持平衡。设计者之间使用共通的样式语言﹐使得设计品没有两个会一模一样﹐但却具有高度的一致性。样式语言让设计品之间的一致性与变化性维持平衡。 基因维持结构的一致﹐但不局限各部位的随环境而变化﹐使得树木能生生不息﹐并与环境和谐相处。 样式语言维持设计品结构的一致﹐但未局限各部位的随环境而变化﹐使得设计品(如软体)能生生不息﹐并与环境(如其它软体)和谐共存。 基因创造了树木的有机次序(organic order) ﹐样式语言则创造了设计品的有机次序。有机次序塑造了自然之美。 Δ大家皆「有样学样﹐依样画葫芦」﹐岂非就不用思考﹐扼杀掉创造力了吗﹖ 样式是抽象的﹐套用时必须视环境(context) 的需求而修正﹐然后才产生具体的方案。样式只是引导人们的创意﹐使其融合别人的智慧﹐并充分考虑外在环境的需求。例如﹐食谱并未限制厨师的创新﹐反而常激发厨师的新创意。 设计的新手们经由样式的引导﹐成长会加速﹐具有建设性。 Δ样式有助于解决软体的复杂性与困境吗﹖ 顶尖软体思想大师Fred Brooks 在二十多年前就指出﹕大型软体的困境是来自于设计的参与者之间﹐其设计的理念(conceptual)并不一致(integrity) 。至今﹐他仍认为这个困难尚未解决。 如果设计参与者人人皆使用共同的样式语言﹐同时使用者也使用相同的样式语言﹐则样式语言像基因一样﹐保持着一致性﹐就有希望使得软体设计师的理念一致了﹐并合乎使用者的理念,软体的困境就能解决了。 由于物件软体设计(OOAD)方法与样式的互补性,近年来,OOAD方法逐渐纳入样式观念。本文详细介绍样式与物件的恋爱史,并列出1964至1996年间的50篇文章和书籍,让您也分享甜蜜滋味,并祝福公主和王子从此过着幸福快乐的日子! 1964-1971 年 1964年﹐著名建筑学家Christopher Alexander 出版一本书﹕ Notes on the Synthesis of Form〔参1〕 他提出Form观念﹐认为设计师可创造Form来化解环境中互相冲突的需求﹐使冲突变成为和谐的景象。他也提出pattern (样式)观念﹐样式可引导设计师逐步创造出Form﹐以便化解互相冲突之需求。1971年﹐该书再版上市﹐此时正是软体结构化设计(structured design) 方法的萌芽阶段﹐该书对当时Ed Yourdon和Larry Constantine 的结构化观念的诞生具有决定性的影响力〔参2 〕。 1972-1985 年 在这期间﹐Alexander 任教于加州柏克来大学﹐他和其同事共同研究Pattern 观念﹐并出版了四本书﹕ 1. The Timeless Way of Building〔参3 〕 --完整地介绍他的Pattern 观念﹐以及Pattern Language观念。 2. A Pattern Language〔参4〕 --实际列举了253 个建筑方面的样式。 3. The Oregon Experiment〔参5〕 -- 叙述在奥勒兰大学的实验过程。 4. The Production of Horses 〔参6〕 --叙述在墨西哥的实验情形﹐也详述这实验并未成功的原因。 1986-1989 年 这期间﹐随着C++ 诞生﹐OO技术日益成熟﹐这时Alexander 的样式观念再度影响软体的设计方法。1987年﹐Ward Cunningham 和Kent Beck 两人首先尝试将OO观念与样式观念结合起来。他们的研究着重于使用者介面(user interface)方面﹐并在OOPSLA/87 会议上发表其成果〔参7〕〔参8〕。不过﹐他们的研究并未立即引起热潮。 1990年 在欧洲的OOPSLA/90 会议上﹐由Bruce Andreson主持的"Architectural Handbook"研讨会中﹐Erich Gamma 和Richard Helm等人开始谈论有关样式的话题。 1991年 在OOPSLA/91 会议上﹐由Anderson主持的研讨会中﹐Gamma 和Johnson 等人再度一起讨论样式的相关问题。 Erich Gamma 完成了他的博士论文 “Object-Oriented Software Development based on ET++: Design Patterns, Class Library, Tools ” 〔参9 〕 Peter Coad也进行有关样式之研究。 James Coplien 在贝尔实验室里﹐也着手研究有关企业组织方面的样式(organization pattern)。 样式观念开始出现在大众化的电脑软体杂志上﹐例如﹕Tom Love撰写的"Timeless Design of Information Systems" 〔参10〕。这开始介绍如何将样式观念引入到软体领域之中。 1992年 在OOPSLA/92 会议上﹐Andreson再主持研讨会﹐样式观念已渐成为热门的话题。在研讨会中﹐伊利诺大学教授Ralph Johnson 发表其有关样式与应用架构(application framework) 之关系〔参11〕。 Peter Coad在 ACM 期刊上发表了OOA 方面的7 个样式〔参12〕。 在大众化的电脑杂志上也继续出现有关样式的文章〔参13〕。 1993年 这年﹐样式已跃居OO领域最热门的话题。 在1993年8 月份﹐Kent Beck 邀请Grady Booch 、Richard Helm、Ralph Johnson、Ward Cummingham 、James Coplien 、Ken Auer及Hal Hildebrand一起聚会于美国中部科罗拉多(Colorado)州的落矶山(Rocky Mountain)麓﹐共同讨论如何将Alexander 的样式观念与OO观念结合起来。他们决定以Gamma 的「设计样式」研究成果为基础﹐继续努力研究下去。这个样式研究组织就称为「山边小组」(Hillside Group)。 在大众化电脑软体杂志上﹐有关样式的文章日渐增加﹐例如﹕G. Booch 谈样式与机制(mechanism) 观念的相通之处〔参14〕。R. Gabriel 在JOOP杂志的"Critic-at-Large"专栏中﹐自二月份起〔参16〕﹐连载他对样式观念的看法﹐这专栏一直连续到1994年。E. Gamma 在ECOOP/93会议上发表有关样式 与Design Reuse之关系。 1994年 8 月4 日﹐由「山边机组」发起﹐在Illinois的Allerton Park 地方召开的第1 届OO Pattern世界性会议﹐名称叫「Pattern Languages of Programs」 ,简称为PLoP'94 。这并非传统的大型会议﹐而是由二十外位来自全世界各地的论文提供者互相讨论﹐交流心得与意见。其论文则由J. Coplien 和D. Schmidt 一起编辑成书﹐名称为Pattern Languages of Program Design ,并在1995年出版上市〔参17〕。R. Johnson 也在ROAD杂志上介绍这次会议的成果和评论〔参18〕。Coplien也详细介绍PLoP'94 的讨论情形〔参19〕。 J. Soukup 出版新书谈C++ 的样式类别〔参20〕。 G. Booch 的名著 Object-Oriented Analysis and Design:with applications 第二版上也引用许多样式观念。 6 月份﹐J. Coplien 在纽约的ObjectExpo研讨会上﹐谈到有关软体样式方面的常见问题和答案〔参23〕。 在大众化杂志上﹐继续出现有关于样式的文章﹐例如﹐K. Beck 说明了样式是电脑人员之间的有效沟通工具〔参21〕。K. Beck 和R. Johnson说明样式与主架构(architecture)之间的关系〔参24〕。 Coplien介绍组织与软体发程序之样式〔参25〕。 1995年 这年,样式的应用层面逐渐增大﹐例如GUI 、networking等应用。 9 月份PLoP'95 仍在Illinois的Allerton Park 地方举行。共有70多人参加﹐论文题目比前一年更加多样化﹐包括Web Pages 制作的样式等等。D. Anthony简介 PLoP‘95的讨论情形[参41]。其论文将由John Vlissides等人负责编辑成书并发行上市。 E. Gamma 等人出版名著 Design Patterns:Elements of Reusable Object-Oriented Software 一书﹐成为1995年最抢手的OO书籍〔参26〕。 P. Coad出版Object Models:Strategies, Patterns, and Applications一书〔参27〕。列举了31个object-model的样式。 J. Coplien 和D. Schmidt 合编的书 Pattern Languages of Program Design也成为极抢手的OO书籍〔参17〕。 Rational公司的Unified Method也将加入样式观念。 在大众化的杂志上﹐各种样式纷纷出笼﹐美不胜收。例如﹕K. Freed谈主从架构设计中的常用样式〔参28〕。 J. Coplien谈OO样式的常见问题〔参29〕﹐且谈样式与工程、建筑、艺术之间的关系〔参30〕。D. Schmidt说明Microsoft's Windows Open Services Architecture中的样式〔参31〕。Koenig 谈Patterns与anti-Patterns 观念〔参32〕。 D. Schmidt谈Unix及Windows NT中的样式〔参33〕。J. Rumbaugh谈样式观念﹐以及样式与软体方法(Methodolgy)之关系〔参34〕。J. Coplien 谈如何在既有系统中发掘样式〔参35〕。J. Vlissides深入谈Visitor 样式〔参36〕。P. Coad 说明如何藉由样式寻找有关的物件〔参37〕。 1996年 从1996年起PLoP会议改到别地方举行。 今年,样式话题有更加流行的趋势,例如:J. Coplien谈人群行为方面之样式〔参38〕。D. Schmidt谈网路服务方面的样式〔参39〕。J. Vlissides谈档案管理系统中的样式〔参40〕。K. Beck进一步阐述样式的基本观念〔参42〕。K. Brown 仔细说明如何藉由样式来获得理想的软体设计〔参43〕。 世界第一本OO字典的主编--D. Firesmith预言:从现在到1999年,OO样式观念的进展将在OO技术领域之中一枝独秀,具有革命性〔参44〕 Karl Lieberherr提出Demeter Method,将软体样式视为软体的成长基因(gene),能创造出可随环境而不断调适的软体[参46]。Chung-Yeung Pang 说明如何把样式融入类别与物件里来支持系统的需求[47]。James Coplien 谈到performance pettern 的重要性。 物件/样式情书选读 [1] Alexander, C., Notes on the Synthesis of Form. Harvard University Press, Cambridge, Massachusetts, 1971. [2] Yourdon, E., "Object-Oriented Design", American Programmer, March 1990.PP.14-24. [3] Alexander, C., The Timless Way of Building, Oxford University Press, New York, 1979. [4] Alexander, C., A Pattern Language, Oxford University Press, New York, 1977. [5] Alexander, C.,The Oregon Experiment, Oxford University Press, New York,1978. [6] Alexander, C., The Production of Houses, Oxford University Press, NewYork, 1985. [7] Cunningham, W., “Panel on design methodology”, ACM SIGPLAN Notices,1993 PP.94-95(Addendum to the Proceedings of OOPSLA'87). [8] Beck, K., “Using a pattern language for programming”, Workshop on Specification and design, ACM SIGPLAN Notices PP.16, 1988 (Addendum to the Proceeding of OOPSLA'87). [9] Gamma, E., Object-Oriented Software Development based on ET++:Design Patterns, Class Library, Tools(in German). PhD thesis, University of Zurich, 1991. [10] Love, T., "Timeless Design of Information Systems", Object Magazine ,PP.42-48, NOV-DEC 1991. [11] Johnson, R., "Documenting Framework Using Patterns", In OOPSLA/92 Proceedings, PP.63-76, ACM Press, 1992. [12] Coad, P., "Object-Oriented Patterns", Communications of ACM, PP.152-159, September 1992. [13] Bowles, A., "Developing Organic Systems", Object Magazine, PP.21-22, JAN-FEB 1992. [14] Booch, G., "Patterns", Object Magazine, PP.24-28, July-August 1993. [15] Bowles, A., "Lessons From Urban Planning:System zoning and building inspections", Object Magazine, PP.24-26, Nov-Dec 1993. [16] Gabriel, R., "Habitability and Piecemeal Growth", JOOP, PP.9-14, Feb 1993. [17] Coplien, J., and Schmidt, D. Pattern Languages of Program Design, Addition-Wesley, Reading, *MA 1995. [18] Johnson, R., "A Report on PLOP'94", Report on Object Analysis and Design, NOV 1994. [19] Coplien, J., "What I did on my summer vacation?", C++ Report, Nov-Dec 1994. [20] Soukup, J., Taming C++:Pattern Classes and Persistence for Large Projects, Addison-Wesley, Reading, MA, 1994. [21] Beck, K., "Patterns and Software Development", Dr. Dobb's Journal, PP.18-22, Feb 1994. [22] Gabriel, R., "Pattern Languages", JOOP, PP.72-75, Jan 1994. [23] Coplien, J., "Software Design Patterns:Common Questions and Answers", Object Expo Conference Proceddings, SIGS, 1994. [24] Beck, K. and Johnson, R.,"Patterns Generate Architectures", Proceeding ECOOP'94. [25] Coplien, J., "Pattern Languages for Organization & Process", Object Magazine, July-August 1994. [26] Gamma, E. et al., Design Patterns:Reusable elements of Object-Oriented Software, Addison-Wesley, Reading, MA, 1995. [27] Coad, P., Object Models:Strategies, Patterns and Applications, Prentic-Hall Englewood Cliffs, NJ, 1995. [28] Fred, K., "Client/Server Analysis and Design Patterns", Software Development, July 1995. [29] Schmidt, D., "Virtual Interview with James Coplien", C++ Report, Sept. 1995. [30] Coplien, J., "Software Development as Science, Art, and Engineering", C++ Report, July-August 1995. [31] Schmidt, D., "The Timless Way of Developing Software", Software Development, May 1995. [32] Koenig, A., "On Patterns and Antipatterns", JOOP, March-April 1995. [33] Schmidt, D., and Stephenson, P. "Using Design Patterns to Evolve System Software from UNIX to Windows NT", C++ Report, March-April, 1995. [34] Rumbaugh J., "What is a method?", JOOP, OCT 1995. [35] Coplien, J., "Pattern Mining", C++ Report, OCT 1995. [36] Vlissides, J., "Visiting Rights", C++ Report, Sept 1995. [37] Coad, P., “The Object Puzzle”, Windows Tech Journal, DEC 1995. [38] Coplien, J., "The Human Side of Patterns", C++ Report, Jan 1996. [39] Schmidt, D., "Connector: A Design Pattern for Actively Initializing Network Services", C++ Report, JAN 1996. [40] Vlissides, J., Protection, Part I:The Hollywood Principle", C++ Report, FEB 1996. [41] Anthony, A.,“PLoP 95”, Object Magazine, JAN 1996. [42] Beck, K., “Patterns 101”, Object Magazine, JAN 1996. [43] Brown, K., “Experiencing Patterns at the Design Level”, Object Magazine, JAN 1996. [44] Firesmith, D., “Pattern Language for Testing Object-Oriented Software”, Object Magazine, JAN 1996. [45] Helm, R., “Patterns in Practice”, Coference Proceedings OOPSLA‘95, PP.337-341, Addison Wesley, Reading, MA, 1995. [46] Lieberherr, K., Adaptive Object-Oriented Software: The Demeter Method, PWS Publishing Comapny, Boston, 1996. [47] Pang, C., "system modeling and design with objects and patterns", JOOP, May 1996. [48] Coplien, J., "After All, We Can not Ignore Efficiency", C+[45] Helm, R., “Patterns in Practice”, Coference + Report, May 1996. [49] Schmid, H., “Design patterns for condtructing the hot spots of a manufacturing framework”,JOOP, AUG 1996. [50] Dargan, P., “Action-Centered Design”, Bringing Design to Software, edited by Winograd, T., Addison Wesley, 1996.n <淘宝热门商品:
 

运动鞋 

X-2品牌时尚鞋城【郭氏鞋坊旗下】[销售出口多余产品

 

156.00 元  

消腩宝贝 快速瘦身 月减20斤


来源:程序员网

小小豆叮