Applet

Applet

Applet是採用Java程式語言編寫的小應用程式,該程式可以包含在 HTML頁中,與在頁中包含圖像的方式大致相同。 含有Applet的網頁的HTML檔案代碼中部帶有 和這樣一對標記,當支持Java的網路瀏覽器遇到這對標記時,就將下載相應的小應用程式代碼並在本地計算機上執行該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安全方面受到諸多的限制,幾乎不能對系統進行任何“讀”或“寫”的操作:

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程式開發主要步驟如下:

1)選用EDIT或Windows Notepad等工具作為編輯器建立Java Applet源程式。

2)把Applet的源程式轉換為位元組碼檔案。

3)編制使用class 的HTML檔案。在HTML檔案內放入必要的<OBJECT>語句。

下面舉一個最簡單的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);

}

}

保存上述程式在C:\ghq\HelloWorld.java檔案里。

(2)編譯Applet

編譯HelloWorld.java源檔案可使用如下JDK命令:

C:\ghq\>javac HelloWorld.java<Enter>

注意:如果編寫的源程式違反了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的檔案。

<HTML>

<TITLE>HelloWorld! Applet</TITLE>

<APPLET

CODE="HelloWorld.class" //這裡應該是HelloWorld.class

WIDTH=200

HEIGHT=100>

</APPLET>

</HTML>

本例中,<APPLET>語句指明該Applet位元組碼類檔案名稱和以像素為單位的視窗的尺寸。雖然這裡HTML檔案使用的檔案名稱為HelloWorld.HTML,它對應於HelloWorld.java的名字,但這種對應關係不是必須的,可以用其他的任何名字(比如說Ghq.HTML)命名該HTML檔案。但是使檔案名稱保持一種對應關係可給檔案的管理帶來方便。

(4)執行 HelloWorld.html

如果用appletviewer運行HelloWorld.html,需輸入如下的命令行:

C:\ghq\>appletviewer HelloWorld.html<ENTER>

可以看出,該命令啟動了appletviewer並指明了HTML檔案,該HTML檔案中包含對應於HelloWorld 的<APPLET>語句。

如果用瀏覽器運行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<LMG>語句一樣,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檔案代碼。代碼第五行中的<P>,是為了確保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檔案已經不能再用了。

<html>

<META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=gb2312">

<center>

監控平台

<hr>

<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"

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">

</OBJECT>

</center>

</html>

相關詞條

相關搜尋

熱門詞條

聯絡我們