Problem with Java Applet <--> Javascript communication
Asked Answered
K

3

6

I'm having trouble getting a Java Applet to communicate with the Javascript code on the page the applet is hosted on. It works sometimes, but othertimes it throws an obscure exception, that googling for has not turned up any useful information, besides a few Java bug reports that were never resolved (thanks Sun).

Here is the code I am using:

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

Here is the exception I get on the line marked // XXX. Note that it is intermittent. Often it works, but sometimes it does not, using the same exact code. Reloading the page repeatedly will produce the error pretty quickly.

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)

Is there another more stable way of communicating between Java and Javascript that I should be using?

--- More info ---

I'm using the deployJava.js script as provided by Sun to embed the applet on the fly. I made sure MAYSCRIPT is enabled. I know it's not a problem with MAYSCRIPT, because the communication works some of the time.

Kenishakenison answered 22/3, 2010 at 19:33 Comment(1)
Are you using the applet tag to embed it?Unquote
K
1

I think I've solved the problem by setting classloader_cache=false and separate_jvm=true...once I set both of those, the intermittent obscure errors stopped happening. Hopefully this solves the problem for good.

Kenishakenison answered 7/6, 2010 at 15:54 Comment(1)
Unfortunately this solution cause applet is totally stateless. All static variables are cleared after page reloading or refreshing.Buoyancy
V
1

Make sure you have MAYSCRIPT in your applet tag.

<applet id="..." code="..." name=".." codebase="..." archive="..."  width="100%" height="100%" MAYSCRIPT>
Viscardi answered 22/3, 2010 at 19:38 Comment(5)
Yes, it's there. MAYSCRIPT shouldn't be the problem anyway, because the exception is intermittent. Some times it works, some times it does not (simply reloading the page, not changing any code). If MAYSCRIPT were the problem, it would block the communication 100% of the time.Kenishakenison
I think MAYSCRIPT is ignored in PlugIn2. It never worked across all browsers correctly anyway.Roa
Googled 'plugin2', interesting, wonder if their new plugin architecture introduced in java 1.6.10 has some bugs.Kenishakenison
'plugin2' also defines a new way of interacting with the browser. Maybe I should use that, maybe it is more stable?Kenishakenison
My bad...the new way is for DOM manipulation only. You use the exact same method for calling javascript (via the JSObject class). Internally it has been rewritten, but you use the same API.Kenishakenison
K
1

I think I've solved the problem by setting classloader_cache=false and separate_jvm=true...once I set both of those, the intermittent obscure errors stopped happening. Hopefully this solves the problem for good.

Kenishakenison answered 7/6, 2010 at 15:54 Comment(1)
Unfortunately this solution cause applet is totally stateless. All static variables are cleared after page reloading or refreshing.Buoyancy
P
0

If you set separate_jvm to true this has very bad effect on performance since new Java VM is instantiated for every applet. If you have multiple applets on the page (30+) this is pretty slow.

I wonder if there is any other solution for this issue. E.g., we have multiple applets across multiple tabs. When the first tab with applets is opened all applets are shown correctly with no problems. But, switch to any other tab results with the error for no registered plugin. In IE this error does not occur because in IE all applets are instantiated immediately as they are added to DOM.

Pavilion answered 13/2, 2012 at 6:11 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.