• 1. 在Java中,有两种类型的程序: 应用程序(Application) 小应用程序(Applet)第八章 Applet   Java Applet可以被HTML页面引用,并可以在支持Java的浏览器中执行,可以说Applet具有“激活因特网”的强大功能。1
  • 2. 8.1 Applet的基本工作原理 Applet的基本工作原理如图8-1所示。 2
  • 3. Applet的继承关系图如图8-2所示。 3
  • 4. 8.2 第一个Applet小程序 import java.applet.*; import java.awt.*; public class AppletDemo extends Applet { public void paint (Graphics g) { g.drawString("this is the first applet",20,40); } }  一个Java Applet也是由若干个类组成的,但必须有且仅有一个类扩展了Applet类,即它是Applet类的子类,把这个类叫Java Applet的主类,主类必须是public的,一个Java Applet不再需要main方法。一、简单Applet小程序4
  • 5. 二、Applet的运行在集成环境里直接运行 在控制台运行   C:\>appletviewer AppletDemo.htm  其中AppletDemo.htm是AppletDemo.java对应的HTML文件 3. 在IE中运行AppletDemo.htm electronic introduction 5
  • 6. 8.3 Applet基础 一、Applet类 java.applet包包含有三个接口:AppletContext接口、 AppletStub接口、AudioClip接口及一个Applet类。1.AppletContext接口   提供Applet环境文件信息,诸如Applet所在的文件有哪些Applet,或是在状态栏上显示信息。   常用的方法有: Applet getApplet(String name) //取得网页中名为name的Applet Enumeration getApplets() //取得所有同网页中的Applets,并存放在Enumeration对象中 AudioClip getAudioClip(URL url) //从url取得一个audioclip对象 Image getImage(URL url) //从url取得一个image对象 6
  • 7. void showDocument(URL url) //显示位置为url的网页 void showDocument(URL url,String target) //显示位置为url的网页,并指定到target的地方 void showStatus(String status) //在浏览器状态栏上显示字符串status的信息 2.AppletStub接口 作为Applet与浏览器环境的沟通接口。常用的方法有: String getParameter(String name) //用来从HTML文件中取得名为name的参数 void appletResize(int width,int height) //变换此applet的尺寸,宽为width,高为height URL getDocumentBase() //得到包含该applet的网页的URL boolean isActive() //返回此applet是否在运行的逻辑值7
  • 8. 3.AudioClip接口 提供音频的接口,音频文件必须是AU、AIFF、WAV、或者MIDI格式。常用的方法有: void loop() //重复播放音频文件 void play(URL url) //从头开始播放地址为url的音频文件,此url需为绝对地址 void play(URL url,String name) //从头开始播放地址为url,名称为name的音频文件 void Stop() //停止播放声音8
  • 9. 4.Applet类   Applet不能单独自己执行,而必须嵌入在别的软件如浏览器上,或是通过appletviewer来执行,而Applet类提供了Applet与其所执行环境间的标准接口。Applet类也提供了使Applet能在浏览器上执行的骨干结构,由init()、start()、stop()、destroy()这四个方法所构成。   利用Applet类提供的四个方法init()、start()、stop()和destroy()可以构造任意Applet框架。   在实际应用中,用户需要重载这些方法来构造自己需要的Applet。 9
  • 10. 二、Applet类提供的4个方法1. public void init()   该方法用于Applet的初始化。当Applet被第一次加载时,该方法会被自动调用(该方法只被调用执行一次)。在这个方法中,可以做一些必要的初始化工作,这些内容包括是创建和初始化程序运行所需要的对象实例,把图形或字体载入内存,处理PARAM参数等。 2. public void start()   该方法用来启动浏览器运行Applet的主线程。调用init 方法将Applet的初始化工作完成之后,start方法会被自动调用;当用户刷新包含Applet的页面或者从其它页面返回包含Applet的页面时,start方法也会被自动调用。   也就是说,start方法可以被多次调用,这与init方法是有区别的。基于这样的原因,可以把只调用一次的代码放在init方法中,而不能放在start方法中。10
  • 11. 3. public void stop()   该方法在用户离开包含Applet的页面时会被自动调用。和start方法一样,stop方法也可以被多次调用。该方法的作用是,当用户离开包含Applet的页面时,停止一些耗费系统资源的活动,如播放动画等。如果在Applet中没有动画、音乐文件播放,那么通常可以不使用这个方法。 4. public void destroy()   当用户正常关闭浏览器时,浏览器会调用destroy方法。该方法用于回收系统资源,如回收图形用户界面的系统资源、关闭连接等。至于Applet实例本身,会由浏览器来负责从内存中清除,不需要在destroy方法中来清除。   Applet类提供的四个方法init、start、stop和destroy分别对应了Applet的初始化、启动、暂停直到消亡的各个阶段。 11
  • 12.  图8-3说明了Applet的生命周期和对应的方法 图8-3 Applet的生命周期和对应的方法12
  • 13. 三、 Applet与Application的区别 Java Applet程序是在WWW浏览器环境下运行,即不是完整独立运行程序; 2. 运行Java Applet程序的解释器不是独立的软件,而是嵌在WWW浏览器中作为浏览器软件的一部分; 3. Java Applet程序中不需要有main方法,但是Java Applet程序的主类必须是类库中已定义好的类Applet或JApplet的子类; 4. Java Applet程序可以直接利用浏览器或AppletViewer提供的图形用户界面,而Java Application程序则必须另外书写专用代码来创建自己的图形界面。 13
  • 14. 四、Applet安全基础 Applet被设计为从远程站点下载然后在本地执行,所以安全问题非常重要。如果用户在游览器中启用了Java,那么浏览器就会自动下载网页中的Applet代码并执行。用户没有机会来确认或者停止Applet的运行。基于这样的原因,与Application应用程序相比, Applet被作了限制。 Applet的限制执行环境常常称作“沙箱(sandbox )”。运行在沙箱中的Applet不能更改或探查用户的系统。 当运行在沙箱中时: (1) Applet不能读写本地计算机的文件系统,也不能运行任何本地可执行程序。 (2) Applet不能同除它们的下载处的服务器(该服务器称作原始主机)以外的其他任何主机通信。这条规则使得Applet不能探查企业内部网上的资源。14
  • 15. (3) Applet只能获取本地计算机中的以下信息:当前使用的Java版本;操作系统的名字和版本;用来分离文件、路径以及行的字符。除此以外,Applet不能获取任何其它关于本地计算机的信息。 (4) Applet弹出的所有窗口都会带有一警告消息,告诉用户这是一个Applet。 因为Java解释器会检查所有的危险指令和程序区域,所以一个带有敌意的Applet不能覆盖系统内存、改变操作系统赋予的特权或者使计算机崩溃。 在某些情况下,这些限制显得过于严格。为了允许在不同情况下使用不同的安全级别,Java引入了签名Applet。 一个签名Applet带有一个能够表明签名者特征的证书。加密技术保证了这样的证书不可能被伪造。如果信任签名者,那么可以选择给该Applet额外的特权。被完全信任的Applet可以获得同本地应用程序一样的访问特权。15
  • 16. import java.applet.*; import java.awt.*; import java.awt.event.*; public class Example extends Applet implements ActionListener { AudioClip clip;//声明一个音频对象 Button button_play,button_loop,button_stop; public void init() { clip=getAudioClip(getCodeBase(),"xintianyou.mid"); /* 根据程序所在的地址处的声音文件创建音频对象,Applet类的getCodeBase() 方法可以获得小程序所在的html页面的URL地址。*/ button_play=new Button("开始播放"); button_loop=new Button("循环播放"); button_stop=new Button("停止播放"); 8.4 Applet的应用 一、在小程序中播放声音16
  • 17. button_play.addActionListener(this); button_stop.addActionListener(this); button_loop.addActionListener(this); add(button_play); add(button_loop); add(button_stop); } public void stop() { clip.stop();//当离开此页面时停止播放。 }17
  • 18. public void actionPerformed(ActionEvent e) { if(e.getSource()==button_play) { clip.play(); } else if(e.getSource()==button_loop) { clip.loop(); } if(e.getSource()==button_stop) { clip.stop(); } } }18
  • 19. 二、在小程序中绘制图像import java.applet.*; import java.awt.*; public class Example extends Applet { Image img; public void start() { img=getImage(getCodeBase(),"czh1.jpg"); } public void paint(Graphics g) { g.drawImage(img,22,22,200,200,this); } }19
  • 20. 三、网页传值   可以在超文本中使用若干个标志把值传递到小程序中,这样就实现动态地向程序传递信息,不必重新编译程序,便于程序的维护和使用。 20
  • 21. import java.awt.*; import java.applet.*; public class Example8_4 extends Applet { int x=0,y=0; public void init() { String s1=getParameter(“girl”);  //从html得到"girl"的值 String s2=getParameter(“boy”);  //从html得到"boy"的值 x=Integer.parseInt(s1); y=Integer.parseInt(s2); } public void paint(Graphics g) { g.drawString("x="+x+","+"y="+y,90,120); } }21
  • 22. 8.5 Applet与JAR文件 一、JAR文件概述   JAR(Java Archive)是一种与平台无关的文档格式,一般叫Java存档,它相当于一种压缩格式,可以把众多的文档合成一个文件。   大多数的Applet都由多个类组成,使用浏览器来浏览这样的Applet时,由于一个文件需要一个连接,所以浏览器需要使用多个连接,这样在一个低速的网络上加载一个Apple需要好几分钟。这里值得注意的是,加载Apple需要较长时间的原因并不是因为类文件太大,关键原因是建立到服务器的连接需要的时间长。   对于Applet来说,JAR文件可以将多个需要的类文件合并为一个单一的文件。这是很有意义的,这样这些类文件可以作为一个整体使用一个HTTP事务下载到浏览器中,从而大大提高浏览速度。 22
  • 23. 二、jar命令 jar命令格式如下: jar [选项1] ……[选项n] 文件名1 文件名2…… jar命令的选项: c 创建新的存档,并把文件添加至其中,如果一个文件名是一个目录,它将被递归处理 t 列出存档内容的列表 x 展开存档中的命名的(或所有的〕文件 u 更新已存在的存档 v 生成详细输出到标准输出上 f 指定存档文件名 m 包含来自标明文件的标明信息 o 只存储方式;未用ZIP压缩格式 M 不产生所有项的清单(manifest〕文件 i 为指定的jar文件产生索引信息 C 改变到指定的目录23
  • 24. 三、JAR缓存 在默认的情况下,浏览器使用浏览器的缓存来缓存Applet代码。在这种情况下,如果访问一个曾经访问过的包含了Applet的站点,并且浏览器缓存仍然包含所需要的JAR文件,并且这个JAR文件没有改变,那么这个JAR文件就不会被重新下载。   但是在正常情况下,浏览器缓存并不能够保持足够长的时间。比如,如果每个月只访问一次某个站点,那么极有可能每次都要重新下载并刷新缓存。   Java插件支持一种机制来“粘滞”Applet,如果我们想让一个Applet停留在用户端的时间更长,就需要使用OBJECT标记来指定CACHE_OPTION、CACHE_ARCHIVE和CACHE_VERSION键的值。   CACHE_VERSION键用来代表CACHE_ARCHIVE列表中指定的JAR文件需要的版本号码。如果这些版本已经在客户机上,那他们将不必被下载。24
  • 25. 本章小结   Java Applet是一种特殊的Java程序,我们称之为“小应用程序”。Applet可以被HTML页面引用,并可以在支持Java的浏览器中执行,可以说Applet具有“激活因特网”的强大功能。   从本质上讲,Applet就是一个扩展了java.applet.Applet类的Java类。Applet类提供了使Applet能在浏览器上执行的骨干结构,而这个骨干是由init、start、stop、destroy这四个方法所构成。利用Applet类提供这四个方法可以构造任意Applet框架。在实际应用中,我们需要重载这些方法来构造自己需要的Applet。   Applet的限制执行环境常常称作“沙箱(sandbox )”。运行在沙箱中的Applet不能更改或探查用户的系统。所以一个带有敌意的Applet不能覆盖系统内存、改变操作系统赋予的特权或者使计算机崩溃。   JAR(Java Archive)是一种与平台无关的文档格式,我们一般叫Java存档,它相当于一种压缩格式,可以把众多的文档合成一个文件。大多数的Applet都由多个类组成,JAR文件可以将多个需要的类文件合并为一个单一的文件。这样这些类文件可以作为一个整体使用一个HTTP事务下载到浏览器中,从而大大提高浏览速度。25