"沙箱"機制:Java虛擬機爲Applet提供能夠良好運行的沙箱,一旦它們試圖離開沙箱則會被禁止。
由於小應用程序是通過網絡傳遞的,這就不可避免地使人想到會發生安全問題。例如有人編寫惡意程序通過小應用程序讀取用戶密碼並散播到網絡上,這將會是一件非常可怕的事情。所以,必須對小應用程序進行限制。
瀏覽器禁止Applet執行下列操作:
(1)在運行時調用其它程序。
(2)文件讀寫操作。
(3)裝載動態連接庫和調用任何本地方法。
(4)試圖打開一個socket進行網絡通信,但是所連接的主機並不是提供Applet的主機。
◇ Applet的類層次:
◇ Applet的生命週期
小應用程序的生命週期相對於Application而言較爲複雜。在其生命週期中涉及到Applet類的四個方法(也被JApplet類繼承):init()、start()、stop()和destroy()。下面首先用圖來表示一個小應用程序的生命週期,然後再簡要描述這四個方法。
Applet的生命週期中有四個狀態:初始態、運行態、停止態和消亡態。當程序執行完init()方法以後,Applet程序就進入了初始態;然後馬上執行start()方法,Applet程序進入運行態;當Applet程序所在的瀏覽器圖標化或者是轉入其它頁面時,該Applet程序馬上執行stop()方法,Applet程序進入停止態;在停止態中,如果瀏覽器又重新裝載該Applet程序所在的頁面,或者是瀏覽器從圖標中復原,則Applet程序馬上調用start()方法,進入運行態;當然,在停止態時,如果瀏覽器關閉,則Applet程序調用destroy()方法,進入消亡態。
◇ Applet的主要方法:
1. init( )
創建Applet時執行,只執行一次
當小應用程序第一次被支持Java的瀏覽器加載時,便執行該方法。在小應用程序的生命週期中,只執行一次該方法,因此可以在其中進行一些只執行一次的初始化操作,如處理由瀏覽器傳遞進來的參數、添加用戶接口組件、加載圖像和聲音文件等。
小應用程序有默認的構造方法,但它習慣於在init()方法中執行所有的初始化,而不是在默認的構造方法內。
2.start( )
多次執行,當瀏覽器從圖標恢復成窗口,或者是返回該主頁時執行。
系統在調用完init()方法之後,將自動調用start()方法。而且每當瀏覽器從圖標恢復爲窗口時,或者用戶離開包含該小應用程序的主頁後又再返回時,系統都會再執行一遍start()方法。start()方法在小應用程序的生命週期中被調用多次,以啓動小應用程序的執行,這一點與init()方法不同。該方法是小應用程序的主體,在其中可以執行一些需要重複執行的任務或者重新激活一個線程,例如開始動畫或播放聲音等。
3.stop( )
多次執行,當瀏覽器變成圖標時,或者是離開主頁時執行,主要功能是停止一些耗用系統資源的工作,。
與start()相反,當用戶離開小應用程序所在頁面或瀏覽器變成圖標時,會自動調用stop()方法。因此,該方法在生命週期中也被多次調用。這樣使得可以在用戶並不注意小應用程序的時候,停止一些耗用系統資源的工作(如中斷一個線程),以免影響系統的運行速度,且並不需要去人爲地去調用該方法。如果你的小應用程序中不包含動畫、聲音等程序,通常也不必重載該方法。
4.destroy( )
用來釋放資源,在stop( )之後執行
瀏覽器正常關閉時,Java自動調用這個方法。destroy()方法用於回收任何一個與系統無關的內存資源。當然,如果這個小應用程序仍然處於活動狀態,Java會在調用destroy()之前,調用stop()方法。
下面的例子使用了小應用程序生命週期中的這幾個方法。
例6.8
import java.awt.Graphics;
import java.applet.Applet;
public class HWloop extends Applet {
AudioClip sound; //聲音片斷對象
public void init( ){
sound=getAudioClip("audio/hello.au"); //獲得聲音片斷
}
public void paint(Graphics g) {
g.drawString("hello Audio",25,25); //顯示字符串
}
public void start( )
{
sound.loop( ); //聲音片斷開始播放
}
public void stop( )
{
sound.stop( ); //聲音片斷停止
}
}
在本例子中,Applet開始執行後就不停的播放聲音,如果瀏覽器圖標化或者是轉到其它頁面,則聲音停止播放;如果瀏覽器恢復正常或者是從其它頁面跳回,則程序繼續播放聲音。
由於Applet程序要嵌入到HTML文件中才能夠正常執行,下面介紹與Applet程序有關的HTML文件標記。
<applet>
[archive=archiveList] //同一個codebase中需預先下載的文件
code=appletFile.class //applet的名稱
width=pixels height=pixels //applet的初始顯示空間
[codebase=codebaseURL] //代碼的地址
[alt=alternateText] //如果瀏覽器不支持applet時,顯示的替代文本
[name=appletInstanceName]
//給該applet取名,用於同頁面applet之間的通信
[align=alignment] //對齊方式,如left,right,top,baseline...
[vspace=pixels] [hspace=pixels] //預留的邊緣空白
>
[<param name=appletAttribute1 value=value>]
[<param name=appletAttribute2 value=value>]
…… //參數名稱及其值
[alternateHTML]
</applet>
注意:
1)不支持Java的瀏覽器會把<applet></applet>之間的普通HTML文檔顯示出來;支持Java的瀏覽器,則把其中的普通HTML文檔忽略。
2)AppletViewer僅支持<applet> </applet>標記,其它標記不會被顯示出來。
經過精心設計,可以使java程序同時是Applet與Application,如下例所示:
例6.9
import java.awt.*;
import java.awt.event.*;
public class AppletApp extends Applet {
public void main(String args[]) {
Frame frame=new Frame("Application"); //構造一個Frame
AppletApp app=new AppletApp();
frame.add("Center",app);
frame.setSize(200,200); //改變Frame的尺寸
frame.validate();
frame.setVisible(true); //使Frame可見
frame.addWindwoListener(new WindowControl(app));
//給Frame加入監聽器
app.init(); //初始化Applet
app.start(); //運行該Applet
}
public void paint(Graphics g) { //重畫方法
g.drawString("hello world",25,25);
}
public void destroy(){
System.exit(0);
}
}
class WindowControl extends WindowAdapter {
//監聽器類
Applet c;
public WindowControl(Applet c) { //構造函數
this.c=c;
}
public void windowClosing(WindowEvent e) {
//關閉窗口時調用的方法
c.destroy( );
}
}