【问题标题】:Problem with Java Applet <--> Javascript communicationJava Applet <--> Javascript 通信问题
【发布时间】:2011-01-30 12:12:46
【问题描述】:

我无法让 Java Applet 与托管该 Applet 的页面上的 Javascript 代码进行通信。它有时可以工作,但有时它会抛出一个模糊的异常,除了一些从未解决的 Java 错误报告(感谢 Sun)之外,谷歌搜索并没有找到任何有用的信息。

这是我正在使用的代码:

JSObject win = JSObject.getWindow(this);
Object[] args = new Object[1];
args[0] = "test argument";
String result = (String) win.call("testJSfunc", args); // XXX

这是我在标记为 // XXX 的行上遇到的异常。请注意,它是间歇性的。通常它可以工作,但有时它不会,使用相同的确切代码。重复重新加载页面会很快产生错误。

netscape.javascript.JSException: No registered plugin for applet ID 1
    at sun.plugin2.main.client.MessagePassingJSObject.newJSException(Unknown Source)
    at sun.plugin2.main.client.MessagePassingJSObject.waitForReply(Unknown Source)
    at sun.plugin2.main.client.MessagePassingJSObject.call(Unknown Source)
    at TestApplet.testCallJS(TestApplet.java:159)
    at TestApplet.init(TestApplet.java:139)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

我应该使用另一种更稳定的 Java 和 Javascript 通信方式吗?

--- 更多信息 ---

我正在使用 Sun 提供的 deployJava.js 脚本来动态嵌入小程序。我确保启用了 MAYSCRIPT。我知道这不是 MAYSCRIPT 的问题,因为通信有时会起作用。

【问题讨论】:

  • 你是用applet标签嵌入的吗?

标签: java javascript applet liveconnect


【解决方案1】:

确保您的小程序标签中有 MAYSCRIPT。

<applet id="..." code="..." name=".." codebase="..." archive="..."  width="100%" height="100%" MAYSCRIPT>

【讨论】:

  • 是的,它就在那里。无论如何, MAYSCRIPT 不应该是问题,因为异常是间歇性的。有时有效,有时无效(只需重新加载页面,不更改任何代码)。如果 MAYSCRIPT 是问题所在,它将在 100% 的时间内阻止通信。
  • 我认为 MAYSCRIPT 在 PlugIn2 中被忽略了。无论如何,它从来没有在所有浏览器上正常工作。
  • 谷歌搜索'plugin2',很有趣,想知道他们在java 1.6.10中引入的新插件架构是否有一些错误。
  • 'plugin2' 还定义了一种与浏览器交互的新方式。也许我应该使用它,也许它更稳定?
  • 我的错...新方法仅用于 DOM 操作。您使用完全相同的方法调用 javascript(通过 JSObject 类)。在内部它已被重写,但您使用相同的 API。
【解决方案2】:

我想我已经通过设置classloader_cache=falseseparate_jvm=true 解决了这个问题...一旦我设置了这两个,间歇性模糊错误就不再发生了。希望这能彻底解决问题。

【讨论】:

  • 不幸的是,这个解决方案导致小程序是完全无状态的。页面重新加载或刷新后,所有静态变量都会被清除。
【解决方案3】:

如果您将separate_jvm 设置为true,这会对性能产生非常糟糕的影响,因为新的Java VM 会为每个applet 实例化。如果页面上有多个小程序(30+),这会很慢。

我想知道这个问题是否还有其他解决方案。例如,我们有跨多个选项卡的多个小程序。当第一个带有小程序的选项卡打开时,所有小程序都正确显示,没有问题。但是,切换到任何其他选项卡结果并显示没有注册插件的错误。在 IE 中不会发生此错误,因为在 IE 中,所有小程序在添加到 DOM 时都会立即实例化。

【讨论】:

    猜你喜欢
    • 2011-11-01
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多