http://samelocationfile.html1 er loads URL HTML file:(MmeL> 2. Browser loads hTML document <HPPLET CODE Applet Classes 3. Browser loads applet classes Mccain http://somelooationfile.html 4. Browserruns applet 浏览器装入URL 2.浏览器装入HIML文档 3.浏览器装入 Applet类 浏览器运行 Applet 123.2 Applet的安全限制 Applet的安全限制 ●多数浏览器禁止以下操作 运行时执行另一程序 任何文件的输入输出 ●调用任何本地方法 尝试打开除提供 Applet的主机之外的任何系统的 Socket 由于通过网络装载, Applet I的代码具有一种内在的危险性。如果有人编写了一个恶意的类来读取你 的密码文件,并把它通过 Internet传送,会产生怎样的后果呢? 所能够控制的安全程度是在浏览器层次上实现的。大多数浏览器(包括 Netscape Nevigator)缺省地 禁止以下操作: 运行时执行另一程序 任何文件的输入输出 调用任何本地方法 尝试打开除提供 Applet的主机之外的任何系统的 Socket 这些限制的关键在于,通过限制 Applet对系统文件的存取来阻止它侵犯一个远程系统的隐私或破坏 该系统。禁止执行另一程序和不允许调用本地方法限制了 Applet启动未经JVM检查的代码。对 Socket 的限制则禁止了与另一个可能有危害性的程序的通信 JDK12提供了一种方式,它指定了一个特殊的“保护域”或一个特殊 Applet运行的安全性环境 远程系统检査原始的URL以及它下载的 Applet的签名,和一个含有从特殊的^ pple到特殊保护域的映 射入口的本地文件进行比较。因此,来自特别位置的特殊 Applet具有一些运行特权。 119
119 1. 浏览器装入 URL 2. 浏览器装入 HTML 文档 3. 浏览器装入 Applet 类 4. 浏览器运行 Applet 12.3.2 Applet 的安全限制 由于通过网络装载,Applet 的代码具有一种内在的危险性。如果有人编写了一个恶意的类来读取你 的密码文件,并把它通过 Internet 传送,会产生怎样的后果呢? 所能够控制的安全程度是在浏览器层次上实现的。大多数浏览器(包括 Netscape Nevigator)缺省地 禁止以下操作: ⚫ 运行时执行另一程序 ⚫ 任何文件的输入/输出 ⚫ 调用任何本地方法 ⚫ 尝试打开除提供 Applet 的主机之外的任何系统的 Socket 这些限制的关键在于,通过限制 Applet 对系统文件的存取来阻止它侵犯一个远程系统的隐私或破坏 该系统。禁止执行另一程序和不允许调用本地方法限制了 Applet 启动未经 JVM 检查的代码。对 Socket 的限制则禁止了与另一个可能有危害性的程序的通信。 JDK1.2 提供了一种方式,它指定了一个特殊的“保护域”或一个特殊 Applet 运行的安全性环境。 远程系统检查原始的 URL 以及它下载的 Applet 的签名,和一个含有从特殊的 Applet 到特殊保护域的映 射入口的本地文件进行比较。因此,来自特别位置的特殊 Applet 具有一些运行特权。 Applet 的安全限制 ⚫ 多数浏览器禁止以下操作: ⚫ 运行时执行另一程序 ⚫ 任何文件的输入/输出 ⚫ 调用任何本地方法 ⚫ 尝试打开除提供 Applet 的主机之外的任何系统的 Socket
第四节编写一个 Applet 要编写一个 Applet,必须首先用以下方式创建一个类: import java applet. public class Hello World extends Applet i Applet的类必须为 public,且它的名称必须与它所在的文件名匹配;在这里,就是 Hello World. java。而且,该类必须为 java applet Applet的子类 Applet类的层次 Java applet Applet类实际上是 java.awt. Panel的子类。 Applet和AWT类的层次如下: java. lang Cbject Java. awt. Component Java. awt Container Java. awt. Window java. awt. Panel Java. awt. Frame java applet Applet 这种层次关系显示,一个 Applet可直接用作一个AWT布局的起始点。因为 Applet为一 Panel,,所 以它有一个缺省的流(fow)布局管理器。 Component, Container和 Panel类的方法被 Applet类继承了下来 124.1主要的 Applet方法 主要的 Applet方法 stop destroyo 在一个应用程序中,程序由 maino方法处进入,而在一个 Applet中却不是这样。在构造函数完成了 它的任务后,浏览器调用 inito对 Applet进行基本的初始化操作。ini0结束后,浏览器调用另一个称为 start)的方法。本模块稍后将对 start做更细致的剖析; start0通常在Aplt成为可见时被调用 方法init0和star0都是在 Applet成为“活动的”之前运行完成的,正因为这样,它们都不能用来编 写 Applet中继续下去的动作。实际上,与一个简单应用程序中的方法main(不同的是,没有什么方法的 执行是贯穿于 Applet的整个生命过程中的。你在后面将看到如何使用线程来实现这一特色。此外,你在 编写Aplt子类时可用的方法还有: stop, destroy)和 paint)。 124.2 Applet显示 Applet显示 Applet在本质上是图形方式的 方法 paint由浏览器环境调用
120 第四节 编写一个 Applet 要编写一个 Applet,必须首先用以下方式创建一个类: import java.applet.*; public class HelloWorld extends Applet { Applet 的类必须为 public,且它 的名称必须与它 所在的文件名匹配 ;在这里,就是 HelloWorld.java。而且,该类必须为 java.applet.Applet 的子类。 Applet 类的层次 Java.applet.Applet 类实际上是 java.awt.Panel 的子类。Applet 和 AWT 类的层次如下: 这种层次关系显示,一个 Applet 可直接用作一个 AWT 布局的起始点。因为 Applet 为一 Panel,所 以它有一个缺省的流(flow)布局管理器。Component,Container 和 Panel 类的方法被 Applet 类继承了下来。 12.4.1 主要的 Applet 方法 在一个应用程序中,程序由 main()方法处进入,而在一个 Applet 中却不是这样。在构造函数完成了 它的任务后,浏览器调用 init()对 Applet 进行基本的初始化操作。init()结束后,浏览器调用另一个称为 start()的方法。本模块稍后将对 start()做更细致的剖析;start()通常在 Applet 成为可见时被调用。 方法 init()和 start()都是在 Applet 成为“活动的”之前运行完成的,正因为这样,它们都不能用来编 写 Applet 中继续下去的动作。实际上,与一个简单应用程序中的方法 main()不同的是,没有什么方法的 执行是贯穿于 Applet 的整个生命过程中的。你在后面将看到如何使用线程来实现这一特色。此外,你在 编写 Applet 子类时可用的方法还有:stop(),destroy()和 paint()。 12.4.2 Applet 显示 主要的 Applet 方法 ⚫ init() ⚫ start() ⚫ stop() ⚫ destroy() ⚫ paint() Applet 显示 ⚫ Applet 在本质上是图形方式的 ⚫ 方法 paint()由浏览器环境调用
Applet本质上是图形方式的,所以尽管你可以提出 System. out println的调用请求,通常也不能这样 做,而是应该在图形环境中创建你的显示 你可以通过创建一个pain0方法在 Applet的 panel上绘图。只要 Applet的显示需要刷新, paint)方 法就会被浏览器环境调用。例如,当浏览器窗口被最小化或被要求以图标方式显示时,这种调用就会发 生 你应该编写自己的 paint方法,以使它在任何时候被调用时都能正常地工作。对它的调用是异步产 生的,且由环境而不是程序来驱动。 243 paint方法和图形对象 paint)方法带有一个参数,它是 java. awt. Graphics类的一个实例。这个参数总是建立该 Applet的 panel 的图形上下文。你能用这个上下文在你的 Applet中绘图或写入文本。下面是使用pan)方法写出文字的 一例。 Iimport java. awt., 2. import java applet. * 3 4. public class Hello World extends Applet 6. public void paint( Graphics g)f 7 g drawString("Hello World! " 25, 25) 注- drawStr ing方法的数字型参数为文本起始处的x和y的象素坐标。(0,0)表示左上角。这些坐标是针对字体的基线 来讲的,所以在y坐标为0处写的结果是:文字的大部分在显示器顶部的上方,只有象字母y尾部那样的下面部分是可 见的 第五节 Applet l的方法和 Applet的生命周期 Applet的方法和 Applet的生命周期 inito 在 Applet创建时被调用 可用于初始化数据值 start ·当 Applet成为可见时运行 stop ·当 Applet成为不可见时运行 Applet的生命周期比所讨论的要稍微复杂一些。与其生命周期相关的有三个主要方法: initO, start 和sop(
121 Applet 本质上是图形方式的,所以尽管你可以提出 System.out.println()的调用请求,通常也不能这样 做,而是应该在图形环境中创建你的显示。 你可以通过创建一个 paint()方法在 Applet 的 panel 上绘图。只要 Applet 的显示需要刷新,paint()方 法就会被浏览器环境调用。例如,当浏览器窗口被最小化或被要求以图标方式显示时,这种调用就会发 生。 你应该编写自己的 paint()方法,以使它在任何时候被调用时都能正常地工作。对它的调用是异步产 生的,且由环境而不是程序来驱动。 12.4.3 paint()方法和图形对象 paint()方法带有一个参数,它是 java.awt.Graphics 类的一个实例。这个参数总是建立该 Applet 的 panel 的图形上下文。你能用这个上下文在你的 Applet 中绘图或写入文本。下面是使用 paint()方法写出文字的 一例。 1.import java.awt.*; 2.import java.applet.*; 3. 4.public class HelloWorld extends Applet { 5. 6.public void paint(Graphics g){ 7.g.drawString("Hello World!", 25, 25); 8.} 9.} 注-drawString 方法的数字型参数为文本起始处的 x 和 y 的象素坐标。(0,0)表示左上角。这些坐标是针对字体的基线 来讲的,所以在 y 坐标为 0 处写的结果是:文字的大部分在显示器顶部的上方,只有象字母 y 尾部那样的下面部分是可 见的。 第五节 Applet 的方法和 Applet 的生命周期 Applet 的生命周期比所讨论的要稍微复杂一些。与其生命周期相关的有三个主要方法:init(),start() 和 stop()。 Applet 的方法和 Applet 的生命周期 ⚫ init() ⚫ 在 Applet 创建时被调用 ⚫ 可用于初始化数据值 ⚫ start() ⚫ 当 Applet 成为可见时运行 ⚫ stop() ⚫ 当 Applet 成为不可见时运行
12.5.1iniO 本成员函数在 Applet被创建并装入一个能支持Java技术的浏览器(如 appletviewer)时被调用。 Applet 可用这个方法来初始化数据的值。本方法只在 Applet首次装入时被调用,并且在调用star之前执行完 成 12.5.2 start initO方法一完成,star就开始执行。它的执行使得 Applet成为“活动”的。无论 Applet何时成为 可见的,它同样要执行一次,如:当浏览器在被图标化后又恢复时,或者当浏览器在链接到另一个URL 后又返回含有这个 Applet的页面时。这一方法的典型用法是启动动画和播放声音。 1. public void start i 2. music Clip playO 12.5.3 stop stop(方法是在 Applet成为不可见时被调用的,这种情况一般在浏览器被图标化或链接到另一个URL 时会出现。 Applet用该方法使动画停止。 1. public void stop( 2. music Clip. stop start(和 stop形成一对动作:典型地,sar0激活 Applet中的某一行为,而sopO则可将它禁止 第六节AWT绘图 MT绘图 repaint update( Graphics g) 除了基本的生命周期外, Applet还有与其显示有关的一些重要的方法。这些方法的声明和文档在 AWT组件类中。使用AWT做显示处理时遵循正确的模型是非常重要的 更新显示由一种被称为AWT线程的独立的线程来完成。这个线程可用来处理与显示更新相关的两 种情况。 第一种情况是显露( exposure),它或在首次显示时,或在部分显示已被破坏而必须刷新时出现。显 示的破坏可能发生在任何时刻,因此,你的程序必须能在任意时刻更新显示 第二种情况是在程序重画带有新内容的画面时。这种重画可能会要求首先擦除原来的图像。 1261 Paint( Graphics g)方法 显露处理自动地发生,且导致对 paint方法的一次调用。一种 Graphics类的被称为裁剪矩形的设备 常用于对 paint方法进行优化。除非必要,更新不会完全覆盖整个图形区域,而是严格限制在被破坏的 范围内 126.2 repaint(O方法 对 repaint的调用可通知系统:你想改变显示,于是系统将调用 paint(
122 12.5.1 init() 本成员函数在 Applet 被创建并装入一个能支持 Java 技术的浏览器(如 appletviewer)时被调用。Applet 可用这个方法来初始化数据的值。本方法只在 Applet 首次装入时被调用,并且在调用 start()之前执行完 成。 12.5.2 start() init()方法一完成,start()就开始执行。它的执行使得 Applet 成为“活动”的。无论 Applet 何时成为 可见的,它同样要执行一次,如:当浏览器在被图标化后又恢复时,或者当浏览器在链接到另一个 URL 后又返回含有这个 Applet 的页面时。这一方法的典型用法是启动动画和播放声音。 1.public void start() { 2.musicClip.play(); 3.} 12.5.3 stop() stop()方法是在Applet成为不可见时被调用的,这种情况一般在浏览器被图标化或链接到另一个URL 时会出现。Applet 用该方法使动画停止。 1.public void stop() { 2.musicClip.stop(); 3.} start()和 stop()形成一对动作:典型地,start()激活 Applet 中的某一行为,而 stop()则可将它禁止。 第六节 AWT 绘图 除了基本的生命周期外,Applet 还有与其显示有关的一些重要的方法。这些方法的声明和文档在 AWT 组件类中。使用 AWT 做显示处理时遵循正确的模型是非常重要的。 更新显示由一种被称为 AWT 线程的独立的线程来完成。这个线程可用来处理与显示更新相关的两 种情况。 第一种情况是显露(exposure),它或在首次显示时,或在部分显示已被破坏而必须刷新时出现。显 示的破坏可能发生在任何时刻,因此,你的程序必须能在任意时刻更新显示。 第二种情况是在程序重画带有新内容的画面时。这种重画可能会要求首先擦除原来的图像。 12.6.1 Paint(Graphics g)方法 显露处理自动地发生,且导致对 paint()方法的一次调用。一种 Graphics 类的被称为裁剪矩形的设备 常用于对 paint()方法进行优化。除非必要,更新不会完全覆盖整个图形区域,而是严格限制在被破坏的 范围内。 12.6.2 repaint()方法 对 repaint()的调用可通知系统:你想改变显示,于是系统将调用 paint()。 AWT 绘图 ⚫ paint (Graphics g) ⚫ repaint() ⚫ update(Graphics g)
1263 update( Graphics g)方法 painty实际上产生了一个调用另一方法 update(的AWT线程。 update方法通常清除当前的显示并 调用 paint(o update(方法可以被修改,如:为了减少闪烁可不清除显示而直接调用 paint(。 12.6.4方法的交互 下面的框图描述了 paint, update)和 repaint方法间的内在关系。 AWT thread(waiting) epaint Exposure date( clear area call paint() aint o 12.6.5 Applet的显示策略 Applet的显示策略 维护一个显示模型 ·使 paint提供仅仅基于这个模型的显示 更新这个模型并调用 repaint来改变显示 Applet模型要求你采取一种特定的策略来维护你的显示: 维护一个显示模型。这个模型是对为再次提供显示而所需做的事情的一个定义。关于如何去做 的指令在 paint方法中被具体化;这些指令所用的数据通常是全局成员变量 使 paint提供仅仅基于该模型的显示。这使得无论pain)何时被调用,它都能以一致的方法再 生该显示,并正确地处理显露问题 使得程序对显示的改变,通过更新该模型而调用 repaint0方法来进行,以使 updated方法(最终 是 paint0方法)被AWT线程调用。 注一一个单一AW线程处理所有的绘图组件和输入事件的分发。应保持 paint0和 update0的简单性,以避免它们使AWT 线程发生故障的可能性更大;在极端情况下,你将需要其他线程的帮助以达到这一目的。有关线程的编程是模块14的主 题。 第七节什么是 appletviewer?
123 12.6.3 update(Graphics g)方法 repaint()实际上产生了一个调用另一方法 update()的 AWT 线程。update 方法通常清除当前的显示并 调用 paint()。update()方法可以被修改,如:为了减少闪烁可不清除显示而直接调用 paint()。 12.6.4 方法的交互 下面的框图描述了 paint(),update()和 repaint()方法间的内在关系。 12.6.5 Applet 的显示策略 Applet 模型要求你采取一种特定的策略来维护你的显示: ⚫ 维护一个显示模型。这个模型是对为再次提供显示而所需做的事情的一个定义。关于如何去做 的指令在 paint()方法中被具体化;这些指令所用的数据通常是全局成员变量。 ⚫ 使 paint()提供仅仅基于该模型的显示。这使得无论 paint()何时被调用,它都能以一致的方法再 生该显示,并正确地处理显露问题。 ⚫ 使得程序对显示的改变,通过更新该模型而调用 repaint()方法来进行,以使 update()方法(最终 是 paint()方法)被 AWT 线程调用。 注-一个单一 AWT 线程处理所有的绘图组件和输入事件的分发。应保持 paint()和 update()的简单性,以避免它们使 AWT 线程发生故障的可能性更大;在极端情况下,你将需要其他线程的帮助以达到这一目的。有关线程的编程是模块 14 的主 题。 第七节 什么是 appletviewer? Applet 的显示策略 ⚫ 维护一个显示模型 ⚫ 使 paint()提供仅仅基于这个模型的显示 ⚫ 更新这个模型并调用 repaint()来改变显示