2013-09-04 2 views
0

У меня есть ресурс javascript и примените Rhino Script Engine для вызова метода со стороны java.Доступ к javascript-методу со стороны 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[] {}); 
    } 
+0

Какой тип jsEngine? –

+0

Это движок Rhino [ссылка] (https://developer.mozilla.org/en/docs/Rhino) –

ответ

0

Возможный обходной путь для этого является сохранить результат в переменной сценария и прочитать, что вар с jsEngine.get («myResult»);

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 (имя) получает значение переменной. Если вы хотите значение 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!!!"); 
} 
Смежные вопросы