问题
I'm trying to render the dojo charts server side. I came across the Rhino and envjs for server side browser emulation. when I tried to an example program to load the dojo.js in the rhino embedded in the java impl, the exception is thrown,
Exception in thread "main" javax.script.ScriptException: sun.org.mozilla.javascript.EcmaError: ReferenceError: "location" is not defined. (#15) in at line number 15.
My code is as follows:
import javax.script.*;
import java.io.*;
public class Java6RhinoRunner {
public static void main(String[] args) throws ScriptException {
new Java6RhinoRunner().load(args[0]);
}
private final ScriptEngine engine;
public Java6RhinoRunner() throws ScriptException {
ScriptEngineManager factory = new ScriptEngineManager();
this.engine = factory.getEngineByName("JavaScript");
this.engine.put("Java6RhinoRunner", this);
this.engine.eval("function load(filename) { Java6RhinoRunner.load(filename); }");
}
public void load(String filename) throws ScriptException {
try {
this.engine.eval(new FileReader(filename));
}
catch(FileNotFoundException e) {
throw new RuntimeException("Error loading javascript file: " + filename, e);
}
}
}
Lots of googling has been done but all in vain. Please help me to solve this problem
回答1:
The code fails because of the way Dojo detects that it is running in the Rhino environment.
The Dojo code was written for compatibility with Rhino's shell (org.mozilla.javascript.tools.shell.Main
) and detects Rhino by looking for features defined by org.mozilla.javascript.tools.shell.Global
. If these are not present Dojo assumes it is running in a browser environment.
It is probably possible to emulate these features by defining them in your script engine but I haven't tried it.
I wrote a blog post on running Dojo in embedded Rhino but it doesn't use the ScriptEngine
API.
来源:https://stackoverflow.com/questions/15969392/dojo-not-getting-loaded-into-rhino-emmbedded-in-java