通过URL数据嵌入Java小程序

时间:2012-09-17 11:37:30

标签: java html applet base64

我正在尝试探索嵌入HTML Java小程序的URL数据功能。

用于实例化java applet 1的HTML标记的文档不排除此选项,但我似乎无法解决此问题。

我使用(对象和applet)有不同的HTML标记值变体,我认为接近我的目标是:

<object type="application/x-java-applet" width="100" height="100">
  <param name="archive" value="data:application/java-archive;base64,BASE64_OF_JAR"/>
  <param name="code" value="test.class"/>
  <h1>not working</h1>
</object>

此变体导致带有文本“name”的IlegalArgumentException。我点击浏览器上的错误图标。在java控制台上,整个堆栈跟踪是:

java.net.MalformedURLException: unknown protocol: data
        at java.net.URL.<init>(Unknown Source)
        at java.net.URL.<init>(Unknown Source)
        at sun.plugin.util.ProgressMonitorAdapter.setProgressFilter(Unknown Source)
        at sun.plugin2.applet.Plugin2Manager.setupProgress(Unknown Source)
        at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)

有没有人知道如何做到这一点或者是否可能?

PS:有一个例子说明如何在Oracle here

中嵌入JNLP的HTML

2 个答案:

答案 0 :(得分:5)

OBJECT元素的HTML4 specification允许通过URL DATA嵌入内联数据,Oracle的Applet实例化documentation也允许这样做。执行的测试显示了Java浏览器插件(来自Oracle),以及来自Java SE 6的可用源代码,表明实现不支持它。

在这种情况下,浏览器是否支持它似乎并不重要,因为Object / Applet HTML元素中的资源引用资源处理是由浏览器插件执行的。

另一种方法是使用applet反序列化,通过URL DATA序列化,使用APPLET element的OBJECT属性。正如HTML4规范中所提到的,没有对APPLET和OBJECT属性的主动支持,并且JRE似乎也不支持来自URL DATA的对象反序列化。

简而言之,JRE不支持CODE,OBJECT和ARCHIVE HTML属性中的base64反序列化。

还有一个关于JRE1.4.1中URL数据支持的BUG未实现Bug ID: 4756961

我在64位Windows机器上使用JRE7进行测试的结果如下:

  • 通过URL DATA将JAR传递给ARCHIVE属性会导致Applet2Manager.loadJarFiles()中出现IllegalArgumentException;
  • 通过URL DATA将类传递给CODE属性会导致Applet2ClassLoader.findClass();中的ClassNotFoundException;
  • 将序列化小程序通过URL DATA传递到OBJECT属性会导致Plugin2ClassLoader.getResourceAsResource()中出现FileNotFoundException。

答案 1 :(得分:2)

即使HTML标准允许,JRE通常也不了解base64编码数据。