下一代Java Applet插件技術(shù)第二部分
Java Applet運行的就像一個由Java Web Start啟動的應(yīng)用。參數(shù)jnlp_href在Web頁面和Java Applet的JNLP描述之間起到了橋接的作用。在如寬度與高度這樣的特定方面,Applet標(biāo)簽與JNLP文件具有重疊的機(jī)制。
一般地,你應(yīng)該使用Deployment Toolkit,這也是一個出現(xiàn)在Java SE 6 Update 10中的新工具,它能自動地為Applet標(biāo)簽生成HTML。部署建議指南展示了如何使用Deployment Toolkit簡便地發(fā)布Applet。
兼容性
現(xiàn)在可更容易維護(hù)向后兼容性。你可創(chuàng)建運行在更早Java插件版本上的程序,但僅需提供一個與jnlp_href參數(shù)一樣的格式完整的<applet>標(biāo)簽就可使用這些新特性了。早期版本的JRE會忽略jnlp_href參數(shù),轉(zhuǎn)而使用<applet>標(biāo)簽。新的Java插件技術(shù)將忽略archive和code參數(shù),而僅使用JNLP文件去啟動Applet。
World Wind Applet示例
由World Wind Java開發(fā)組創(chuàng)建的NASA World Wind Java Applet示例闡述了如果發(fā)布像NASA World Wind Java這樣的領(lǐng)先類庫。同樣地,也用示例說明了如何使用JavaScript在Web頁面中高效地整合HTML和Applet內(nèi)容。
Figure 2. NASA World Wind Applet
該Web頁面包含了關(guān)于喀斯喀特山脈的信息(要感謝維基百科),并且將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隨標(biāo)準(zhǔn)的World Wind Java發(fā)行包發(fā)布。如下所述,你可選擇編寫你自己的Applet類并將World Wind嵌入其中:
下面是WWJApplet.jnlp文件中相關(guān)的部分:
- <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的網(wǎng)站引用它,將其作為一個JNLP擴(kuò)展,這就使得許多不同的都嵌入了World Wind的應(yīng)用程序或Applet共享相同的jar文件。詳情請見下面的內(nèi)容。
為了它的硬件加速的3D圖形,World Wind Java使用了針對OpenGL API的Java綁定,JOGL。注意,JOGL JNLP擴(kuò)展僅使用一行代碼與應(yīng)用程序進(jìn)行結(jié)合。也要注意,在Windows平臺上,由于OpenGL API與DirectDraw/Direct3D API(該API用于Windows平臺默認(rèn)的Java 2D實現(xiàn))之間在驅(qū)動層面的沖突,需要指定系統(tǒng)參數(shù)-Dsun.java2d.noddraw=true。Windows平臺上所有使用JOGL的應(yīng)用程序與Applet程序都需要該系統(tǒng)參數(shù)。
Web頁面中的HTML鏈接調(diào)用JavaScript函數(shù),該函數(shù)會與Applet進(jìn)行交互并將其導(dǎo)向合適的山峰。下面是這些鏈接中的一個:
- <a href="javascript:gotoLocation(MOUNT_RAINIER);">Mount Rainier</a>
- (southeast of Tacoma, Washington)
當(dāng)點擊該鏈接后,將會調(diào)用JavaScript函數(shù)gotoLocation。該函數(shù)定義在同一個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字符串。將從這些字符串中解析出緯度,經(jīng)度及其它視覺信息,并將它們傳遞給Applet。 gotoLatLon方法是在WWJApplet類中定義的;上面的方法調(diào)用將起動一個JavaScript-to-Java調(diào)用,把參數(shù)從JavaScript引擎?zhèn)鹘oJava。World Wind Applet接收該通知,并將視點以動畫的方式切換到適當(dāng)?shù)牡胤?。注意,gotoLatLon方法會迅速地返回,以便瀏覽器不必等待它的完成;該動畫會在一個單獨的Java線程中運行。
Figure 3. World Wind Applet with Mount St. Helen's Clicked
如上所述,將World Wind Java集成到你的應(yīng)用程序或Applet程序中的最好方法是將其作為一個JNLP擴(kuò)展。這允許很多來自網(wǎng)絡(luò)的集成了World Wind Java的應(yīng)用程序或Applet程序能夠共享World Wind代碼資源。為了引用World Wind JNLP擴(kuò)展,你需將下面的語句行加入到你的應(yīng)用程序或Applet程序的JNLP文件中的<resources>部分:
<extension name="worldwind" href="http://worldwind.arc.nasa.gov/java/0.4.1/webstart/worldwind.jnlp"/>
<extension name="jogl"
href="http://download.java.net/media/jogl/builds/archive/jsr-231-webstart-current/jogl.jnlp"/>
注意,World Wind擴(kuò)展JNLP是區(qū)分版本的,所以你需參考World Wind文檔或訪問論壇去找到你的JNLP會引用到的擴(kuò)展的最新版本。World Wind Central是一個關(guān)于World Wind最新信息的有用資源。
class MyWWJApplet extends WWJApplet {}
將World Wind作為一個擴(kuò)展使用就意味著你不能將WWJApplet直接作為你的main-class使用。由于JNLP文件格式的語義,主jar (main="true")必須定義在主JNLP文件中。但很容易就能適應(yīng)該限制,你可簡單地創(chuàng)建你自己的WWJApplet子類(稱之為MyWWJApplet),而它并不做任何事情:
將worldwind.jar置于classpath中,并編譯上述類,然后將該類放入它自己的jar文件中。引入這個jar作為你的主jar,MyWWJApplet就成為了你的main-class,然后將其作為JNLP擴(kuò)展引入到World Wind中。
結(jié)論
介紹了Java插件對JNLP的支持,這為Applet的發(fā)布提供了很多新的可能,這對在瀏覽器內(nèi)外發(fā)布Java內(nèi)容的方法的統(tǒng)一又進(jìn)了一大步。Applet自從它們起始已過了很長的時間,現(xiàn)在隨著對JNLP的支持,它們會比以往更快,也更易于定制。
【編輯推薦】