无法从 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 部署的小程序代码的主要内容,如果未能解决你的问题,请参考以下文章

jnlp无法用JAVA打开,java无法启动,显示应用程序错误?

通过 JNLP 传递动态参数

已安装Java,下载jnlp文件依旧无法使用。

在容器内将文件从容器复制到主机

如何签名JNLP文件?

java 无法启动该应用程序,如何解决?