Por cierto, Rhino viene integrado en Java SE 6, por lo tanto si tiene Java SE 6 ya puedes utilizar esta característica.
La características de este puedo mencionar:
- Compilación de javascript (si quiere compilar en script para un mejor rendimiento)
- Invocación de funciones.
- Acceso a recursos de Java (Puedes importar clases de java, invocar métodos y objectos de Java )
- Y lo más obvio manejo de return del script que ejecutas.
- Ejecutas el script desde hard code en java (lo cual no tendría mucha diferencia con lo que podrias hacer en java) y ejecución de script almacenado en un archivo.
- Soporte para la ejecución de PHP, Ruby, JavaScript, Python, etc dentro de Java con las características ya mencionadas. (Imaginate correr PHP en un servidor de Java EE y que puedas acceder desde PHP los objectos de java, javabean, ect.)
Ejemplo:
package org.vnssoftware;
import javax.script.Bindings;
import javax.script.Compilable;
import javax.script.CompiledScript;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class Scripting {
public static void main(String[] args) {
ScriptEngineManager engineManager = new ScriptEngineManager();
ScriptEngine engine = engineManager.getEngineByName("js");
engine.put("age", 21);
try {
engine.put("age", 26);
engine.put("noClaims", Boolean.TRUE);
Object result = engine.eval(
"if (age < 25){ " +
" riskFactor = 1.5;" +
"} else if (noClaims) {" +
" riskFactor = 0.75;" +
"} else {" +
" riskFactor = 1.0;" +
"}");
System.out.println(result);
// using javascript files
//engine.eval(new FileReader("c:/voting.js"));
// importing java classes
engine.eval("importPackage(java.util); " +
"today = new Date(); " +
"print('Today is ' + today);");
// using object instances passed to the script engine, and on static class members.
engine.put("name","John Doe");
engine.eval("name2 = name.toUpperCase();" +
"print('Converted name = ' + name2); \n");
// script engine implementations support script compilation
Compilable compilable = (Compilable) engine;
CompiledScript script = compilable.compile(
"if (age < 25){ " +
" riskFactor = 1.5;" +
"} else if (noClaims) {" +
" riskFactor = 0.75;" +
"} else {" +
" riskFactor = 1.0;" +
"}");
Bindings bindings = engine.createBindings();
bindings.put("age", 26);
bindings.put("noClaims", Boolean.TRUE);
bindings.put("riskFactor", 1);
script.eval();
// call individual functions defined in the script from your Java code.
engine.eval("function increment(i) {return i + 1;}");
Invocable invocable = (Invocable) engine;
Object resul = invocable.invokeFunction("increment", new Object[] {10});
System.out.print("result = " + resul);
} catch (ScriptException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}