【问题标题】:Bind method call in JavaScript script in Java Scripting在 Java Scripting 中的 JavaScript 脚本中绑定方法调用
【发布时间】:2012-06-22 23:39:09
【问题描述】:

假设我有一个 Javascript 文件

function js_main(args){
     /* some code */
     var x = api_method1(some_argument);
     /* some code */
}

我尝试以通常的方式使用javax.scripting 运行它

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
engine.eval(...);

现在我想用我的 Java 类在 Javascript 中处理对 api_method1 的调用。我想要某种调用的映射/绑定,即每次脚本调用 api_method1(arg) 方法时

public Object api_method1(Object arg){ ... }

(与引擎放在同一类中)将被调用。

我能做到吗?

【问题讨论】:

    标签: java javascript scripting


    【解决方案1】:
    1. 使用engine.createBindings() 制作一个Bindings 对象;
    2. 将一个暴露你的方法的对象放入具有某个名称的绑定中:

      Bindings b = engine.createBindings();
      b.put("api", yourApiObject);
      engine.setBindings(b, ScriptContext.ENGINE_SCOPE);
      
    3. 然后在 JavaScript 中会有一个可以调用的全局“api”对象:

      api.method1( "foo", 14, "whatever" );
      

    该设施易于使用,但要小心您来回传递的内容;将 JavaScript 类型转换为 Java 类型并没有多大作用。

    【讨论】:

    • 如何将数据编组到/从方法(除了原语)?
    • 来回传递数据而不是原始数据,您可以使用 JSON。您的 Java 代码可以使用任何 JSON 库对 JSON 进行序列化/反序列化。
    • 你几乎只能靠自己。您可以序列化为 JSON(从 JavaScript 很容易),然后在 Java 中反序列化(不太容易,但可行)。或者,您可以公开各种实用程序来拼凑其他 Java 对象类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多