Evaluating javascript using a java code
You can get the output of the script (what is printed with print()
in JavaScript) by setting the writer on the ScriptContext
:
ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");
ScriptContext context = engine.getContext();
StringWriter writer = new StringWriter();
context.setWriter(writer);
engine.eval("print('Welocme to java worldddd')");
String output = writer.toString();
System.out.println("Script output: " + output);
I've solved this in the past by creating a javascript function inside eval()
and invoking it to get a result:
import javax.script.*;
// create a script engine manager
ScriptEngineManager factory = new ScriptEngineManager();
// create a JavaScript engine
ScriptEngine engine = factory.getEngineByName("JavaScript");
try {
// evaluate JavaScript code from String
engine.eval("function sum(a,b){ return a + b;}");
System.out.println(((Invocable) engine).invokeFunction("sum", new Object[]{10,20}));
} catch (ScriptException ex) {
Logger.getLogger(doComms.class.getName()).log(Level.SEVERE, null, ex);
}
Note that the function name in invokeFunction
(first argument) should match the one declared previously.
Keep in mind that this might be dangerous. Do you have absolute control as to where the javascript code comes from? Otherwise a simple while(true){}
could be pretty catastrophic for your server.