下一代Java Applet插g技?/span>
Java SE 6对Java桌面应用q行较大的升U,q启动了Java SE 6 Update N计划Q该计划旨在化JRE的大,增进用户的安装体验,q提供了一个新的Applet览器插Ӟ该插件将会随Java SE 6 Update 10发布?a >本文全面介绍了这个新插g的关键特性,q以NASA?a >World WindZ介绍了该插g的应用?2008.07.15最后更?
Applet回来了!
Z在网l中传递你的程序,是时候再ơ考虑Java Applet技术了?a >下一代Java插g技?/a>以一U不同的Q比q去更高效、更可靠的途径来运行Applet。现在你可以获得如下好处Q?br />
-
增强的可靠?/span>
-
改进的用户体?/span>
-
在后台启动Applet
-
内徏的JNLP支持
-
针对每个Applet的命令行参数
-
堆内存大,Java 2D API加速选项
-
改进的Java/JavaScriptE序设计语言集成
-
改进的Windows Vista支持
-
{的Applet现在可以在Internet Explorer的保护模式中正常q行
下一代Java插g提供了一U完全重新设计的架构Q它出现在Java SE 6 Update 10中。该插g行在|络览器中的Applet提供了强大的新功能,它以向后兼容的方式改q了整个Applet的可靠性及功能?br />
下一代Java插g最有意义的新特性是它内建支持通过JNLP文g启动Applet。用JNLP文g格式作ؓApplet的描q符p允许Applet马上复用之前为Java Web Start应用所写的JNLP扩展?br />
执行Applet的新途径
执行Applet的新途径在结构上与Java Web Start技术相|但与览器整合的更ؓ紧密。Applet不在q行于网l浏览器内的JVM中,而是会启动一个独立的JVMq程去运行Applet。默认地Q只有一个JVM被启动Q但你也能启动多个JVMQƈ且可以ؓ每个Applet都设|命令行参数Q所以你能媄响堆内存的大或其它的要求?br />

Figure 1. Applet Architecture
在上图中Q云表示JVM实例。在览器内有一个小的,headless JVM被用于管理一个或多个客户端JVM之间的连接,q些JVMq行着Applet。在该图中,Duke表示Applet。其中,一个JVM实例q行着两个AppletQ另一个运行着一个Applet?br />
Applet直接从JNLP文g启动Q它使用的JNLP文g与Java Web Start软g使用的描q符文g相同Qƈ且允怋用比典型?archive"Q?code"?cache_archive"更ؓ强大的参数?br />
新的插g提供了:
-
能够讉K之前仅由Java Web Start软g专用的高UJNLP扩展。之前有部分参数能够用,但有一些限Ӟ现在q些限制则被去除?/span>
-
通过Applet讉KJNLP API?/span>
-
支持PersistenceService和DownloadService?/span>
-
能够控制堆内存大,命o行参敎ͼJRE版本选择和自动下载。你hJava Web Start软g所拥有的相同功能?/span>
现在你就可以在Web面中用像下面q样的语句了Q?br />
<applet width=”500” height=”500”>
<param name=”jnlp_href” value=”my_applet.jnlp”>
</applet>
调用Applet生命周期ҎinitQstartQstop和destroy会更为确定,q且已经改进了跨览器行为。完全支持Appletc装载器~存Q遗留的Applet生命周期及对向后兼容性的需求,q且q些行ؓ都已得到了改q?br />
Appletq行的就像一个由Java Web Start启动的应用。参数jnlp_href在Web面和Applet的JNLP描述之间起到了桥接的作用。在如宽度与高度q样的特定方面,Applet标签与JNLP文gh重叠的机制?br />
一般地Q你应该使用Deployment ToolkitQ这也是一个出现在Java SE 6 Update 10中的新工P它能自动CؓApplet标签生成HTML?a >部v指南展示了如何用Deployment Toolkit便地发布Applet?br />
配置Applet
现在也能更ؓ单地在多个方面来配置AppletQ包括堆内存大小Q需要被使用的Java版本Q类加蝲器缓存,边界Q及其它?br />
<applet>与JNLP文g在针Ҏ些参数时有重叠的机制。这些冲H可以用如下Ҏ解决Q?br />
- width and heightQ这些属性将L?lt;applet>Q而不是JNLP文gQ中获取。这是假设浏览器知道Applet在Web面上应该显C多大,也只有浏览器才能支持相对于页面的宽度与高?例如Qwidth="50%")?/span>
-
codebaseQ如果JNLP文g?lt;jnlp>标签中指定了一个绝对的codebaseQ那么就使用它。否则,用在codebase handling一节中描述的规则进行组l?/span>
-
codeQ当指定了jnlp_href参数QApplet的主cd从main-class参数换成JNLP文g中的applet-desc标签Qƈ且code属性会被忽略。注意,该特性允怽为经典Java插g写一个拥有反馈的Applet标签Q但在新的Java插g中,该标{֏使用更高U的功能。请见下面的"兼容?一节?/span>
-
M一个由<param>标签指定的Applet参数与JNLP文g中指定的参数q行合ƈ。如?lt;applet>标签和JNLP文g都指定了同一个参敎ͼ<applet>标签中的版本覆盖JNLP文g中的版本Q除了参数java_arguments和java_version?/span>
-
新的java_arguments和java_version参数在JNLP Applet中是不必要的。会替换为通过JNLP文ghJRE版本或向JVM传递参数的机制。所以,命o行参数和JNLP文gh的JRE版本会覆盖HTML中ؓApplet指定的这些倹{?/span>
-
特定的参敎ͼ例如imageQboxbgcolor{等Q在Applet的启动过E中是有用的。在HTML而不是JNLP文g中指定这些参数可能更好些Q以便于在加载Web面时就可立卌取它们,而不用再{到单独下蝲JNLP文g之后?/span>
q去Q通过Java控制面板讄最大堆内存是有限制的。在新的Java插g中,q些限制被取消。现在Applet可以像命令行应用那样使用大量堆空间?br />
指定一个比默认值大的堆I间Q?br />
<APPLET archive="my_applet.jar" code="MyApplet" width="300" height="300">
<PARAM name="java_arguments" value="-Xmx128m">
</APPLET>
指定一个非默认大小的堆内存以及一个Java 2Dg加速器选项Q该选项帔R过JOGL使用OpenGL应用于Applet?br />
<APPLET archive="my_applet.jar" code="MyApplet" width="300" height="300">
<PARAM name="java_arguments" value="-Xmx256m -Dsun.java2d.noddraw=true">
</APPLET>
如果你喜Ƣ,一个Applet可强制进入一个属于它自己的JVM实例Q而与所有其它的Applet隔离开Q?br />
<param name=”separate_jvm” value=”true” />
当把某些桌面应用UL到Web览器时Q这有用了?br />
你也能特定的Appletq行在特定版本的JRE上,如下所C:
<j2se version=”1.4+”
>
<j2se version=”1.5*”
>
当想针对特定版本的JREQ或Applet取代早期版本的选择机制(如同IE览器中的CLSID)Q进行质量测评时Q该Ҏ很有用了。如果请求了一个非常老的JRE版本Q就会强制执行限Ӟ如果Applet试图加蝲未签名的代码Q将会提C用戗?br />
注意Q因为支持JNLP的Java插g是在Java SE 6 Update 10中才首次出现的,所以指定像“1.4+”q样的版本基本上没有意义的。当需?#8220;1.7+”Ӟq才有意义?br />
另外Q你可以在JNLP文g中?lt;update>标签来显著降低第二次及接下来各次启动的时间?br />
<update check=”background”>
在这U情况下Q将使用~存中已有的AppletE序Qƈ且在后台下蝲该应用的更新版本。在下次启动Ӟ׃使用新版本?br />
新的插g也能更好地对囑փq行定制Q在Applet被加载之前会展示该图像。image参数会以支持动画GIF文g作ؓ目标Q?a >Java Plug-in Developers' Guide?a >Special Attributes一节对此有描述。此外,C支持如下新的参数Q?br />
boxborder
一个布型参数Q用于指定在Applet被加载之前是否在Applet区域的边~绘制一个宽度一象素的边框。默认ؓtrue。我们徏议将该D|ؓfalseQ特别是一个动画GIF用作加蝲期图像时Q以避免可能的闪烁?br />
centerimage
一个布型参数Q用于指定是否将加蝲期图像在Applet区域内居中显C,而不是从左上角v始。默认ؓfalse?br />
使用参数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>
兼容?/span>
现在可更Ҏl护向后兼容性。你可创行在更早Java插g版本上的E序Q但仅需提供一个与jnlp_href参数一L格式完整?lt;applet>标签可使用q些新特性了。早期版本的JRE会忽略jnlp_href参数Q{而?lt;applet>标签。新的Java插g技术将忽略archive和code参数Q而仅使用JNLP文gd动Applet?br />
World Wind AppletCZ
由World Wind Java开发组创徏?a >NASA World Wind Java AppletCZ阐述了如果发布像NASA World Wind Javaq样的领先类库。同样地Q也用示例说明了如何使用JavaScript在Web面中高效地整合HTML和Applet内容?br />

Figure 2. NASA World Wind Applet
该Web面包含了关于喀斯喀特山脉的信息(要感谢维基百U?Qƈ且将World Wind Java作ؓ一个Applet嵌入其中Q以囄该山脉中各山的位|?br />
<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发行?/a>发布。如下所qͼ你可选择~写你自qAppletcdƈWorld Wind嵌入其中Q?br />
下面是WWJApplet.jnlp文g中相关的部分Q?br />
<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>
注意几点Q?br />
-
在本例中Qworldwind.jar作ؓȝ使用。理惛_Q从NASA的网站引用它Q将其作Z个JNLP扩展Q这׃得许多不同的都嵌入了World Wind的应用程序或Applet׃n相同的jar文g。详情请见下面的内容?/span>
-
Z它的g加速的3D囑ŞQWorld Wind Java使用了针对OpenGL API的Javal定Q?a >JOGL。注意,JOGL JNLP扩展仅用一行代码与应用E序q行l合。也要注意,在Windowsq_上,׃OpenGL API与DirectDraw/Direct3D API(该API用于Windowsq_默认的Java 2D实现)之间在驱动层面的冲突Q需要指定系l参?Dsun.java2d.noddraw=true。Windowsq_上所有用JOGL的应用程序与AppletE序都需要该pȝ参数?/span>
Web面中的HTML链接调用JavaScript函数Q该函数会与Appletq行交互q将其导向合适的山峰。下面是q些链接中的一个:
<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字符丌Ӏ将从这些字W串中解析出U度Q经度及其它视觉信息Qƈ它们传递给Applet?gotoLatLonҎ是在WWJAppletcM定义的;上面的方法调用将起动一个JavaScript-to-Java调用Q把参数从JavaScript引擎传给Java。World Wind Applet接收该通知Qƈ视点以动画的方式切换到适当的地斏V注意,gotoLatLonҎ会迅速地q回Q以便浏览器不必{待它的完成Q该动画会在一个单独的JavaU程中运行?br />

Figure 3. World Wind Applet with Mount St. Helen's Clicked
如上所qͼWorld Wind Java集成C的应用程序或AppletE序中的最好方法是其作ؓ一个JNLP扩展。这允许很多来自|络的集成了World Wind Java的应用程序或AppletE序能够׃nWorld Wind代码资源。ؓ了引用World Wind JNLP扩展Q你需下面的语句行加入到你的应用E序或AppletE序的JNLP文g中的<resources>部分Q?br />
<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"/>
注意QWorld Wind扩展JNLP是区分版本的Q所以你需参考World Wind文档或访?a >论坛LC的JNLP会引用到的扩展的最新版本?a >World Wind Central是一个关于World Wind最C息的有用资源?br />
World Wind作ؓ一个扩展用就意味着你不能将WWJApplet直接作ؓ你的main-class使用。由于JNLP文g格式的语义,主jar (main="true")必须定义在主JNLP文g中。但很容易就能适应该限Ӟ你可单地创徏你自qWWJApplet子类(UC为MyWWJApplet)Q而它q不做Q何事情:
class MyWWJApplet extends WWJApplet {}
worldwind.jar|于classpath中,q编译上q类Q然后将该类攑օ它自qjar文g中。引入这个jar作ؓ你的主jarQMyWWJApplet成Z你的main-classQ然后将其作为JNLP扩展引入到World Wind中?br />
l论
介绍了Java插g对JNLP的支持,qؓApplet的发布提供了很多新的可能Q这对在览器内外发布Java内容的方法的l一又进了一大步。Applet自从它们起始已过了很长的旉Q现在随着对JNLP的支持,它们会比以往更快Q也更易于定制?br />

]]>