通过URL数据嵌入Java小程序

11

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

文档中,用于实例化Java小程序的HTML标签1并没有排除这个选项,但我似乎无法实现这一点。

我有不同的HTML标签值变化,使用(object和applet),我认为最接近我的目标的是:

<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"。我通过点击浏览器上的错误图标来检查它。在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在此处提供了如何将JNLP嵌入HTML的示例。


不得不承认,前几天我没有仔细阅读帖子,错过了最后一个链接。有趣的是,JNLP可以进行base64编码。 - Andrew Thompson
如果您将 data:application/java-archive 替换为 data:application/x-java-archive 会发生什么? - Andrew Thompson
你能把那个堆栈跟踪编辑到问题中吗?同时对其使用代码格式。顺便说一句 - 我正在尝试在本地进行测试,结果出现了这个问题(https://dev59.com/8Wcs5IYBdhLWcg3w5H5a)。SNAFU!;) - Andrew Thompson
顺便问一下,你能给我们提供一个(非常简单的)小程序类和Jar的base64文本吗? - Andrew Thompson
一个 DummyApplet.class 的 base64 链接 http://pastebin.com/Jjmz5U4h;一个 DummyApplet.jar 的 base64 链接 http://pastebin.com/8fFDCQuF 和源代码链接 http://pastebin.com/3BaLijWj。谢谢。 - user823959
显示剩余3条评论
2个回答

5
HTML4规范中的OBJECT元素允许通过URL DATA进行内联数据嵌入,来自Oracle的Applet实例化文档也允许此操作。所进行的测试显示Java浏览器插件(来自Oracle)以及Java SE 6提供的源代码表明其未支持该实现。在这种情况下,似乎浏览器是否支持并不重要,因为Object/Applet HTML元素中引用的资源处理是由浏览器插件执行的。
一个替代方案是使用applet反序列化,通过URL DATA进行序列化,并使用APPLET元素的OBJECT属性。正如HTML4规范中所提到的,APPLET和OBJECT属性没有活动支持,JRE似乎也不支持从URL DATA进行对象反序列化。
简而言之,JRE不支持在CODE、OBJECT和ARCHIVE HTML属性中进行base64反序列化。
此外,在JRE1.4.1中存在关于URL DATA支持的BUG,未得到满足Bug ID: 4756961
我在64位Windows机器上使用JRE7进行测试的结果如下:
  • 将JAR文件通过URL DATA传递到ARCHIVE属性会导致Applet2Manager.loadJarFiles()中的IllegalArgumentException异常;
  • 将类通过URL DATA传递到CODE属性会导致Applet2ClassLoader.findClass()中的ClassNotFoundException异常;
  • 将序列化的小程序通过URL DATA传递到OBJECT属性会导致Plugin2ClassLoader.getResourceAsResource()中的FileNotFoundException异常。

1
非常好的回答,经过深入研究并提供了有用的链接。真希望我能多次点赞。 - bonsaiviking

2
即使在HTML标准允许的情况下,JRE通常也无法理解base64编码的数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接