【问题标题】:access javascript method from java side从java端访问javascript方法
【发布时间】:2013-09-04 13:31:35
【问题描述】:

我有一个 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[] {} );
    }

【问题讨论】:

  • jsEngine是什么类型的?
  • 这是犀牛引擎link

标签: java javascript rhino scriptengine


【解决方案1】:

一种可能的解决方法是将结果存储在脚本变量中并使用 jsEngine.get("myResult");

【讨论】:

    【解决方案2】:

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

        jsEngine.put("window", "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!!!");
    }
    

    【讨论】:

      猜你喜欢
      • 2017-02-09
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多