程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 下一代Java Applet插件技術

下一代Java Applet插件技術

編輯:關於JAVA

Applet回來了!

為了在網絡中傳遞你的程序,是時候再次考慮Java Applet技術了。下一代Java插件技術以一種不同的 ,比過去更高效、更可靠的途徑來運行Applet。現在你可以獲得如下好處:

增強的可靠性

改進的用戶體驗

在後台啟動Applet

內建的JNLP支持

針對每個Applet的命令行參數

堆內存大小,Java 2D API加速選項

改進的Java/JavaScript程序設計語言集成

改進的Windows Vista支持

簽名的Applet現在可以在Internet Explorer的保護模式中正常運行

下一代Java插件提供了一種完全重新設計的架構,它將出現在Java SE 6 Update 10中。該插件為運行 在網絡浏覽器中的Applet提供了強大的新功能,它以向後兼容的方式改進了整個Applet的可靠性及功能。

下一代Java插件最有意義的新特性是它內建支持通過JNLP文件啟動Applet。使用JNLP文件格式作為 Applet的描述符就能允許Applet馬上復用之前為Java Web Start應用所寫的JNLP擴展。

執行Applet的新途徑

執行Applet的新途徑在結構上與Java Web Start技術相似,但與浏覽器整合的更為緊密。Applet不在 運行於網絡浏覽器內的JVM中,而是會啟動一個獨立的JVM進程去運行Applet。默認地,只有一個JVM將被 啟動,但你也能啟動多個JVM,並且可以為每個Applet都設置命令行參數,所以你能影響堆內存的大小或 其它的要求。

Figure 1. Applet Architecture

在上圖中,雲表示JVM實例。在浏覽器內有一個小的,headless JVM被用於管理一個或多個客戶端JVM 之間的連接,這些JVM運行著Applet。在該圖中,Duke表示Applet。其中,一個JVM實例運行著兩個Applet ,另一個運行著一個Applet。

Applet直接從JNLP文件啟動,它使用的JNLP文件與Java Web Start軟件使用的描述符文件相同,並且 允許使用比典型的"archive","code"和"cache_archive"更為強大的參數。

新的插件提供了:

能夠訪問之前僅由Java Web Start軟件專用的高級JNLP擴展。之前有少部分參數能夠使用,但有一些 限制,現在這些限制則被去除。

通過Applet訪問JNLP API。

支持PersistenceService和DownloadService。

能夠控制堆內存大小,命令行參數,JRE版本選擇和自動下載。你具有Java Web Start軟件所擁有的相 同功能。

現在你就可以在Web頁面中使用像下面這樣的語句了:

<applet width=”500” height=”500”>
  <param name=”jnlp_href” value= ”my_applet.jnlp”>
</applet>

調用Applet生命周期方法init,start,stop和destroy會更為確定,並且已經改進了跨浏覽器行為。 完全支持Applet類裝載器緩存,遺留的Applet生命周期及對向後兼容性的需求,並且這些行為都已得到了 改進。

Applet運行的就像一個由Java Web Start啟動的應用。參數jnlp_href在Web頁面和Applet的JNLP描述 之間起到了橋接的作用。在如寬度與高度這樣的特定方面,Applet標簽與JNLP文件具有重疊的機制。

一般地,你應該使用Deployment Toolkit,這也是一個出現在Java SE 6 Update 10中的新工具,它能 自動地為Applet標簽生成HTML。部署建議指南展示了如何使用Deployment Toolkit簡便地發布Applet。

配置Applet

現在也能更為簡單地在多個方面來配置Applet,包括堆內存大小,需要被使用的Java版本,類加載器 緩存,邊界,及其它。

<applet>與JNLP文件在針對某些參數時有重疊的機制。這些沖突可以用如下方法解決:

width and height:這些屬性將總是從<applet>,而不是JNLP文件,中獲取。這是假設浏覽器 知道Applet在Web頁面上應該顯示多大,也只有浏覽器才能支持相對於頁面的寬度與高度(例如, width="50%")。

codebase:如果JNLP文件在<jnlp>標簽中指定了一個絕對的codebase,那麼就使用它。否則, 將使用在codebase handling一節中描述的規則進行組織。

code:當指定了jnlp_href參數,Applet的主類名將從main-class參數換成JNLP文件中的applet-desc 標簽,並且code屬性會被忽略。注意,該特性允許你為經典Java插件寫一個擁有反饋的Applet標簽,但在 新的Java插件中,該標簽可使用更高級的功能。請見下面的"兼容性"一節。

