2010-04-25 25 views
5

我想通過Java調用JavaScript中的函數。當直接以字符串形式讀取腳本時,此工作正常,但我正在使用CompiledScripts。javax腳本如何在Java中調用JavaScript函數

當我這樣做了編譯腳本它給了我沒有發現,如果我還添加綁定方法。沒有綁定它的作品,但當然功能失敗,因爲它需要綁定。

任何想法?

CompiledScript script = ... get script.... 

Bindings bindings = script.getEngine().createBindings(); 

Logger scriptLogger = LogManager.getLogger("TEST_SCRIPT"); 

bindings.put("log", scriptLogger); 

//script.eval(bindings); -- this way fails 
script.eval(); // -- this way works 
Invocable invocable = (Invocable) script.getEngine(); 
invocable.invokeFunction(methodName); 

TIA

回答

10

這裏的解決方案,如果任何其他人碰到這一點。

import java.util.*; 
import javax.script.*; 

public class TestBindings { 
    public static void main(String args[]) throws Exception { 
     String script = "function doSomething() {var d = date}"; 
     ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); 
     Compilable compilingEngine = (Compilable) engine; 
     CompiledScript cscript = compilingEngine.compile(script); 

     //Bindings bindings = cscript.getEngine().createBindings(); 
     Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE); 
     for(Map.Entry me : bindings.entrySet()) { 
      System.out.printf("%s: %s\n",me.getKey(),String.valueOf(me.getValue())); 
     } 
     bindings.put("date", new Date()); 
     //cscript.eval(); 
     cscript.eval(bindings); 

     Invocable invocable = (Invocable) cscript.getEngine(); 
     invocable.invokeFunction("doSomething"); 
    } 
} 
相關問題