无法从 JavaScript 调用 JNLP 部署的小程序代码
Posted
技术标签:
【中文标题】无法从 JavaScript 调用 JNLP 部署的小程序代码【英文标题】:Can't call JNLP-deployed applet code from JavaScript 【发布时间】:2013-01-12 08:31:16 【问题描述】:这是我关于 Java 的第一个问题,请耐心等待。
我用这段代码构建了一个名为 HelloWorldApp.class 的愚蠢的简单小程序类:
import java.applet.Applet;
class HelloWorldApp extends Applet
static final long serialVersionUID = 6636669702238171717L;
public String test()
return "Hello World!"; // Display the string.
然后我从所述类文件构建了一个 jar 文件。之后,我做了一个愚蠢的简单JNLP文件:
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="/Content/applets" href="/Content/applets/datadelivery.jnlp">
<information>
<title>Hello World</title>
<vendor>Me</vendor>
</information>
<resources>
<!-- Application Resources -->
<j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"/>
<jar href="HelloWorldApp.jar" main="true" />
</resources>
<applet-desc
name="Test Applet"
main-class="HelloWorldApp"
>
</applet-desc>
<update check="background"/>
</jnlp>
我将目录 /Content/applet 中的所有三个项目都扔掉了。最后,为了将它们联系在一起,我将其放在 html 文档的正文中:
<script type="text/javascript">
var attributes =
id:'deliveryApplet',
code: 'HelloWorldApp',
// note: I tried including "codebase: '/Content/applets'", but nothing new happened
width: 300,
height: 50
;
var parameters =
jnlp_href: '/Content/applets/datadelivery.jnlp'
;
deployJava.runApplet(attributes, parameters, '1.6');
</script>
...并创建了一个带有 onclick 调用动作的按钮:
alert(deliveryApplet.test())
问题?没有函数调用; JS 控制台响应说“未捕获的类型错误:对象 # 没有方法 'test'”。所以在某个地方,部署没有成功。但是哪里?根据示例,JNLP 的内容看起来是正确的。
【问题讨论】:
alert(deliveryApplet.test())
是一种非常幼稚的方式来访问页面中的元素。我建议你编写一个 JS function
,它接受一个字符串作为 ID 并返回适当的元素。在一系列浏览器中对其进行彻底测试。在小程序中,调用(经过测试且健壮的)JS 函数。此外,确保小程序调用声明 scriptable=true
。
将 jnlp_ref 更改为 jnlp 文件的相对路径(即无路径)。因为您在 Applet 中没有绘画,所以很难看到它是否会启动。如果它启动失败,那么你会得到红色的 X 并且小程序没有启动消息。在更改 jnlp 文件和重新运行之间清除 java 缓存。您正在加载 deployJava.js 脚本?
@Petesh:是的,deployJava.js 肯定会被加载。我将 jnlp_href 更改为“datadelivery.jnlp”,擦除了 Java 缓存(Java 控制面板 -> 临时 Internet 文件 -> 设置...,对吗?),然后重试。同样的问题。但你是对的,我至少正在启动。我花了一些时间从红色 X 到我现在所在的灰色未上漆的盒子!
呵呵 - 我几乎构建了这个 - github.com/petesh/jnlp_applet,它工作得很好,包括从 Safari 手动调用 alert(deliveryApplet.test())
。不过,我不得不为 firefox 使用 alert(document.applets[0].test())
!
@Petesh 更新:抱歉,我花了一段时间才回复。无论如何,我观察到两件事:1)我没有为 IIS 中的 .jnlp 文件设置 MIME 类型,这会造成麻烦。固定的。 2) 我花时间在我的应用程序中采用了 github 示例——paint() 和所有内容,瞧!我发现小程序根本没有加载。我觉得我在某处弄错了路径...如果 HTML 文件在 ~/administration 中,而 applet/JNLP 在 ~/Content/applet 中,有什么变化(除了 JNLP 中的两条路径)?跨度>
【参考方案1】:
为了使事情更容易处理,我建议您使用“已弃用”小程序标签测试您的小程序。我记得我在使用 javascript 小程序加载器时遇到了奇怪的问题,并且无法弄清楚为什么它没有按照应有的方式工作。
【讨论】:
以上是关于无法从 JavaScript 调用 JNLP 部署的小程序代码的主要内容,如果未能解决你的问题,请参考以下文章