任何一個由<param>標簽指定的Applet參數將與JNLP文件中指定的參數進行合並。如果 <applet>標簽和JNLP文件都指定了同一個參數,<applet>標簽中的版本將覆蓋JNLP文件中的 版本,除了參數java_arguments和java_version。

新的java_arguments和java_version參數在JNLP Applet中是不必要的。會替換為通過JNLP文件請求 JRE版本或向JVM傳遞參數的機制。所以,命令行參數和JNLP文件請求的JRE版本將會覆蓋HTML中為Applet 指定的這些值。

特定的參數,例如image,boxbgcolor等等,在Applet的啟動過程中是有用的。在HTML而不是JNLP文件 中指定這些參數可能更好些,以便於在加載Web頁面時就可立即獲取它們,而不用再等到單獨下載JNLP文 件之後。

過去,通過Java控制面板設置最大堆內存是有限制的。在新的Java插件中,這些限制被取消。現在 Applet可以像命令行應用那樣使用大量堆空間。

指定一個比默認值大的堆空間:

<APPLET archive="my_applet.jar" code="MyApplet" width="300" height="300">

<PARAM name="java_arguments" value="-Xmx128m">

</APPLET>指定一個非默認大小的堆內存以及一個Java 2D硬件加速器選項,該選項常通過JOGL 使用OpenGL應用於Applet。

<APPLET archive="my_applet.jar" code="MyApplet" width="300" height="300">
   <PARAM name="java_arguments" value="-Xmx256m - Dsun.java2d.noddraw=true">
</APPLET>

如果你喜歡,一個Applet可強制進入一個屬於它自己的JVM實例,而與所有其它的Applet隔離開:

<param name=”separate_jvm” value=”true” />當把某些桌面應用移植到Web浏覽器時,這 就有用了。

你也能使特定的Applet運行在特定版本的JRE上,如下所示:

<j2se version=”1.4+” >

<j2se version=”1.5*” >當想針對特定版本的JRE,或Applet取代早期版本的選擇機制(如同 IE浏覽器中的CLSID),進行質量測評時,該方法就很有用了。如果請求了一個非常老的JRE版本,就會強 制執行限制;如果Applet試圖加載未簽名的代碼,將會提示用戶。

注意,因為支持JNLP的Java插件是在Java SE 6 Update 10中才首次出現的,所以指定像“1.4+”這樣 的版本基本上沒有意義的。當需要“1.7+”時,這才有意義。

另外,你可以在JNLP文件中使用<update>標簽來顯著降低第二次及接下來各次啟動的時間。

<update check=”background”>在這種情況下,將使用緩存中已有的Applet程序,並且在後台 下載該應用的更新版本。在下次啟動時,就會使用新版本。

新的插件也能更好地對圖像進行定制,在Applet被加載之前會展示該圖像。image參數會以支持動畫 GIF文件作為目標,Java Plug-in Developers' Guide的Special Attributes一節對此有描述。此外,現 也支持如下新的參數:

boxborder

一個布爾型參數,用於指定在Applet被加載之前是否在Applet區域的邊緣繪制一個寬度一象素的邊框 。默認為true。我們建議將該值設置為false,特別是將一個動畫GIF用作加載期圖像時,以避免可能的閃 爍。

centerimage

一個布爾型參數,用於指定是否將加載期圖像在Applet區域內居中顯示,而不是從左上角起始。默認 為false。

使用參數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>

兼容性

現在可更容易維護向後兼容性。你可創建運行在更早Java插件版本上的程序,但僅需提供一個與 jnlp_href參數一樣的格式完整的<applet>標簽就可使用這些新特性了。早期版本的JRE會忽略 jnlp_href參數,轉而使用<applet>標簽。新的Java插件技術將忽略archive和code參數,而僅使用 JNLP文件去啟動Applet。

World Wind Applet示例

由World Wind Java開發組創建的NASA World Wind Java Applet示例闡述了如果發布像NASA World Wind Java這樣的領先類庫。同樣地,也用示例說明了如何使用JavaScript在Web頁面中高效地整合HTML和 Applet內容。

Figure 2. NASA World Wind Applet

該Web頁面包含了關於喀斯喀特山脈的信息(要感謝維基百科),並且將World Wind Java作為一個 Applet嵌入其中,以圖示該山脈中各山的位置。

<applet id="wwjApplet" width=600 height=380
   code="gov.nasa.worldwind.examples.applet.WWJApplet"
   archive="BackwardCompatibility.jar">
  <param name="jnlp_href" value="WWJApplet.jnlp">
</applet>

WWJApplet隨標准的World Wind Java發行包發布。如下所述,你可選擇編寫你自己的Applet類並將 World Wind嵌入其中:

下面是WWJApplet.jnlp文件中相關的部分:

