【问题标题】:Javascript to Java communication using LiveConnect not working使用 LiveConnect 的 Javascript 到 Java 通信不起作用
【发布时间】:2011-04-11 01:10:05
【问题描述】:

我一直在从事一个需要在 Java 和 JavaScript 之间进行双向通信的项目。我已经成功地让它在 OS X 的所有浏览器下运行,但我现在面临着让它在任何浏览器下运行在 Windows 上的挑战。目前它根本不起作用。

我只是想知道是否需要做一些特别的事情才能让 JavaScript 与 Java 通信?

我的小程序代码如下所示:

<applet id='theApplet' 
    code="com/company/MyApplet.class" 
    archive="SMyApplet.jar" 
    height="50" width="900" 
    mayscript="true" scriptable="yes">
        Your browser is ignoring the applet tag.
</applet>

加载小程序后,我会尝试像这样调用它的函数:

 alert("Call some java:" + theApplet.testFunc());

在萤火虫控制台中我收到以下错误:

theApplet.testFunc is not a function

我可以确认这在 IE 中也不起作用。

当页面加载时,我打开了 java 控制台,我可以看到小程序已成功加载并准备好接受调用。

任何帮助将不胜感激!

干杯


更新:这是暴露我试图调用的公共 api 的精简 java 代码。

package com.company;

import com.google.gson.Gson;

import java.applet.*;
import java.io.*;
import java.net.*;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.*;

import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.*;

import netscape.javascript.*;

public class MyApplet extends Applet implements Runnable
{
    public void init() 
    {
        JSON = new Gson();
        isReadyVar = 0;
        workThread = null;
    }

    public void start()
    {
    }

    public void run()
    {
        System.out.println("Done");             
    }


    public void stop()
    {
    }

    public void destroy()
    {
    }

    /* Public API */

    public int testFunc()
    {
        return 200;
    }
}

更新 [已解决]:

我弄清楚了到底是什么问题。原来我使用的 Gson 库没有签名;但我自己的罐子是。 Windows 上的浏览​​器要求所有库都经过签名;所以我用我的java文件打包Gson并签署了很多,它解决了问题!感谢大家的帮助!

【问题讨论】:

  • @Ben “这是精简的 Java 代码。”谁在乎?我建议(并将仔细研究)的是SSCCE。如果您还没有点击 SSCCE 的链接,我建议您现在就这样做。
  • 确定;我现在将创建一个 SSCCE 版本。
  • 好的,我已经设法获得了一个工作版本 - 我刚刚删除了所有多余的代码,现在我有一个签名的小程序 + 测试 html 页面,它可以按预期运行。现在将建立备份,直到我重新创建问题。感谢安德鲁的帮助;我只是需要推动它来剥离它以确保它实际上在最低级别工作。
  • 不,我理解并且我按照您的步骤创建了这样一个环境,这向我证明代码中的某些内容在 Windows 下破坏了它。我还没有更新上面的代码;如果这就是你最后评论的依据?
  • 那是 - 愚蠢的我。 :p 当您发布 SSCCE 时添加评论。

标签: java javascript windows liveconnect


【解决方案1】:

我弄清楚了到底是什么问题。原来我使用的 Gson 库没有签名;但我自己的罐子是。 Windows 上的浏览​​器要求所有库都经过签名;所以我用我的java文件打包Gson并签署了很多,它解决了问题!感谢大家的帮助!

【讨论】:

    【解决方案2】:
    alert("Call some java:" + document.getElementbyId("theApplet").testFunc());
    

    确保testFunc() 方法声明为public 访问权限。

    如果这不起作用,请将小程序代码发布为 SSCCE

    顺便说一句

    不正确

    code="com/company/MyApplet.class" 
    

    正确

    code="com.company.MyApplet" 
    

    顺便说一句 2

    不正确

    ..scriptable="yes">
    

    正确

    ..scriptable="true">
    

    【讨论】:

    • 感谢您的回复。那也没有用;以前也试过,没用。稍后将发布小程序代码。
    • 就在我粘贴代码之前;鉴于它适用于 FF/Chrome/Safari 中的 OSX; Java 代码不应该是正确的吗?
    • File f = new File("the\\path\\to\\file.txt") 可能在 Windows 上工作,但在其他操作系统上失败。因此,尽管 Java 本身可以是 x-plat,但 Java 代码仍可能陷入许多陷阱。此外,在这种情况下,您正在混合 Java、JavaScript、HTML 和浏览器。这增加了一个数量级的“不兼容性”蔓延的可能性——其中大部分超出了 Java 的控制能力。
    【解决方案3】:

    由于 applet 元素已被弃用,我使用以下代码,至少在 Firefox 中有效:

    <object id="MyApplet" classid="java:com.example.myapplet"
      codetype="application/java" codebase="bin/" height="10" width="10"
    </object>
    

    【讨论】:

    • 我的印象(我在某处读到)不再推荐对象方法。我会四处寻找文件。
    • 对不起,那帮不了你了。你能在网上举个例子吗?这可能会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多