从java端访问javascript方法

时间:2013-09-04 13:31:36

标签: java javascript rhino scriptengine

我有一个javascript资源并应用Rhino Script Engine从java端调用方法。

 (function( global ){

    var Result;

    (Result = function( val ) {
        this.tpl = val || '' ;
    }).prototype = {

        get: function ()
        {
            return this.tpl ;
        }

    };
} ( window ) ) ;

这是我在java方面做到的方式,如何在上面的脚本中调用get方法?

    @Test
    public void testCallJSMethod() throws Exception {
        String jsResource = getJSResource();

        jsEngine.put("window", "window");
        jsEngine.put("window.Result", "Result");

        jsEngine.eval(jsResource);

        Invocable inv = (Invocable) jsEngine;

        Object obj = jsEngine.get("window.Result");
        assertEquals(true, obj != null);

        //try to call get method in above script, but it doesn't work
        inv.invokeMethod(obj, "get", new Object[] {} );
    }

2 个答案:

答案 0 :(得分:0)

可能的解决方法是将结果存储在脚本变量中并使用读取var         jsEngine.get( “myResult”);

答案 1 :(得分:0)

我发现您的代码有几个问题:

    jsEngine.put("window", "window");

这不会将窗口定义为JavaScript对象。你可以这样做:

    jsEngine.eval("window={}");

在你的javascript中,Result是一个局部变量,它不会在调用外部函数时继续存在。您应该将您的函数分配给global.Result:

(function(global) {
    (global.Result = function(val) {
        this.tpl = val || '';
    }).prototype = {
        get: function()
        {
            return this.tpl;
        }

    };
})(window);

jsEngine.get(name)获取变量的值。如果你想要window.Result的值,你必须做jsEngine.eval(" window.Result"),而不是jsEngine.get(" window.Result")。

但是window.Result实际上是一个函数。实际上是一个构造函数。因此,要创建实例,您必须执行以下操作:jsEngine.eval(" new window.Result(' Hello world !!!')")。

您的java函数将因此变为:

@Test
public void testCallJSMethod() throws Exception {
    String jsResource = getJSResource();

    jsEngine.eval("window={}");

    jsEngine.eval(jsResource);

    Invocable inv = (Invocable) jsEngine;

    Object obj = jsEngine.eval("new window.Result('Hello World!!!')");
    assertEquals(true, obj != null);

    Object res = inv.invokeMethod(obj, "get", new Object[] {} );
    assertEquals(res, "Hello World!!!");
}