<jnlp href="WWJApplet.jnlp">
<resources os="Windows">
<property name="sun.java2d.noddraw" value="true"/>
</resources>
<resources>
<j2se href="http://java.sun.com/products/autodl/j2se" version="1.4+"/>
<jar href="worldwind.jar" main="true" />
<extension name="jogl"
href="http://download.java.net/media/jogl/builds/archive/jsr-231-webstart- current/jogl.jnlp" />
</resources>
<applet-descname="WWJ Applet"
   main-class="gov.nasa.worldwind.examples.applet.WWJApplet"
  <!-- Overwritten by the surrounding web page -->
  width="100"
  height="100">
</applet- desc>
</jnlp>

注意幾點:

在本例中,worldwind.jar作為主類使用。理想地,從NASA的網站引用它,將其作為一個JNLP擴展,這 就使得許多不同的都嵌入了World Wind的應用程序或Applet共享相同的jar文件。詳情請見下面的內容。

為了它的硬件加速的3D圖形,World Wind Java使用了針對OpenGL API的Java綁定,JOGL。注意,JOGL JNLP擴展僅使用一行代碼與應用程序進行結合。也要注意,在Windows平台上,由於OpenGL API與 DirectDraw/Direct3D API(該API用於Windows平台默認的Java 2D實現)之間在驅動層面的沖突,需要指定 系統參數-Dsun.java2d.noddraw=true。Windows平台上所有使用JOGL的應用程序與Applet程序都需要該系 統參數。

Web頁面中的HTML鏈接調用JavaScript函數,該函數會與Applet進行交互並將其導向合適的山峰。下面 是這些鏈接中的一個:

<a href="javascript:gotoLocation(MOUNT_RAINIER);">Mount Rainier</a>
   (southeast of Tacoma, Washington)

當點擊該鏈接後,將會調用JavaScript函數gotoLocation。該函數定義在同一個Web頁面中:

function gotoLocation(locationString) {
  var params = locationString.split (';');
  if(params.length == 3) // Lat/lon
  getWWJApplet().gotoLatLon (parseFloat(params[1]),
  parseFloat(params[2]));
  
}

Web頁面HTML中的山峰位置將被解碼為JavaScript字符串。將從這些字符串中解析出緯度,經度及其它 視覺信息,並將它們傳遞給Applet。 gotoLatLon方法是在WWJApplet類中定義的;上面的方法調用將起動 一個JavaScript-to-Java調用,把參數從JavaScript引擎傳給Java。World Wind Applet接收該通知,並 將視點以動畫的方式切換到適當的地方。注意,gotoLatLon方法會迅速地返回,以便浏覽器不必等待它的 完成;該動畫會在一個單獨的Java線程中運行。

Figure 3. World Wind Applet with Mount St. Helen's Clicked

如上所述,將World Wind Java集成到你的應用程序或Applet程序中的最好方法是將其作為一個JNLP擴 展。這允許很多來自網絡的集成了World Wind Java的應用程序或Applet程序能夠共享World Wind代碼資 源。為了引用World Wind JNLP擴展,你需將下面的語句行加入到你的應用程序或Applet程序的JNLP文件 中的<resources>部分:

<extension name="worldwind" 

href="http://worldwind.arc.nasa.gov/java/0.4.1/webstart/worldwind.jnlp"/>
<extensio n name="jogl"
  href="http://download.java.net/media/jogl/builds/archive/jsr-231- webstart-current/jogl.jnlp"/>

注意,World Wind擴展JNLP是區分版本的,所以你需參考World Wind文檔或訪問論壇去找到你的JNLP 會引用到的擴展的最新版本。World Wind Central是一個關於World Wind最新信息的有用資源。

將World Wind作為一個擴展使用就意味著你不能將WWJApplet直接作為你的main-class使用。由於JNLP 文件格式的語義,主jar (main="true")必須定義在主JNLP文件中。但很容易就能適應該限制,你可簡單 地創建你自己的WWJApplet子類(稱之為MyWWJApplet),而它並不做任何事情:

class MyWWJApplet extends WWJApplet {}將worldwind.jar置於classpath中,並編譯上述類,然後 將該類放入它自己的jar文件中。引入這個jar作為你的主jar,MyWWJApplet就成為了你的main-class,然 後將其作為JNLP擴展引入到World Wind中。

結論

介紹了Java插件對JNLP的支持,這為Applet的發布提供了很多新的可能,這對在浏覽器內外發布Java 內容的方法的統一又進了一大步。Applet自從它們起始已過了很長的時間,現在隨著對JNLP的支持,它們 會比以往更快,也更易於定制。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved