Applet 小程序
辽宁经济职业技术学院信息系
硕士、副教授 陈英
什么是 Applet?
Applet是能够嵌入到一个 HTML页面中,
且可通过 Web浏览器下载和执行的一种
Java类。
它是 Java技术容器 (container)的一种特定
类型,其执行方式不同于应用程序。
一个应用程序是从它的 main()方法被调用
开始的,而一个 Applet的生命周期在一定
程度上则要复杂得多。
本章将分析 Applet如何运行,如何被装载
到浏览器中,以及它是如何编写的。
什么是 Applet?
能嵌入到一个 HTML页面中且可通过
Web浏览器下载和执行的一种 Java类
可以以下方式装载:
1) 浏览器装载 URL
2) 浏览器装载 HTML文档
3) 浏览器装载 Applet类
4) 浏览器运行 Applet
Applet class
3,Browser loads
applet classes
http://someLocation/file.html 1,Browser loads URL
<Html>
<Applet code= ….>
</Applet>
2,Browser loads
HTML document
Location,http://someLocation/file.html
Loading...
4,Browser
run applet
Applet的安全限制
由于通过网络装载, Applet的代码具有一种内在
的危险性 。 如果有人编写了一个恶意的类来读取
你的密码文件, 并把它通过 Internet传送, 会产
生怎样的后果呢?
所能够控制的安全程度是在浏览器层次上实现的 。
大多数浏览器 ( 包括 Netscape Nevigator) 缺省
地禁止以下操作:
1) 运行时执行另一程序
2) 任何文件的输入 /输出
3) 调用任何本地方法
4) 尝试打开除提供 Applet的主机之外的任何系统的
Socket
Applet的 安全 限制
applet
BrowserSERVER 本地程序
file
SERVER
Applet被下载的
与 applet无关的
本地方法
local
applet的生命周期
Java.applet.Applet
public void init() public void destroy()
public void start() public void stop()
public void paint(Graphics g)
paint()虽不在生命
周期内,但它的作用
相当于 applet的灵魂
一个 applet的可视周期
init
start
stop
destroy
离开 web页面 重新装入或改变页面大小或返回 Web页面
主要的 Applet方法
init() 当 applet被初次加载时, 该方法会被调用 。
重载该方法并且把所有的初始化代码放置其中 。
start() 该方法在 java调用 init方法后被自动调用 。 当用
户从其他页面返回到包含 applet的页面中时, 该方法也
会被调用 。
stop()
该方法在用户离开 applet所在页面时自动被调用 。
destroy()
当浏览器被正常关闭时, java要保证调用此方法 。
paint( )
虽不在生命周期内,但它的作用相当于 applet的灵魂。
主要的 Applet方法
在一个应用程序中,程序由 main()方法
处进入,而在一个 Applet中却不是这样。
在构造函数完成了它的任务后,浏览器
调用 init()对 Applet进行基本的初始化操
作 。
init()结束后,浏览器调用另一个称为
start()的方法。
实际上,与一个简单应用程序中的方法
main()不同的是,没有什么方法的执行
是贯穿于 Applet的整个生命过程中的。
有关 paint()方法
Applet本身是一个容器,因此任何输出都必
须用图形方法 paint()。
当小应用首次被装载,以及每次窗口放大、
缩小、刷新时都要调用 paint方法。
paint()是由浏览器调用的,而不是由程序调用,
当程序希望调用 paint方法时,用 repaint命令。
paint方法的参数是 Graphics类的对象 g,它
在 java.awt.Graphics内
paint( Graphicd g) {… …}
编写一个 Applet
要编写一个 Applet,必须首先用以下方式
创建一个类:
import java.applet.*;
public class HelloWorld extends Applet {
Applet的类必须为 public,且它的名称必
须与它所在的文件名匹配;
在这里, 就是 HelloWorld.java。 而且, 该
类必须为 java.applet.Applet的子类 。
Applet继承关系图
java.lang.Object
java.awt.Component
java.awt.Container
java.awt.Window
java.awt.Frame
javax.swing.JFrame
java.awt.Panel
java.applet.Applet
javax.swing.JApplet
Applet类的层次
Java.applet.Applet 类实际上是
java.awt.Panel的子类 。
这种层次关系显示, 一个 Applet可直接用
作一个 AWT布局的起始点 。
因为 Applet为一 Panel,所以它有一个缺省
的流 (flow)布局管理器 。
Component,Container和 Panel类的方法
被 Applet类继承了下来 。
什么是 appletviewer?
Applet通常运行于一个 Web浏览器中,如 HotJava TM
或 Netscape Navigator,它们有支持 Java软件程序运行
的能力。为了简化和加速开发过程,JDK应运而生,它
附带有一个专为查看 Applet而设计但不支持 HTML页面
查看的工具。这个工具就是 appletviewer。
appletviewer是使你不必使用 Web浏览器即可运行
Applet的一个 Java应用程序。它犹如一个“最小化的浏
览器”。
appletviewer读取命令行中 URL所指定的 HTML文件。
这个文件必须包含装入及执行一个或多个 Applet的指令。
appletviewer忽略了所有其他的 HTML代码。它不能显
示普通的 HTML或嵌人在一个文本页中的 Applet。
用 appletviewer启动 Applet
appletviewer将一个框架样式的区域粘贴在屏
幕上,然后实例化该 Applet并将这个 Applet实
例贴在已有的框架中。
appletviewer带有一个命令行参数形式的 URL,
它指向一个含有 Applet引用的 HTML文件。这
个 Applet引用是一个指定了 appletviewer要装载
的代码的 HTML标记。
<html>
<applet code=HelloWorld.class width=100
height=100>
</applet>
</html>
使用 appletviewer
appletviewer带有一个指向包含 <applet>标记的
HTML文件的 URL,这个 URL被作为命令行参

appletviewer [-debug] URLs,.,
appletviewer仅有的合法选项是 –debug,它使得
Applet在 Java调试器 jdb中启动。若用带 –g选项
的方式编译你的 Java代码,则可在调试器中看到
源代码。
范例
以如下所示的 appletviewer命令启动 appletviewer:
c:\jdk1.2\source> appletviewer HelloWorld.html
于是它创建并显示出如下的小窗口:
在起始页中加入 applet
html中有关的代码
<APPLET CODE=“showdate.class”
width=600 height=80> </APPLET>
CODEBASE的作用
当 class文件与起始页文件不在同一个目录下时,使
用 CODEBASE说明
<APPLET CODE=“showdate.class”
width=600 height=80>
CODEBASE=“\myjava\class”</APPLET>
Applet显示
Applet本质上是图形方式的,所以尽管你可以
提出 System.out.println()的调用请求,通常也不
能这样做,而是应该在图形环境中创建你的显
示。
方法 paint()由浏览器环境调用 。
你可以通过创建一个 paint()方法在 Applet的
panel上绘图。只要 Applet的显示需要刷新,
paint()方法就会被浏览器环境调用。例如,当
浏览器窗口被最小化或被要求以图标方式显示
时,这种调用就会发生。
你应该编写自己的 paint()方法,以使它在任何
时候被调用时都能正常地工作。对它的调用是
异步产生的,且由环境而不是程序来驱动。
paint()方法和图形对象
paint()方法带有一个参数,它是
java.awt.Graphics类的一个实例。这个参数总是
建立该 Applet的 panel的图形上下文。可以用这
个上下文在 Applet中绘图或写入文本。

import java.awt.*;
import java.applet.*;
public class HelloWorld extends Applet {
public void paint(Graphics g){
g.drawString("Hello World!",25,25);
AWT绘图
Paint(Graphics g)方法
显露处理自动地发生,且导致对 paint()方法的一次调用。
一种 Graphics类的被称为裁剪矩形的设备常用于对 paint()
方法进行优化。除非必要,更新不会完全覆盖整个图形
区域,而是严格限制在被破坏的范围内。
repaint()方法
对 repaint()的调用可通知系统:你想改变显示, 于是系统
将调用 paint()。
update(Graphics g)方法
repaint()实际上产生了一个调用另一方法 update()的 AWT
线程。 update方法通常清除当前的显示并调用 paint()。
update()方法可以被修改,如:为了减少闪烁可不清除显
示而直接调用 paint()。
方法间的内在关系
AWT thread( waiting)
update()
{ clear arae
call paint()
paint()
repaint() Exposure
Applet的显示策略
维护一个显示模型 。 这个模型是对为再次提供
显示而所需做的事情的一个定义 。 关于如何去
做的指令在 paint()方法中被具体化;这些指令
所用的数据通常是全局成员变量 。
使 paint()提供仅仅基于该模型的显示 。 这使得
无论 paint()何时被调用, 它都能以一致的方法
再生该显示, 并正确地处理显露问题 。
使得程序对显示的改变, 通过更新该模型而调
用 repaint()方法来进行, 以使 update()方法
( 最终是 paint()方法 ) 被 AWT线程调用 。