我正在尝试执行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代码运行这段代码时,我知道它不能访问window对象,所以上面的异常。我发现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以下是代码片段:
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代码。
还有一个问题--如何将Json对象作为参数从Java代码传递到Javascript函数?
http://www.envjs.com/dist/env.rhino.1.2.js
http://code.jquery.com/jquery-1.9.0.min.js
发布于 2014-06-09 14:45:37
使用Envjs Guide ( 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);发布于 2013-05-07 09:47:46
我不知道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。
https://stackoverflow.com/questions/16124540
复制相似问题