【问题标题】:Call a (Rhino) JS function in Java and pass a variable in在 Java 中调用(Rhino)JS 函数并传入一个变量
【发布时间】:2010-08-06 13:40:29
【问题描述】:

在昨天弄清楚如何配置我的 Eclipse 项目以便能够运行 JS 代码之后(如果您有兴趣:Build a JS server inside of Java for Google AppEngine),我有下一个与此主题相关的问题:我有一个 JS 文件和其中的一个函数.我需要在我的 Java 代码中运行该函数并在其中传递一个(Java 字符串)变量。我的文件非常基础,目前看起来是这样的:

public class Com_feedic_readabilityServlet extends HttpServlet {
 public void doGet(HttpServletRequest req, HttpServletResponse resp)
   throws IOException {
  resp.setContentType("text/html"); 
  Context cx = ContextFactory.getGlobal().enterContext();
  cx.setOptimizationLevel(-1);
  cx.setLanguageVersion(Context.VERSION_1_5);
  Global global = Main.getGlobal();
  global.init(cx);
  Main.processSource(cx, "server_js/js_init.js");
 }
}

我现在需要做的是在js_init.js 文件中调用函数run()。我该如何管理?

【问题讨论】:

  • 你使用的是JDK 6 ScriptEngine 机制吗?此外,您发布的该功能与任何东西有什么关系也不清楚。
  • 它只是显示了我如何导入 .js 文件。而且我使用的是导入的 Rhino js.jar 文件,它不完全是 ScriptEngine 机制(但我认为它是基于它的,此外:我不知道)。
  • 嗯...我读过那篇博文,它似乎与我在 Rhino 上做过的任何事情都不一样。我一直使用 JDK ScriptEngine 框架和 Rhino 的内置(有些过时)版本,非常好用。
  • 我没有使用那个东西的技术,只是它的基本结构(但我确实使用了 Java 文件)。使用 ScriptEngine 的解决方案也可以。

标签: java javascript rhino


【解决方案1】:

需要通过Binding对象来传递参数的值,如下:

  package rhinodemo;

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

  public class RhinoDemo {

    public static void main(String[] args) throws Exception {
      ScriptEngineManager mgr = new ScriptEngineManager();
      ScriptEngine engine = mgr.getEngineByName("JavaScript");

      Bindings bindings = engine.createBindings();
      bindings.put("currentTime", new Date());
      engine.eval(
         "function run(x) { println('x=' + x); }" +
         "run(currentTime);", bindings);
    }
  }

如果您希望您的 Java 代码调用名为 run() 的 Javascript 函数,则创建一个脚本,该脚本 (a) 定义 run() 函数并 (b) 调用此函数,并将参数传递给它。然后,在Java端,需要创建一个Bindings对象,并设置这个参数bindings.put(currentTime, new Date())的值。

【讨论】:

  • 我收到错误“println 未定义”。如何将 Rhino 评估的内容传递回变量(请记住,我使用的是 JS 服务器)?
【解决方案2】:

试试这个:

Object jsOut = Context.javaToJS(System.out, scope);
ScriptableObject.putProperty(scope, "out", jsOut);

和js文件out.println(<text>);

【讨论】:

    猜你喜欢
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2013-10-28
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    相关资源
    最近更新 更多