下一代Java Applet插件技術(shù)第一部分
Java SE 6對(duì)Java桌面應(yīng)用進(jìn)行較大的升級(jí),并啟動(dòng)了Java SE 6 Update N計(jì)劃,該計(jì)劃旨在簡(jiǎn)化JRE的大小,增進(jìn)用戶(hù)的安裝體驗(yàn),并提供了一個(gè)新的Applet瀏覽器插件,該插件將會(huì)隨Java SE 6 Update 10發(fā)布。本文全面介紹了這個(gè)新插件的關(guān)鍵特性,并以NASA的World Wind為例介紹了該插件的應(yīng)用。
Java Applet回來(lái)了!
為了在網(wǎng)絡(luò)中傳遞你的程序,是時(shí)候再次考慮Java Applet技術(shù)了。下一代Java插件技術(shù)以一種不同的,比過(guò)去更高效、更可靠的途徑來(lái)運(yùn)行Applet?,F(xiàn)在你可以獲得如下好處:
增強(qiáng)的可靠性
改進(jìn)的用戶(hù)體驗(yàn)
在后臺(tái)啟動(dòng)Applet
內(nèi)建的JNLP支持
針對(duì)每個(gè)Applet的命令行參數(shù)
堆內(nèi)存大小,Java 2D API加速選項(xiàng)
改進(jìn)的Java/JavaScript程序設(shè)計(jì)語(yǔ)言集成
改進(jìn)的Windows Vista支持
簽名的Applet現(xiàn)在可以在Internet Explorer的保護(hù)模式中正常運(yùn)行
下一代Java插件提供了一種完全重新設(shè)計(jì)的架構(gòu),它將出現(xiàn)在Java SE 6 Update 10中。該插件為運(yùn)行在網(wǎng)絡(luò)瀏覽器中的Applet提供了強(qiáng)大的新功能,它以向后兼容的方式改進(jìn)了整個(gè)Applet的可靠性及功能。
下一代Java插件最有意義的新特性是它內(nèi)建支持通過(guò)JNLP文件啟動(dòng)Applet。使用JNLP文件格式作為Applet的描述符就能允許Applet馬上復(fù)用之前為Java Web Start應(yīng)用所寫(xiě)的JNLP擴(kuò)展。
執(zhí)行Applet的新途徑
執(zhí)行Applet的新途徑在結(jié)構(gòu)上與Java Web Start技術(shù)相似,但與瀏覽器整合的更為緊密。 Applet不在運(yùn)行于網(wǎng)絡(luò)瀏覽器內(nèi)的JVM中,而是會(huì)啟動(dòng)一個(gè)獨(dú)立的JVM進(jìn)程去運(yùn)行Applet。默認(rèn)地,只有一個(gè)JVM將被啟動(dòng),但你也能啟動(dòng)多個(gè)JVM,并且可以為每個(gè)Applet都設(shè)置命令行參數(shù),所以你能影響堆內(nèi)存的大小或其它的要求。
Figure 1. Applet Architecture
在上圖中,云表示JVM實(shí)例。在瀏覽器內(nèi)有一個(gè)小的,headless JVM被用于管理一個(gè)或多個(gè)客戶(hù)端JVM之間的連接,這些JVM運(yùn)行著Applet。在該圖中,Duke表示Applet。其中,一個(gè)JVM實(shí)例運(yùn)行著兩個(gè)Applet,另一個(gè)運(yùn)行著一個(gè)Applet。
Applet直接從JNLP文件啟動(dòng),它使用的JNLP文件與Java Web Start軟件使用的描述符文件相同,并且允許使用比典型的"archive","code"和"cache_archive"更為強(qiáng)大的參數(shù)。
新的插件提供了:
能夠訪問(wèn)之前僅由Java Web Start軟件專(zhuān)用的高級(jí)JNLP擴(kuò)展。之前有少部分參數(shù)能夠使用,但有一些限制,現(xiàn)在這些限制則被去除。
通過(guò)Applet訪問(wèn)JNLP API。
支持PersistenceService和DownloadService。
能夠控制堆內(nèi)存大小,命令行參數(shù),JRE版本選擇和自動(dòng)下載。你具有Java Web Start軟件所擁有的相同功能。
現(xiàn)在你就可以在Web頁(yè)面中使用像下面這樣的語(yǔ)句了:
- <applet width=”500” height=”500”>
- <param name=”jnlp_href” value=”my_applet.jnlp”>
- </applet>
調(diào)用Applet生命周期方法init,start,stop和destroy會(huì)更為確定,并且已經(jīng)改進(jìn)了跨瀏覽器行為。完全支持Applet類(lèi)裝載器緩存,遺留的Applet生命周期及對(duì)向后兼容性的需求,并且這些行為都已得到了改進(jìn)。
Applet運(yùn)行的就像一個(gè)由Java Web Start啟動(dòng)的應(yīng)用。參數(shù)jnlp_href在Web頁(yè)面和Applet的JNLP描述之間起到了橋接的作用。在如寬度與高度這樣的特定方面,Applet標(biāo)簽與JNLP文件具有重疊的機(jī)制。
一般地,你應(yīng)該使用Deployment Toolkit,這也是一個(gè)出現(xiàn)在Java SE 6 Update 10中的新工具,它能自動(dòng)地為Applet標(biāo)簽生成HTML。部署建議指南展示了如何使用Deployment Toolkit簡(jiǎn)便地發(fā)布Applet。
配置Applet:
現(xiàn)在也能更為簡(jiǎn)單地在多個(gè)方面來(lái)配置Applet,包括堆內(nèi)存大小,需要被使用的Java版本,類(lèi)加載器緩存,邊界,及其它。
<applet>與JNLP文件在針對(duì)某些參數(shù)時(shí)有重疊的機(jī)制。這些沖突可以用如下方法解決:
width and height:這些屬性將總是從<applet>,而不是JNLP文件,中獲取。這是假設(shè)瀏覽器知道Applet在Web頁(yè)面上應(yīng)該顯示多大,也只有瀏覽器才能支持相對(duì)于頁(yè)面的寬度與高度(例如,width="50%")。
codebase:如果JNLP文件在<jnlp>標(biāo)簽中指定了一個(gè)絕對(duì)的codebase,那么就使用它。否則,將使用在codebase handling一節(jié)中描述的規(guī)則進(jìn)行組織。
code:當(dāng)指定了jnlp_href參數(shù),Applet的主類(lèi)名將從main-class參數(shù)換成JNLP文件中的applet-desc標(biāo)簽,并且code屬性會(huì)被忽略。注意,該特性允許你為經(jīng)典Java插件寫(xiě)一個(gè)擁有反饋的Applet標(biāo)簽,但在新的Java插件中,該標(biāo)簽可使用更高級(jí)的功能。請(qǐng)見(jiàn)下面的"兼容性"一節(jié)。
任何一個(gè)由<param> 標(biāo)簽指定的Applet參數(shù)將與JNLP文件中指定的參數(shù)進(jìn)行合并。如果<applet>標(biāo)簽和JNLP文件都指定了同一個(gè)參數(shù),<applet>標(biāo)簽中的版本將覆蓋JNLP文件中的版本,除了參數(shù)java_arguments和java_version。
新的java_arguments和java_version參數(shù)在JNLP Applet中是不必要的。會(huì)替換為通過(guò)JNLP文件請(qǐng)求JRE版本或向JVM傳遞參數(shù)的機(jī)制。所以,命令行參數(shù)和JNLP文件請(qǐng)求的JRE版本將會(huì)覆蓋HTML中為Applet指定的這些值。
特定的參數(shù),例如image,boxbgcolor等等,在Applet的啟動(dòng)過(guò)程中是有用的。在HTML而不是JNLP文件中指定這些參數(shù)可能更好些,以便于在加載Web頁(yè)面時(shí)就可立即獲取它們,而不用再等到單獨(dú)下載JNLP文件之后。
過(guò)去,通過(guò)Java控制面板設(shè)置***堆內(nèi)存是有限制的。在新的Java插件中,這些限制被取消?,F(xiàn)在Applet可以像命令行應(yīng)用那樣使用大量堆空間。
指定一個(gè)比默認(rèn)值大的堆空間:
- <APPLET archive="my_applet.jar" code="MyApplet" width="300" height="300">
- <PARAM name="java_arguments" value="-Xmx128m">
- </APPLET>
指定一個(gè)非默認(rèn)大小的堆內(nèi)存以及一個(gè)Java 2D硬件加速器選項(xiàng),該選項(xiàng)常通過(guò)JOGL使用OpenGL應(yīng)用于Applet。
- <APPLET archive="my_applet.jar" code="MyApplet" width="300" height="300">
- <PARAM name="java_arguments" value="-Xmx256m -Dsun.java2d.noddraw=true">
- </APPLET>
如果你喜歡,一個(gè)Applet可強(qiáng)制進(jìn)入一個(gè)屬于它自己的JVM實(shí)例,而與所有其它的Applet隔離開(kāi):
- <param name=”separate_jvm” value=”true” />
當(dāng)把某些桌面應(yīng)用移植到Web瀏覽器時(shí),這就有用了。
你也能使特定的Applet運(yùn)行在特定版本的JRE上,如下所示:
- <j2se version=”1.4+” >
- <j2se version=”1.5*” >
當(dāng)想針對(duì)特定版本的JRE,或Applet取代早期版本的選擇機(jī)制(如同IE瀏覽器中的CLSID),進(jìn)行質(zhì)量測(cè)評(píng)時(shí),該方法就很有用了。如果請(qǐng)求了一個(gè)非常老的JRE版本,就會(huì)強(qiáng)制執(zhí)行限制;如果Applet試圖加載未簽名的代碼,將會(huì)提示用戶(hù)。
注意,因?yàn)橹С諮NLP的Java插件是在Java SE 6 Update 10中才***出現(xiàn)的,所以指定像“1.4+”這樣的版本基本上沒(méi)有意義的。當(dāng)需要“1.7+”時(shí),這才有意義。
另外,你可以在JNLP文件中使用<update>標(biāo)簽來(lái)顯著降低第二次及接下來(lái)各次啟動(dòng)的時(shí)間。
- <update check=”background”>
在這種情況下,將使用緩存中已有的Applet程序,并且在后臺(tái)下載該應(yīng)用的更新版本。在下次啟動(dòng)時(shí),就會(huì)使用新版本。
新的插件也能更好地對(duì)圖像進(jìn)行定制,在Applet被加載之前會(huì)展示該圖像。image參數(shù)會(huì)以支持動(dòng)畫(huà)GIF文件作為目標(biāo),Java Plug-in Developers' Guide的Special Attributes一節(jié)對(duì)此有描述。此外,現(xiàn)也支持如下新的參數(shù):
boxborder
一個(gè)布爾型參數(shù),用于指定在Applet被加載之前是否在Applet區(qū)域的邊緣繪制一個(gè)寬度一象素的邊框。默認(rèn)為true。我們建議將該值設(shè)置為false,特別是將一個(gè)動(dòng)畫(huà)GIF用作加載期圖像時(shí),以避免可能的閃爍。
centerimage
一個(gè)布爾型參數(shù),用于指定是否將加載期圖像在Applet區(qū)域內(nèi)居中顯示,而不是從左上角起始。默認(rèn)為false。
使用參數(shù)boxborder和centerimage的例子:
- <APPLET archive="large_archive.jar"
- code="MyApplet"
- width="300" height="300">
- <!-- Use an animated GIF as an indeterminate progress bar
- while the applet is loading -->
- <PARAM NAME="image" VALUE="animated_gif.gif">
- <!-- Turn off the box border for better blending with the
- surrounding web page -->
- <PARAM NAME="boxborder" VALUE="false">
- <!-- Center the image in the applet's area -->
- <PARAM NAME="centerimage" VALUE="true">
- </APPLET>
【編輯推薦】