代码之家  ›  专栏  ›  技术社区  ›  sproketboy

JavaX脚本如何从Java调用JavaScript函数

  •  5
  • sproketboy  · 技术社区  · 16 年前

    我试图通过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);
    

    蒂亚

    1 回复  |  直到 16 年前
        1
  •  10
  •   sproketboy    16 年前

    如果有人碰到这个问题,这里有解决办法。

    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");
        }
    }