【问题标题】:Call javascript(jQuery/Envjs) from java code从 java 代码调用 javascript(jQuery/Envjs)
【发布时间】:2013-04-14 00:32:42
【问题描述】:

我正在尝试从 Java 执行 Javascript 代码。 Javascript 代码使用 jquery,所以我在我的代码之前添加了 jquery.js。但它会引发以下异常,

Exception in thread "main" javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "window" is not defined. (<Unknown source>#1) in <Unknown source> at line number 1

当我从 Java 代码运行此程序时,我了解到它无权访问窗口对象,因此出现上述异常。我发现 EnvJs 提供了所需环境的实现,所以我尝试通过将其内容放在首位来加载它,同时将脚本内容生成到 eval。但遇到以下异常,

Exception in thread "main" javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: TypeError: Cannot call property getCurrentContext in object [JavaPackage org.mozilla.javascript.Context]. It is not a function, it is "object". (<Unknown source>#1247) in <Unknown source> at line number 1247


下面是代码sn-p,

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

String script = "Envjs code" + "jQuery code" + "my java script"; //code of envjs + jquery from the link provided at the end
engine.eval(script);

Invocable inv = (Invocable) engine;
inv.invokeFunction("myFunc", obj1, obj2);


我不使用任何浏览器功能,因此不需要对象的类似窗口。所以理想情况下我不想加载Envjs。请告诉我如何加载 jQuery 代码。


还有一个问题 - 如何将 Java 代码中的 Json 对象作为参数传递给 Javascript 函数?


http://www.envjs.com/dist/env.rhino.1.2.js
http://code.jquery.com/jquery-1.9.0.min.js

【问题讨论】:

    标签: java javascript jquery rhino envjs


    【解决方案1】:

    使用 Envjs 指南 (http://www.envjs.com/doc/guides#running-embed) 中的说明,使用 Rhino 执行此操作可能更容易。

    import org.mozilla.javascript.Context;
    import org.mozilla.javascript.ContextFactory;
    import org.mozilla.javascript.tools.shell.Global;
    import org.mozilla.javascript.tools.shell.Main;
    ...
    Context cx = ContextFactory.getGlobal().enterContext();
    cx.setOptimizationLevel(-1);
    cx.setLanguageVersion(Context.VERSION_1_5);
    Global global = Main.getGlobal();
    global.init(cx);
    Main.processSource(cx, "path/to/your/EnvJSfile");
    Main.processSource(cx, "path/to/your/JQueryJSfile");
    cx.evaluateString(global, "your JavaScript", "JavaScript", 1, null);
    

    【讨论】:

      【解决方案2】:

      不知道Envjs,为什么要在java中模拟浏览器环境?

      第二个问题:

      ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");
      Compilable compilable = (Compilable) engine;
      Bindings bindings = engine.createBindings(); 
      String script = "function add(op1,op2){return op1+op2} add(a, b)"; 
      CompiledScript jsFunction = compilable.compile(script);
      bindings.put("a", 1);bindings.put("b", 2); //put java object into js runtime environment
      Object result = jsFunction.eval(bindings);
      System.out.println(result); 
      

      您可以将任何对象放入绑定、地图、列表或 pojo。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-14
        • 2012-07-29
        • 2014-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多