1?基本信息
摘要:一個開發好的Java Applet,是通過標準的標簽(Tag)嵌入到HTML頁面中的。瀏覽器在解析到支持的嵌入Applet的標簽時,會啟動Java Plug-in來渲染標簽中的Java Applet。
由于歷史原因,在頁面中嵌入Applet產生了幾種相互不兼容的方式,不同的瀏覽器、乃至同一個瀏覽器的不同版本,支持的標簽都不完全相同。本文關注的是 不同瀏覽器Applet嵌入的差異性,首先介紹幾種把Applet嵌入到頁面中的標簽,再介紹幾個能夠支持多種瀏覽器的嵌入方式。
作者:丁向武
2?頁面中嵌入Applet的幾種方式
2.1?Applet Tag
Applet標簽是最早IE用來支持嵌入Java Applet的標簽,那個時候微軟還有自己的JAVA虛擬機。在有些版本的瀏覽器上,Applet標簽是由瀏覽器自己渲染的,而不是由SUN Java Plug-in渲染的。這個標簽出現的比較早,現在有些瀏覽器仍然能夠兼容它,比如IE、Firefox等,但Netscape不支持這個標簽。現在的 W3C規范里,這個標簽已經不推薦使用,而是被Object標簽代替了。這個標簽最大的問題是,在客戶端沒有安裝Java Plug-in時,不能指定一個自動下載安裝Java Plug-in的地址。
下面是這個標簽的一個例子:
-
<APPLET code="XYZApp.class" codebase="html/" archive="Sample.jar"
-
align="baseline" width="200" height="200">
-
<PARAM name="model" value="models/HyaluronicAcid.xyz">
-
No Java 2 SDK, Standard Edition v 1.4.2 support for APPLET!!
-
</APPLET>
?
2.2?Embed Tag
這是Netscape Navigator 4.x瀏覽器支持的嵌入Applet的標簽,其他瀏覽器很少支持這個標簽的,因此實際應用的很少。這個標簽不支持以內嵌Param標簽的方式為 Applet傳遞參數。
下面是這個標簽的例子:
-
<EMBED type="application/x-java-applet;jpi-version=1.4.1" width="200"
-
height="200" align="baseline" code="XYZApp.class"
-
codebase="html/" model="models/HyaluronicAcid.xyz"
-
pluginspage="http://java.sun.com/j2se/1.4.1/download.html">
-
<NOEMBED>
-
No Java 2 SDK, Standard Edition v 1.4.1 support for APPLET!!
-
</NOEMBED>
-
</EMBED>
?
2.3?Object:clsid Tag
這是現在IE瀏覽器中推薦的用來嵌入Applet的標簽,如下面的例子所示。
這個標簽中的URI以“clsid”開始,只有IE瀏覽器支持這個屬性,其他瀏覽器都不支持。URI以“clsid”開始,表明這是一個 ActiveX控件,只有Windows中的IE才識別的屬性,代表注冊表中一個注冊的ActiveX類,“CAFEEFAC- 0014-0002-0000-ABCDEFFEDCBA”是SUN JRE安裝時在Windows中注冊的,代表SUN Java Plug-in 1.4.2。因此當IE解析到示例中的標簽時,會通過注冊表,查找到Java Plug-in,然后啟動JRE,在當前位置渲染這個Applet。另外一個clsid值:“8AD9C840-044E-11D1- B3E9-00805F499D93”,代表當前最新的JRE版本。
“codebase”屬性指定了一個特定版本JRE的下載地址,當客戶端機器上沒有安裝Java Plug-in時,會自動從這個地址下載安裝Java Plug-in。
“scriptable”屬性用于指定Applet示例是否能與頁面中的JavaScript交互。
這個標簽功能比較豐富,可以通過Param標簽為Applet傳遞參數、設置需要的JDK版本、指定自動下載JRE的路徑等。在IE中嵌入 Applet時,都要使用這個標簽。
下面是這個標簽的示例:
-
<OBJECT classid="clsid:CAFEEFAC-0014-0002-0000-ABCDEFFEDCBA"
-
width="200" height="200" align="baseline"
-
codebase= http://java.sun.com/products/plugin/autodl/jinstall-1_4_2-windows-i 586.cab#Version=1,4,2,0">
-
<PARAM name="code" value="XYZApp.class">
-
<PARAM name="codebase" value="html/">
-
<PARAM name="type" value="application/x-java-applet;jpi-version=1.4.2">
-
<PARAM name="model" value="models/HyaluronicAcid.xyz">
-
<PARAM name="scriptable" value="true">
-
No Java 2 SDK, Standard Edition v 1.4.2 support for APPLET!!
-
</OBJECT>
2.4?Object:java Tag
這是當前的W3C規范推薦的在瀏覽器中嵌入Applet的方式,除IE外的大多數瀏覽器的當前版本都能夠支持,包括Netscape Navigator、Firefox等,并且不受操作系統平臺的限制。URI以“java”開始,表明這里嵌入的是一個Java Applet,瀏覽器會啟動Java Plug-in來渲染這個Applet對象。如果客戶端沒有安裝Java Plug-in,瀏覽器會自動到Sun的站點上下載和安裝最新的Java Plug-in。
下面是這個標簽的示例:
-
<OBJECT classid="java:Sample2.class"
-
type="application/x-java-applet"
-
archive="Sample2.jar"
-
height="300" width="450" >
-
<PARAM name="model" value="models/HyaluronicAcid.xyz">
-
</ OBJECT>
3?同時支持多種瀏覽器的嵌入方式
通過上面的介紹可以看到,已有的幾種在頁面中嵌入Applet的方式,都只能適應特定的瀏覽器。對于幾種常用的瀏覽器,如IE、 Netscape Navigator、Firefox等,沒有一種方式能夠同時適應。必須要做一項特殊處理,才能使同一段HTML代碼能夠適應多種瀏覽器。下面介紹幾種方法。
3.1?組合Object:clsid、 Embed
如下面的示例所示,把Embed標簽用Comment標簽包含起來,放在Object標簽內部。IE在解釋Object標簽時,會忽略 Comment標簽內的內容。而Netscape Navigator不能識別clsid、不能識別Comment標簽,它會忽略忽略外層的Object標簽和Comment標簽,而只看到Embed標簽的內容。這樣,這段代碼可以同時適應IE和Netscape Navigator兩種瀏覽器。
示例:
-
<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
-
width="200" height="200" align="baseline"
-
codebase="http://java.sun.com/products/plugin/1.4/jinstall-14-win32.cab#Version=1,4,0,mn">
-
<PARAM NAME="code" VALUE="XYZApp.class">
-
<PARAM NAME="codebase" VALUE="html/">
-
<PARAM NAME="type" VALUE="application/x-java-applet;jpi-version=1.4">
-
<PARAM NAME="model" VALUE="models/HyaluronicAcid.xyz">
-
<PARAM NAME="scriptable" VALUE="true">
-
<COMMENT>
-
<EMBED type="application/x-java-applet;jpi-version=1.4" width="200"
-
height="200" align="baseline" code="XYZApp.class"
-
codebase="html/" model="models/HyaluronicAcid.xyz"
-
pluginspage="http://java.sun.com/j2se/1.4/download.html">
-
<NOEMBED>
-
No Java 2 SDK, Standard Edition v 1.4 support for APPLET!!
-
</NOEMBED>
-
</EMBED>
-
</COMMENT>
-
</OBJECT>
3.2?利用IE的條件注釋
IE識別如下樣式的條件注釋(Conditional Comments):
?<!--[if !IE]>
??非IE 瀏覽器時的代碼
?<![endif]-->
這個條件注釋只有IE識別,其他瀏覽器會把這兩行作為普通的HTML注釋忽略。因此,可以用下面的形式來適應所有的瀏覽器:
-
<!--[if !IE]> Firefox and others will use outer object -->
-
<object classid="java:Sample2.class"
-
type="application/x-java-applet"
-
archive="Sample2.jar"
-
height="300" width="450" >
-
<!--<![endif]-->
-
<!-- MSIE (Microsoft Internet Explorer) will use inner object -->
-
<object classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
-
codebase="http://java.sun.com/update/1.5.0/jinstall-1_5_0-windows-i586.cab"
-
height="300" width="450" >
-
<param name="code" value="Sample2" />
-
<param name="archive" value="Sample2.jar" />
-
<strong>
-
This browser does not have a Java Plug-in.
-
<br />
-
<a href="http://java.sun.com/products/plugin/downloads/index.html">
-
Get the latest Java Plug-in here.
-
</a>
-
</strong>
-
</object>
-
<!--[if !IE]> close outer object -->
-
</object>
-
<!--<![endif]-->
對于IE瀏覽器,它會忽略條件注釋之間的代碼,因此只會看到<object classid="clsid:..這個標簽內的內容。對于非IE的其他瀏覽器,會忽略HTML注釋,并且不會解釋clsid這個屬性,因此也會忽略& lt;object classid="clsid:..>…</object>之間的內容,也就是只會看到<object classid="java:…的內容。
這種方法可以適應所有的瀏覽器。
3.3?利用JavaScript
各種主流瀏覽器的當前版本都能夠支持JavaScript,因此我們可以用JavaScript來判斷瀏覽器的版本,然后輸出合適的HTML代碼。這種方式能支持大多數主流的瀏覽器,如IE、Netscape Navigator、Firefox等。
示例如下:
-
<script language="Javascript">
-
var _app = navigator.appName;
-
if (_app == 'Netscape') {
-
document.write('<embed code="Applet1.class"',
-
'width="200"',
-
'height="200"', 'type="application/x-java-applet;version=1.5.0">');
-
}
-
else if (_app == 'Microsoft Internet Explorer') {
-
document.write('<OBJECT ',
-
'classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"',
-
'width="200"',
-
'height="200">',
-
'<PARAM name="code" value="Applet1.class">',
-
'</OBJECT>');
-
}
-
else {
-
document.write('<p>Sorry, unsupported browser.</p>');
-
}
-
</script>