如何用Javascript调用Java applet方法?

时间:2013-09-03 09:01:33

标签: java javascript applet

我去年创建了一个Java applet,用于从Web应用程序到本地运行的java服务器的套接字连接。它运作良好。

自上次java更新(我猜是7 r21)以来,我无法再访问javascript中的方法了。现在,我将applet缩减为测试applet(没有doPriviligedAction方法),但即使这样也不行了。

目前的代码就像

import java.applet.*;

public class socketApplet extends Applet {

    public void init() {
        System.out.println("Applet initialisiert.");
    }

    public void start() {
        System.out.println("Applet gestartet.");
    }

    public void paint() {
        System.out.println("Applet aktualisiert.");
    }

    public void stop() {
        System.out.println("Applet angehalten.");
    }

    public void destroy() {
        System.out.println("Applet beendet.");
    }

    public String testApplet() {
        System.out.println("Applet getestet.");
        return "Yep, I'm the Applet.";
    }

}

在更新之前,我可以在javascript中访问像testApplet()这样的方法:

document.socketApplet.testApplet();

applet是自签名的,并嵌入了applet html-tag。它正在启动(java控制台打开并打印init,start和paint方法中定义的调试消息)但我无法访问testApplet()方法。当applet存在时,Javascript中的响应是“未定义的”。

在阅读了一段时间(现在几天......)关于新的安全性更改后,我添加了一个manifest.txt,其中包含以下内容:

Main-Class: socketApplet
Permissions: all-permissions
Codebase: *
Trusted-Library: true

无论有没有Trusted-Library属性都没有运气。

我需要做些什么来再次启用javascript访问?

编辑: 实施:

<applet id="socketApplet" width="100" height="100" archive="../../socketApplet.jar" name="socketApplet" code="socketApplet" scriptable="true">

我正在最新的Mac OS X机器上测试最新版本的Firefox和Safari。

EDIT2: 我正在创建和签署这样的jar enter image description here

EDIT3: 好的,现在我的罐子工作了几次(不是连续的),我得到了 enter image description here

并在控制台中 enter image description here

但大多数时候它不起作用。重新启动浏览器,清除缓存,没有任何作用。现在(再次)在另一台电脑上测试这个。

Edit4: 好吧,它运行在一个带有Windows xp和java 32bit 7u25的虚拟机上 - 在我的64位mac上只有30次尝试中只有1次。

1 个答案:

答案 0 :(得分:1)

好的,我找到了所有邪恶的根源......

它与applet无关。令人困惑的情况是它在Windows上的firefox中工作,而不是在mac上的firefox中工作(相同的FF版本,相同的java版本)。我的Mac上的Safari无法正常工作,因为该插件已被禁用...

所以这只是一个关于mac问题的Firefox。我已经测试了不同的情况,并且applet在将上面的applet代码编写到html页面时起作用。之前,我已经动态创建了applet(在软件中需要什么):

    var applet = document.createElement('applet');

    applet.archive      = 'socketApplet.jar';
    applet.id           = 'socketApplet';
    applet.name         = 'socketApplet';
    applet.code         = 'socketApplet';
    applet.scriptable   = 'true';
    applet.width        = '0';
    applet.height       = '0';

    document.body.appendChild(applet);

它可以在任何地方使用,但不适用于Mac上的Firefox。因此,作为一种解决方法,我必须将applet嵌入到iframe中,并且我必须动态嵌入iframe。有效...

    var mFrame      = document.createElement('iframe');
    mFrame.id       = 'testFrame';
    mFrame.height   = '200';
    mFrame.width    = '400';
    document.body.appendChild(mFrame);
    mFrame.src      = 'frame.html'; // contains the applet code

接下来我要将html标签更改为对象并嵌入IE支持标签。谢谢你的帮助Andrew Thompson!

我不喜欢iframe版本,因为通过javascript访问applet更复杂,但似乎没有别的办法。

我将为此提交一张Mozilla错误票。 https://bugzilla.mozilla.org/show_bug.cgi?id=912880

可能与此类似但另一种情况: https://bugzilla.mozilla.org/show_bug.cgi?id=872969