Después de una larga espera, finalmente se me quitó la flojera y decidí cumplir con uno de los posts prometidos acerca de Java 6. Se trata de la nueva especificación (JSR-223) que provee una interfaz estadarizada para la interacción con lenguajes de Scripting, tales como JavaScript, PHP, Python y Ruby.
Para los propósitos de este post usaremos JavaScript y PHP. Java 6 ya trae soporte para JavaScript; pero si queremos usar PHP u otro lenguaje, tendremos que conseguir la implementación del JSR-223 específica del lenguaje. Para este caso usaremos Quercus y un par de paquetes en los que Quercus tiene dependencias.
He aquí los paquetes que necesitaremos (vienen las ligas a los sitios donde se pueden conseguir las versiones más actuales. Si lo prefieres puedes bajar este paquete, que contiene las versiones disponibles al momento de escribir este post):
- quercus.jar: Está dentro del paquete de Quercus.
- resin-util.jar: Está dentro del paquete de Quercus.
- servlet-api.jar: Se puede conseguir de la carpeta lib del Tomcat.
- mail-x.x.jar: Solo para que el Quercus no mande warnings, JavaMail.
Ahora que tenemos todo lo necesario abramos nuestro editor Java favorito (Eclipse, por supuesto) y asegurémonos de que los archivos JAR recién bajados se encuentren en el CLASSPATH del proyecto o del sistema. Solo para probar que lo hicimos bien, agreguemos las siguientes líneas de código (sin olvidar sus respectivos includes [javax.script]).
public static void main(String[] args) {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByExtension(”php”);
engine.getContext();
}
Si tu código no compila y corre sin problemas, entonces asegúrate por segunda vez que las librerías sean visibles para tu código.
La clase ScriptEngine tiene algunos métodos bastante prácticos para intercambiar información con el intérprete del lenguaje de scripting; A mi parecer, tres de ellos son indispensables:
- put(String key, Object value): Sirve para asignar un valor a una variable dentro del intérprete.
- get(String key): Sirve para obtener el valor de una variable dentro del intérprete.
- eval(): Que tiene algunas variantes muy prácticas que permiten introducir el script como un String o desde un archivo.
Ya que conocemos un poco más de la clase ScriptEngine, hagamos algo útil con ella.
public static void main(String[] args) {
PrintWriter out = new PrintWriter(System.out, true);
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByExtension(”php”);
engine.getContext().setWriter(out);
String phpCode = “”;
try {
engine.put(”msg”, “chido!”);
phpCode = “<?php ” +
“if ($msg == ‘chido!’) {” +
“echo(’bien!’);” +
“}” +
“else {” +
“echo(’mal!’);” +
“}” +
” ?>”;
engine.eval(phpCode);
out.flush();
}
catch (ScriptException se) {
se.printStackTrace();
}
}
Con el código anterior podemos ejecutar cualquier código PHP; por lo que podemos beneficiarnos de la versatilidad del lenguaje y de muchas de sus funciones y librerías.
Ahora hagamos lo mismo con JavaScript. Es sorprendente lo poco que debemos modificar en el código Java para usar un lenguaje diferente.
public static void main(String[] args) {
PrintWriter out = new PrintWriter(System.out, true);
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByExtension(”js”);
engine.getContext().setWriter(out);
String jsCode = “”;
try {
engine.put(”msg”, “chido!”);
jsCode = “if (msg == ‘chido!’) {” +
“print(’bien!’);” +
“}” +
“else {” +
“print(’mal!’)” +
“}”;
engine.eval(jsCode);
out.flush();
}
catch (ScriptException se) {
se.printStackTrace();
}
}
Bueno, eso fue lo básico para comenzar a integrar JavaScript o PHP con tus clases de Java. Si sabes como hacerlo con Ruby, Python u otro lenguaje comparte con nosotros tu solución mendiante un comentario con una liga a tu sitio.