複製鏈接
請複製以下鏈接發送給好友

Applet

鎖定
Applet是採用Java編程語言編寫的小應用程序,該程序可以包含在 HTML標準通用標記語言的一個應用)頁中,與在頁中包含圖像的方式大致相同。 [1] 
含有Applet的網頁的HTML文件代碼中部帶有 和這樣一對標記,當支持Java的網絡瀏覽器遇到這對標記時,就將下載相應的小應用程序代碼並在本地計算機上執行該Applet。
中文名
小應用程序
外文名
Applet
編寫語言
Java
適用範圍
網頁程序
隸    屬
HTML
標    記

Applet工作原理

.Java Applet 可以大大提高Web頁面的交互能力和動態執行能力。包含Applet的網頁被稱為Java-powered頁,可以稱其為Java支持的網頁。
Applet Applet
當用户訪問這樣的網頁時,Applet被下載到用户的計算機上執行,但前提是用户使用的是支持Java的網絡瀏覽器。由於Applet是在用户的計算機上執行的,所以它的執行速度不受網絡帶寬或者Modem存取速度的限制,用户可以更好地欣賞網頁上Applet產生的多媒體效果。
在Java Applet中,可以實現圖形繪製,字體和顏色控制,動畫和聲音的插入,人機交互及網絡交流等功能。 Applet還提供了名為抽象窗口工具箱(Abstract Window Toolkit, AWT)的窗口環境開發工具。 AWT利用用户計算機的GUI元素,可以建立標準的圖形用户界面,如窗口、按鈕、滾動條等等。目前,在網絡上有非常多的Applet範例來生動地展現這些功能,讀者可以去調閲相應的網頁以觀看它們的效果。
Applet 小應用程序的實現主要依靠java.applet包中的Applet類。與一般的應用程序不同,Applet應用程序必須嵌入在HTML頁面中,才能得到解釋執行;同時Applet可以從Web頁面中獲得參數,並和Web頁面進行交互。
Applet是一種Java的小程序,它通過使用該Applet的HTML文件,由支持Java的網頁瀏覽器下載運行。也可以通過java開發工具的appletviewer來運行。Applet 程序離不開使用它的HTML文件。這個HTML文件中關於Applet的信息至少應包含以下三點:
(1)字節碼文件名(編譯後的Java文件,以.class為後綴)
(2)字節碼文件的地址
(3)在網頁上顯示Applet的方式。
一個HTML文件增加Applet有關的內容只是使網頁更加富有生氣,如添加聲音、動畫等這些吸引人的特徵,它並不會改變HTML文件中與Applet無關的元素。

Applet安全性限制

為了防止這樣的問題出現,在缺省的情況下,大多數瀏覽器在Applet安全方面受到諸多的限制,幾乎不能對系統進行任何“讀”或“寫”的操作:
1. 不允許Applet訪問本地文件系統
2. Applet不能執行任何本地計算機上的程序
3. 不允許Applet嘗試打開除提供Applet的服務器之外的任何系統的Socket
4. 不允許Applet訪問用户名電子郵件地址等與本地系統有關的信息
5. 對於Applet而言,Java環境中的某些標準系統屬性是隻讀的
6. Applet不能創建或裝載Applet的機器的網絡連接
7. Applet不能充當網絡服務器,監聽或接收來自遠程系統的連接請求
8. 不允許Applet裝載動態庫或定義本地方法調用
9. Applet不能操縱不在自己線程組中的任何線程
10. Applet不能關閉JVM。

Applet開發步驟

