是否有可能从JavaScript中创建任意Java对象?

时间:2009-08-18 19:10:39

标签: java javascript internet-explorer liveconnect

LiveConnect是一种桥接Java和JavaScript的Mozilla技术。令人惊讶的是,他们已经开始为最新版本的Firefox再次维护它。在Firefox中我可以写例如。

var d = new java.util.Date();

或使用Packages.命名空间(如果它不是java.something

var d = new Packages.java.util.Date();

或者我可能会疯狂并在摇摆中调用工厂方法

Packages.javax.swing.Box.createVerticalBox();

轻松实例化任何Java对象。是否存在可用于ie的等价物?

6 个答案:

答案 0 :(得分:5)

您可以在Internet Explorer中执行的操作是将applet加载到页面中,该页面公开了执行您要执行的操作的方法。您将获得对applet的引用,然后调用该引用上的方法。

<applet id="myAppletId" name="myAppletName" ...>

var applet = document.getElementById('myAppletId');
var d = applet.getDateFromApplet();

在您的小程序中,您需要一个返回getDateFromApplet()的公共方法java.util.Date

请注意,我提供的应该可以工作,但是我做了这么多年(当时它在NS4,6和IE 4+中工作)。我没有使用getElementById(),但我使用了var applet = document.myAppletName;

另一个复杂因素是如果你想在页面加载时执行它,那么applet几乎肯定不会准备就绪,这需要代码如下:

function checkApplets() {
    var da = document.applets; // document.getElementsByName('applet');?

    if (da.length > 0) {
        for (var ii = da.length; ii-- > 0;) {
            if (!da[ii].isActive()) {
                window.timerId = setTimeout(checkApplets, 250);
                return;
            }
        }

        if (window.timerId) {
            clearTimeout(window.timerId);
        }
    }

    window.appletsLoaded = true;
}

最后,可能(应该)可以使用<object>标记执行此操作,但正如我所说,自从我需要以这种方式从客户端JavaScript与Java applet交互以来已经有好几年了,所以我没有测试过。

答案 1 :(得分:4)

您正在使用LiveConnect,这是一个特定于Mozilla的JavaScript / Java桥接器。其他浏览器不支持它。

答案 2 :(得分:2)

您可以通过JAVA中的servlet的JSON响应使对象的属性可用吗?由于JS可以很容易地使用JSON并且它很轻,因此可以轻松地从Java对象中创建JS对象。

另请参阅Rhino JavaScript引擎并使用JavaScript提供Java资源。 https://developer.mozilla.org/en-US/docs/Rhino_documentation

答案 3 :(得分:1)

据我所知,我不认为这是可能的 - Java和Javascript完全不同。事实上,JS API包含Date对象,Java API也是如此。

编辑: Java Scripting API(http://java.sun.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html#jsengine)似乎是您可以达到的最接近的目标。

答案 4 :(得分:1)

从Java 1.6更新10开始,Inter-Language LiveConnect Bridge将一个Packages对象附加到页面内的applet,就像Firefox中可用的Packages对象一样。因此,在包含至少一个applet的页面中,即使在Internet Explorer中也是如此,

new document.applets[0].Packages.java.util.Date().toString();

返回当前日期。还可以注册新的转换器,以方便访问在Java虚拟机中运行的非Java语言。当然JavaFX实现了这样的桥梁。

在从JavaScript调用它之前,不应该等待applet加载,但这可能是一个好主意。 Java插件将使JavaScript等待,直到applet完成加载或出现错误。只要调用Applet.init(),applet就可以 调用网页中的JavaScript。

答案 5 :(得分:0)

您可以使用DWR或其他一些反向ajax库,它们允许您通过Javascript对象在服务器端创建Java对象。