Java Applet问题< - > Javascript通讯

时间:2010-03-22 19:33:46

标签: java javascript applet liveconnect

我无法让Java Applet与托管小程序的页面上的Javascript代码进行通信。它有时会起作用,但除此之外它还会引发一个模糊的异常,除了一些从未解决的Java bug报告之外,谷歌搜索还没有发现任何有用的信息(感谢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脚本来动态嵌入applet。我确保启用了MAYSCRIPT。我知道这不是MAYSCRIPT的问题,因为通信在某些时候有效。

3 个答案:

答案 0 :(得分:1)

确保您的applet标记中有MAYSCRIPT。

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

答案 1 :(得分:1)

我认为我已经通过设置classloader_cache=falseseparate_jvm=true解决了这个问题...一旦我设置了这两个,间歇性的模糊错误就会停止发生。希望这能很好地解决问题。

答案 2 :(得分:0)

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

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