Applet程序開發主要步驟如下:
(1)選用EDIT或Windows Notepad等工具作為編輯器建立Java Applet源程序
(2)把Applet的源程序轉換為字節碼文件。
(3)編制使用class 的HTML文件。在HTML文件內放入必要的語句。
下面舉一個最簡單的HelloWorld 例子來説明Applet程序的開發過程:
(1) 編輯Applet 的java源文件
創建文件夾C:\ghq,在該文件夾下建立 HelloWorld.java
文件的源代碼如下:
import java.awt.*;
import java.applet.*;
public class HelloWorld extends Applet //繼承Applet類,這是Applet Java程序的特點
{
	public void paint(Graphics g )
	{
		g.drawString("Hello World!",5,35);
	}
}
import java.awt.*;
import java.applet.*;
public class HelloWorld extends Applet //繼承Applet類,這是Applet Java程序的特點
{
	public void paint(Graphics g )
	{
		g.drawString("Hello World!",5,35);
	}
}
保存上述程序在C:\ghq\HelloWorld.java文件裏。
(2)編譯Applet
編譯HelloWorld.java源文件可使用如下JDK命令:
C:\ghq\>javac HelloWorld.java
注意:如果編寫的源程序違反了Java編程語言語法規則,Java編譯器將在屏幕上顯示語法錯誤提示信息。源文件中必須不含任何語法錯誤,Java編譯器才能成功地把源程序轉換為appletviewer和瀏覽器能夠執行的字節碼程序。
成功地編譯Java applet之後生成響應的字節碼文件HelloWorld.class的文件。用資源管理器DIR命令列出目錄列表,將會發現目錄C:\ghq中多了一個名為HelloWorld.class的文件。
(3)創建HTML文件
在運行創建的HelloWorld.class 之前,還需創建一個HTML文件,appletviewer或瀏覽器將通過該文件訪問創建的Applet。為運行HelloWorld.class, 需要創建包含如下HTML語句的名為HelloWorld.html的文件。
HelloWorld! Applet
CODE="HelloWorld.class" //這裏應該是HelloWorld.class
WIDTH=200
HEIGHT=100
本例中,語句指明該Applet字節碼類文件名和以像素為單位的窗口的尺寸。雖然這裏HTML文件使用的文件名為HelloWorld.HTML,它對應於HelloWorld.java的名字,但這種對應關係不是必須的,可以用其他的任何名字(比如説Ghq.HTML)命名該HTML文件。但是使文件名保持一種對應關係可給文件的管理帶來方便。
(4)執行 HelloWorld.html
如果用appletviewer運行HelloWorld.html,需輸入如下的命令行:
C:\ghq\>appletviewer HelloWorld.html
可以看出,該命令啓動了appletviewer並指明瞭HTML文件,該HTML文件中包含對應於HelloWorld 的語句。
如果用瀏覽器運行HelloWorld Applet,需在瀏覽器的地址欄中輸入HTML文件URL地址。
至此,一個Applet程序的開發運行整個過程結束了(包括java源文件、編譯的class文件html文件以及用appletviewer或用瀏覽器運行)。
//還可應用程序:
import java.awt.*;
import java.applet.*;
public class Test extends Applet //繼承Appelet類,這是Applet Java程序的特點
{
	public void paint(Graphics g)
	{
		people zhang;
		zhang=new people();
		zhang.setname("Robot");
		zhang.setage(12);
		g.drawString(zhang.talk(),5,35);
	}
}

