Más lentamente que otras tecnologías Java EE en cada nueva versión sigue adaptándose a las nuevas tendencias en el desarrollo y facilitando la programación de aplicaciones de entidad empresarial. Java EE está formado por un conjunto de especificaciones que resuelven en gran medida muchas de las necesidades funcionales de las aplicaciones ya sean de persistencia, seguridad, mensajería, lógica de negocio, transaccionalidad, inyección de dependencias, presentación HTML, JSON, WebSockets, conexión a base de datos, envío de correos electrónicos o concurrencia. En este artículo mostraré un ejemplo usando varias de estas especificaciones y proporcionaré el código fuente completo.


Comentaba las novedades y nuevas características de Java EE 7 que en el 2013 trajo esta nueva versión para el desarrollo de aplicaciones empresariales con el lenguaje Java. Hacía una descripción y cuáles eran las especificaciones y versiones de las mismas que proporcionan la funcionalidades comunes a muchas aplicaciones. En este artículo mostraré un ejemplo con código con la implementación de una aplicación usando varias de las especificaciones de Java EE.
El ejemplo consistirá en una supuesta aplicación sencilla para hacer la lista de la compra de un supermercado usando las siguientes especificaciones JSF, JPA, JTA, Security, CDI, EJB, REST, JAX-RS, JSON, eventos CDI y WebSockets. El comprador irá seleccionando productos y la cantidad de los mismos de su compra, la aplicación le informará del precio de los productos seleccionados hasta el momento y finalmente para hacer la compra iniciará sesión. En el momento que se realice una compra el stock de productos se actualizará en todos los clientes conectados al supermercado.
Este ejemplo está relacionado con otros artículos que he escrito como Ejemplo de multiproyecto con Gradle, Novedades y nuevas características de Java 8 y alguno quizá considere de la misma forma que sigue habiendo más de 10 razones para seguir usando Java.
Para facilitar el desarrollo de la aplicación en el lado cliente usaré algunas librerías JavaScript de forma similar al ejemplo de la lista de tareas con Backbone y React junto con RequireJS. Seleccionados los productos, la compra se realizará usando una API REST intercambiando los datos con formato JSON, se persistirá en la base de datos con JPA actualizándose en ese momento el stock de los productos de lo que se encargará un EJB para controlar esta pequeña lógica de negocio, si no hay stock suficiente de un producto se producirá una excepción y devolverá un código de estado adecuado en la petición HTTP, al realizar la compra se generará un mensaje evento CDI que desencadenará la actualización del stock de los usuarios conectados usando WebSockets. La página del listado de productos y el formulario de autenticación se generará usando la tecnología de presentación JSF.
Veamos primero la página inicial índice con el listado de productos generada con JSF. Obtiene el listado de productos y genera el HTML del mismo, además carga los JavaScripts necesarios para que la aplicación funcione en el navegador del cliente.
El JavaScript añade la lógica en el cliente para ir realizando la lista de la compra usando poco más que jQuery y Require JS, además, inicializa el WebSocket para recibir los mensajes desde el servidor con la actualizaciones del stock de los productos. Realizada la lista de productos se enviará un petición REST al servidor para formalizar la compra.
Las peticiones de compras en el servidor se procesarán por un endpoint de una interfaz REST que usando un EJB con la lógica de negocio para persistir la compra en una base de datos relacional y actualizar los stocks. Actualizados los stocks y persistida la compra se genera un evento CDI con el hecho de que se ha producido una compra.
La aplicación irá registrando los usuarios conectados a la aplicación con el objetivo de enviarles las actualizaciones de stock de los productos y con un evento CDI con la notificación de que se ha producido una compra que ha actualizado el stock de algunos productos enviará los nuevos stocks a los clientes con la tecnología WebSocket en un mensaje con datos en JSON que soportan los navegadores y Java EE.
Usando la API de seguridad de Java EE autenticaremos al comprador o vendedor, la página se personalizará según el rol del usuario y en el servidor con la anotación RolesAllowed y métodos post, get, list se limitarán las acciones que pueden realizar según sus roles, su uso se puede ver en los listados de código anteriores. Con la página de inicio de sesión se autenticará al usuario de forma programática usando request.login(username, password);
. Esta acción es recomendable hacerla usando el protocolo seguro HTTPS con TLS a configurar en el servidor para que la contraseña se transmita cifrada entre el cliente y el servidor.
La aplicación está dividida en varios módulos construidos con la herramienta de automatización Gradle siendo una aplicación EAR estándar estando constituida por un módulo para los EJB, otro para la aplicación web con un WAR. Un cliente podría conectarse directamente a la aplicación sin mediación de un navegador web, esto último sería lo que emplearíamos si fuese una aplicación de escritorio empleando Java FX.
El conjunto de especificaciones de Java EE proporciona una solución para la mayoría de funcionalidades que necesita una aplicación pero también podemos sustituir alguna y combinarlas con otras de las muchas librerías o frameworks disponibles en la plataforma Java. Por ejemplo, como framework en vez de usar Servlet y JSP o JSF podemos usar Apache Tapestry, Vert.x, Spark, Struts, Grails, … dependiendo de las necesidades de la aplicación, su complejidad y nuestras preferencias. Como alternativa al ORM de JPA o JDBC se puede usar jOOQ. RabbitMQ en vez de JMS o Spring en vez de CDI, EJB y JTA.
Algunos libros sobre Java EE que he leído y que me han gustado han sido los siguientes, Java EE 7 Essentials hace un repaso detallado pero no muy profundo para hacerse una idea bastante buena del conjunto de especificaciones de Java EE. Otro buen libro es Java EE 7 Development with WildFly
que entra más en detalle en cada una de las especificaciones. Libros sobre Java EE 7
hay muchos por la cantidad de tiempo que ya tiene, es recomendable leer alguno que esté actualizado a las últimas versiones.
Con Java EE 6 y 7 ciertas partes de configuración se pueden realizar con anotaciones en vez de con XML sin embargo aún no ha desaparecido completamente aunque si reducido considerablemente.
Ejecutar este ejemplo require instalar previamente el servidor de aplicaciones WildFly e iniciarlo con ./standalone.sh -c standalone-full.xml
. Iniciado el servidor y desplegada la aplicación con el siguiente comando de Gradle se puede acceder a ella con el navegador en la dirección https://localhost:8443/war/ teniendo el protocolo seguro configurado.
El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando el comando ./gradlew build deploy
.
En el futuro Java EE 8 está planificado un framework basado en acciones en vez de componentes como en JSF, también el soporte para el protocolo HTTP/2.
Referencia:
Introducción y nuevas características de Java EE 7
Novedades y nuevas características de Java 8
10 razones para seguir usando Java
Libro sobre desarrollo de aplicaciones con Apache Tapestry
Ejemplo lista de tareas con Backbone y React
Alternativa a Hibernate u ORM y ejemplo de jOOQ
Introducción a JavaFX, aplicaciones de escritorio en Java
Herramienta de construcción Gradle
Ejemplo de multiproyecto con Gradle