Una de las características más interesantes dentro de Java SE 6 es la posibilidad de usar lenguaje de Script (Phyton, PHP, Ruby o Javascript) dentro del propio Java. Este sería el comienzo para la implementación que vendría después en Java 8 que permitiría el uso de Lambda y el motor Nashorn.
¿Para que nos puede servir ejecutar lenguaje de Script dentro de Java? Pues para distintas funcionalidades como puede ser:
- Tienes una script con una determinada funcionalidad y la quieres usar dentro de Java para evitarte la duplicidad del código o el trabajo extra.
- Quieres habilitar un mecanismo para que los clientes puedan ejecutar su propio código de Script.
A continuación indicaremos algunas posibilidades y ejemplos de lo que se puede hacer. Pero si quieres más información aquí tiene la documentación oficial.
Ejemplo 1: Lo más básico, ejecutar javascript:
// Crear el gestor de motores de script ScriptEngineManager factory = new ScriptEngineManager(); // Crear el motor de Javascript ScriptEngine jsEngine = factory.getEngineByName("JavaScript"); // Evaluar el código Javascript jsEngine.eval("print('Hello, World')");
Ejemplo 2: Ejecutar código de un fichero javascript
jsEngine.eval(new java.io.FileReader("/WEB-INF/js/general.js"));
Ejemplo 3: Crear variables y distintos contextos
// Creamos una variable, por defecto es global jsEngine.put("x", "hello"); // Evalua el código javascript y pinta "hello" jsEngine.eval("print(x)"); // Creamos un contexto asociado unicamente a este motor de script concreto ScriptContext newContext = new SimpleScriptContext(); newContext.setBindings(jsEngine.createBindings(), ScriptContext.ENGINE_SCOPE); Bindings engineScope = newContext.getBindings(ScriptContext.ENGINE_SCOPE); // Le damos un valor distinto a la misma variable pero en otro ambito engineScope.put("x", "world"); // Evaluamos el código anterior e indicamos el nuevo ambito. Pinta "world" jsEngine.eval("print(x)", newContext);
Ejemplo 4: Invocar funciones y metodos Script
//Creamos una funcion javascript String script = "function hello(name) { print('Hello, ' + name); }" // eevaluamos el script jsEngine.eval(script); // javax.script.Invocable is opcional y puede no setar implementada para todos los motores de script Invocable inv = (Invocable) jsEngine; // Invocamos la funcion global 'hello' e indicamos su parametro de entrada inv.invokeFunction("hello", "Scripting!!");
Ejemplo 5: Ejecución de código compilado
//Compilable soporta la re-ejecucion de codigo previamente compilado Compilable jsCompilable = (Compilable) jsEngine; CompiledScript script = jsCompilable.compile("function test() { return 10; }; test();"); //Évaluamos el codigo compilado Object compiledOutput = script.eval(); //Podemos hacer uso del codigo compilado cada vez que queramos System.out.println(compiledOutput);
No hay comentarios:
Publicar un comentario