class people
{
	private String name ;
	private int age ;
	String talk()
	{
		return "我是"+name+";今年"+age+"歲";
	}
	public void setname(String str)
	{
		name = str ;
	}
	public void setAge(int a) {
    	if (a >= 0) {
        	age = a;
    	} else {
    		age = -a;
    	}

	}
	public String getname()
	{
		return name ;
	}
	public int getage()
	{
		return age ;
	}
}
常用方法
applet的超類是panel。
public final void setStub(AppletStub stub)
//設置Applet的stub.stub是Java和C之間轉換參數並返回值代碼位,它是由系統自動設定的。
public boolean isActive(); // 判斷一個Applet是否處於活動狀態。
public URL getDocumentBase(); // 檢索表示該Applet運行的文件目錄的對象。
public URL getCodeBase(); // 獲取該Applet 代碼的URL地址。
public String getParameter(String name); // 獲取該Applet 由name指定參數的值。
public AppletContext getAppletContext(); // 返回瀏覽器或小應用程序觀察器。
public void resize(int width,int height); // 調整Applet運行的窗口尺寸。
public void resize(Dimension d); // 調整Applet運行的窗口尺寸。
public void showStatus(String msg); // 在瀏覽器的狀態條中顯示指定的信息。
public Image getImage(URL url); // 按url指定的地址裝入圖象。
public Image getImage(URL url,String name); // 按url指定的地址和文件名加載圖像。
public AudioClip getAudioClip(URL url); // 按url指定的地址獲取聲音文件。
public AudioClip getAudioClip(URL url, String name); // 按url指定的地址和文件名獲取聲音。
public String getAppletInfo(); // 返回Applet應用有關的作者、版本和版權方面的信息;
public String getParameterInfo();
// 返回描述Applet參數的字符串數組,該數組通常包含三個字符串: 參數名、該參數所需值的類型和該參數的説明。
public void play(URL url);// 加載並播放一個url指定的音頻剪輯。
public void destroy();//撤消Applet及其所佔用的資源。若該Applet是活動的,則先終止該Applet的運行。運行狀態
Applet類中的四種基本方法用來控制其運行狀態:init()、start()、stop()、destroy()
init()方法
這個方法主要是為Applet的正常運行做一些初始化工作。當一個Applet被系統調用時,系統首先調用的就是該方法。通常可以在該方法中完成從網頁向Applet傳遞參數,添加用户界面的基本組件等操作。
start()方法
系統在調用完init()方法之後,將自動調用start()方法。而且,每當用户離開包含該Applet的主頁後又再返回時,系統又會再執行一遍start()方法。這就意味着start()方法可以被多次執行,而不像init()方法。因此,可把只希望執行一遍的代碼放在init()方法中。可以在start()方法中開始一個線程,如繼續一個動畫、聲音等。
stop()方法
這個方法在用户離開Applet所在頁面時執行,因此,它也是可以被多次執行的。它使你可以在用户並不注意Applet的時候,停止一些耗用系統資源的工作以免影響系統的運行速度,且並不需要人為地去調用該方法。如果Applet中不包含動畫、聲音等程序,通常也不必實現該方法。
destroy()方法
與對象的finalize()方法不同,Java在瀏覽器關閉的時候才調用該方法。Applet是嵌在HTML文件中的,所以destroty()方法不關心何時Applet被關閉,它在瀏覽器關閉的時候自動執行。在destroy()方法中一般可以要求收回佔用的非內存獨立資源。(如果在Applet仍在運行時瀏覽器被關閉,系統將先執行stop()方法,再執行destroy()方法。有關參數説明
利用Applet來接收從HTML中傳遞過來的參數,下面對這些參數作一簡單説明:
* CODE標誌
CODE標誌指定Applet的類名;WIDTH和HEIGHT標誌指定Applet窗口的像素尺寸。在APPLET語句裏還可使用其他一些標誌。
* CODEBASE 標誌
CODEBASE標誌指定Applet的URL地址。Applet的通用資源定位地址URL,它可以是絕對地址 。也可以是相對於當前HTML所在目錄的相對地址,如/AppletPath/Name。如果HTML文件不指定CODEBASE 標誌,瀏覽器將使用和HTML文件相同的URL。
* ALT 標誌
雖然Java在WWW上很受歡迎,但並非所有瀏覽器都對其提供支持。如果某瀏覽器無法運行Java Applet,那麼它在遇到APPLET語句時將顯示ALT標誌指定的文本信息。
* ALIGN 標誌
ALIGN標誌可用來控制把Applet窗口顯示在HTML文檔窗口的什麼位置。與HTML語句一樣,ALIGN標誌指定的值可以是TOP、MIDDLE或BOTTOM。
* VSPACE與HSPACE 標誌
VSPACE和HSPACE標誌指定瀏覽器顯示在Applet窗口周圍的水平和豎直空白條的尺寸,單位為像素。
* NAME 標誌
NAME標誌把指定的名字賦予Applet的當前實例。當瀏覽器同時運行兩個或多個Applet時,各Applet可通過名字相互引用或交換信息。如果忽略NAME標誌,Applet的名字將對應於其類名。
* PARAM 標誌
通用性是程序設計所追求的目標之一。使用户或者程序員能很方便地使用同一個Applet完成不同的任務是通用性的具體表現。從HTML文件獲取信息是提高Applet通用性的一條有效途徑。
假設編制了一個把某公司的名字在屏幕上捲動的Applet。為了使該Applet更加通用,則可以使該Applet從HTML文件獲取需要捲動的文本信息。這樣,若想顯示另一個公司的名字,用不着修改Java Applet本身,只需修改HTML文件即可。
PARAM 標誌可用來在HTML文件裏指定參數,格式如下所示:
PARAM Name="name" Value="Liter"
Java Applet可調用getParameter方法獲取HTML文件裏設置的參數值
上面這個例子就是一個簡單主頁的HTML文件代碼。代碼第五行中的
,是為了確保Applet出現在新的一行,若沒有它, Applet將會緊接着上一行的最後一個單詞出現。代碼第六、七兩行是關於Applet的一些參數。其中第六行是必需的Applet參數,定義了編譯後的包含Applet字節碼的文件名,後綴通常為“.class”;和以象素為單位的Applet的初始寬度與高度。第七行則是附加的Applet參數,它由一個分離的標記來指定其後的名稱和值,在這裏是img的值為“example.gif’,它代表了一個圖形文件名。
Applet的下載與圖形文件一樣需要一定的時間,若干秒後它才能在屏幕上顯示出來。等待的時間則取決於Applet的大小和用户的網絡連接的速度。一旦下載以後,它便和本地計算機上的程序以相同的速度運行了。
Applet在用户的計算機上執行時,還可以下載其它的資源,如聲音文件、圖像文件或更多的Java代碼,有些Applet還允許用户進行交互式操作。但這需要重複的鏈接與下載,因此速度很慢,這是一個亟待解決的問題,可以想到的一個好辦法是採用類似高速緩存的技術,將每次下載的文件都臨時保存在用户的硬盤上,雖然第一次使用時花的時間比較多,但當再次使用時,只需直接從硬盤上讀取文件而無需再與Internet連接,便可以大大提高性能了。調用applet
大家都知道由於java2的安全性,對applet的正常調用的html文件已經不能再使用了,而改為ActiveX類型的調用。具體的又分ie和nescape的不同寫法,這一些在sun網上都能找到現成的教程。重要
其中我要強調一點,因為applet每一次的改動都需要重新打包簽名,手續非常繁瑣,所以在具體的實現中要將一些會變化參數放到html文件中來,傳到applet中去,這一點網上文章好多,自己去看吧。缺陷
另外一個就是有朋友問我,那這樣不是太麻煩了,每一個客户端都要進行復雜的dos命令操作,我只能説我的水平只能將一個已經做好的客户端文件cer文件和java.policy以及cacerts文件直接拷貝到客户端,當然這也有缺陷,如果別人的計算機已經有了認證,就會丟失。就這些問題我們可以一起探討。優化
另外還有一點優化,就是在打包的時候,我這兒只講了把所有要用的涉及到安全性的包和源程序到要打到一個包中。這樣如果包非常大的話,會非常影響下載的速度,如果可以使用本地計算機的包就好了,這一點jre也做到了,具體的要到控制面板的jre控制枱上去設置。這個就留着讀者自己去摸索吧。實現方法服務器端
1.將程序需要用到的各種包文件全部解壓(要用到WEBLOGIC的JMS包使用命令jar xf weblogicc.jar),然後使用JDK的打包命令將編譯好的監控程序.class和剛才解壓的包一起打包到一個包中。(前提我已經將監控程序和解開的包都放在同一個目錄下了),都是dos狀態下的命令,具體命令見jdk1.3(1.2)的bin目錄下,
命令如下:
jar cvf monitor.jar *.class
此命令生成一個名為monitor.jar的包
2.為剛才創建的包文件(monitor.jar)創建keystore和keys。其中,keystore將用來存放密匙(private keys)和公共鑰匙的認證,alias別名這兒取為monitor。
命令如下:
keytool -genkey -keystore monitor.keystore –alias monitor
此命令生成了一個名為monitor.keystore的keystore文件,接着這條命令,系統會問你好多問題,比如公司名稱,地址,要設定的密碼等等,都可以隨便寫。
3.使用剛才生成的鑰匙來對jar文件進行簽名
命令如下:
jarsigner -keystore monitor.keystore monitor.jar monitor
這個命令將對monitor.jar文件進行簽名,不會生成新文件。
4.將公共鑰匙導入到一個cer文件中,這個cer文件就是要拷貝到客户端的唯一文件 。
命令如下:
keytool -export -keystore monitor.keystore -alias monitor -file monitor.cer
此條命令將生成monitor.cer認證文件,當然這幾步都有可能問你剛才設置的密碼。這樣就完成了服務器端的設置。這時就可以將jar文件和keystore文件以及cer文件(我這兒是monitor.jar,monitor.keystore,monitor.cer)拷貝到服務器的目錄下了。客户端
1. 首先應該安裝jre1.3.0_01,然後將服務器端生成的monitor.cer 文件拷貝到jre的特定目錄下,我這兒是:
c:\program files\javasoft\jre\1.3.0_01\lib\security目錄下。
2. 將公共鑰匙倒入到jre的cacerts(這是jre的默認keystore)
命令如下:
keytool -import -alias monitor -file monitor.cer
-keystore cacerts
注意這兒要你輸入的是cacerts的密碼,應該是changeit,而不是你自己設定的keystore的密碼。
3. 修改policy策略文件,在dos狀態下使用命令 policytool
系統會自動彈出一個policytool的對話框,如圖4所示,在這裏面首先選擇file菜單的open項,打開c:\program files\javasoft\jre\1.3.0_01\lib\security目錄下的java.poliy文件,然後在edit菜單中選擇Change keystore ,在對話框中new keystore url:中輸入
file:/c:/program files /javasoft/jre/1.3.0_01/lib/security/cacerts, 這兒要注意反斜槓,在new keystore type 中輸入JKS,這是cacerts的固定格式,然後單擊Add Policy Entry,在出現的對話框中CodeBase中輸入:
http://URL:7001/*
其中的URL是服務器的IP地址,7001是weblogic的端口,如果是在別的應用服務器上比如説是apache,那端口號就可以省略掉。
在SignedBy中輸入(別名alias):這兒是Monitor然後單擊add peimission按鈕,在出現的對話框中permission中選擇你想給這個applet的權限,這兒具體有許多權限,讀者可以自己找資料看看。這兒就選用allpeimission,右邊的signedBy中輸入別名:monitor
最後保存,在file菜單的save項。
這樣客户端的設置就完成了。在客户端用ie運行該applet程序時,會詢問你是不是對該簽名授權,選擇授權後,包會自動從服務器下載到本地計算機,而且ie會自動啓動jre,在右下欄中可以看見,相當於ie的java控制枱。
4.調用applet的html文件
applet的正常調用的html文件已經不能再用了。
width="900" height="520" align="baseline" codebase="http://192.168.2.217:7001/j2re-1_3_0_01-win-i.exe#Version=1,3,0,0">
參考資料