JEE6, haciéndolo fácil.

3
13002

JEE6, haciéndolo fácil.

Los fuentes

Lo primero es el enlace a los fuentes de este tutorial

Introducción

Ya estamos en el mes de julio y en Madrid hace un calor espantoso. A pesar de las inclemencias del tiempo y de la dificultad
que supone poner en marcha las neuronas en este momento, es una ocasión ideal para ponerse a cacharrear con
los nuevos juguetes que aparecen en escena en el mundo Java.
La nueva versión Enterprise de Java ya lleva unos cuantos meses con nosotros y es el momentos de empezar
a tantear un poco que nos trae o que se lleva. La versión anterior ya fué todo un cambio en su planteamiento
buscando sobre todo la sencillez en el desarrollo.

Ya hablé algo en tutoriales anteriores acerca de
la versión de EJB 3.0
que me sorprendió gratamente en su momento, y tengo que decir, que si bien la mayor parte de las nuevas incorporaciones
de esta versión y de la anterior no son ninguna novedad (ya que la mayor parte de ellas son incorporaciones de ideas de otros frameworks),
me satisface comprobar que los creadores de esta nueva versión han sido lo bastante inteligentes y humildes para incorporar las mejores
cosillas que ofrecen los demás frameworks que hoy día chapotean en nuestro mundillo.
Tras cacharrear, leer algún libro y mirar mucho por la red, se puede resumir que:

Cosillas nuevas en JEE6

  • Búsqueda de un framework más sencillo. Casi todo se puede hacer con anotaciones y desaparece la necesidad de usar descriptores.
  • Búsqueda de un framework más portable. Se incluyen especificaciones para normalizar los nombres JNDI de los EJBs (lo que era siempre un problema entre servidores) y se incluye el concepto de EmbeddedContainer para poder probar unitariamente los EJBs.
  • Búsqueda de un framework más ligero. Debido a la gran cantidad de especificaciones que se han de cumplir,
    la nueva versión ha incorporado algunos conceptos nuevos para tratar de minimizar este impacto:

    1. Pruning: Esto sería algo parecido al deprecated. Han decidido incluir el concepto de Especificaciones que serán eliminadas (EJB 2.X, JAX-RPC, JAXR …)
    2. Profile (perfiles): Los servidores JEE incorporarán perfiles diferentes en función de la naturaleza de las aplicaciones que corran en nuestro servidor.
      Este concepto aparecía en el servidor JBoss desde sus inicios (minimal, all, default …). Por ahora, la nueva versión únicamente ha definido el Web Profile (Perfil Web) que incluye JSF, JSP, JSTL, Servlet, EL, EJB Lite, JPA, JTA y Commons Annotations
    3. EJB Lite: es un subconjunto de las especificaciones más importantes de EJB para poder ser incluído por ejemplo en el Web Profile.
  • Búsqueda de un framework más completo. Se incluyen nuevas especificaciones como por ejemplo RESTFul Webservices (JAX-RS).

Sin más, y como el movimiento se demuestra andando, probemos algunas cosas nuevas. Lo primero que necesitamos es alguien que implemente todo esto. Tenemos varias elecciones, glassfish 3, JBoss 6 …
Esta vez toca glassfish:

Descargando Glassfish v3

Como siempre hay versiones de todos los colores. Yo he escogido la versión OpenSource sin instalador (el zip)
El enlace está aquí.

Lo único que hecho es descomprimirlo.

Configurando el entorno.

Para el tutorial, he aprovechado para instalar el Eclipse Helios (última versión de eclipse), pensando que incluiría
el glassfish v3 en la pestaña de Servers. Pero no lo incluye. Así que finalmente, lo he instalado buscando en el market place:


Lo configuramos en la pestaña de servers:


Cuidado porque nos pedirá usar la JDK, no vale con la JRE…



Arrancamos y comprobamos que va bien la cosa…





Vamos a comenzar con el modelo y el DAO:

JPA 2.0

La nueva versión de JPA no supone un impacto con respecto a la anterior. Básicamente las incorporaciones más importantes:

  • API de generación de Queries dinámicas mediante POO. Yo prefiero usar JPQL, pero…es cuestión de gustos
  • Tatatachán….delete orphans is here….¿ al estilo hibernate ? pues no. No es igual. Aquí es algo más parecido a un borrado en cascada.
    En hibernate significaba que si sacas un elemento de la colección, se borraba automáticamente.
    No entiendo entonces su aportación, ya que esto se podía hacer con operaciones en cascada en el otro lado de la relación.
  • Se incluye el bloqueo pesimista (el select … for update)
  • Se aumenta la sintaxis de JPQL
  • API de caché de segundo nivel
  • La anotación @OrderColumn para mantener el orden de colecciones

Vamos a crearnos un proyecto maven (webapp) que nos va a servir para los ejemplos usando el plugin IAM de eclipse:







Debéis cambiar el web.xml para que utilice los namespaces de la nueva versión:

Ahora es momento de seleccionar una implementación de JPA…Os dejo un enlace muy interesante con comparaciones entre
las implementaciones más comunes. Yo iba a elegir la implementación de Hibernate antes de ver esto, pero ahora con más razón:
Ver comparaciones JPA

Configuremos el pom.xml:

Ahora configuraremos el fichero persistence.xml en: src/main/resources/META-INF

Nos creamos nuestras clases del modelo. Como en sus sistema de citas:

Una vez creado nuestro modelo, empezaremos con el DAO, pero para eso nos apoyaremos en EJB 3.1:

EJB 3.1

La nueva versión de EJB da un salto más hacia la simplicidad, es decir, mucho más con mucho menos.
Entre las cosas más interesantes:

  • Se marcan para eliminar: Entity Bean 2.X, EJB QL, JAX-RPC.
  • No son obligatorios los interfaces locales y remotos en Session Beans
  • Podemos desplegar EJBs en un war.
  • API Estandar para contenedores embebidos. Lo que simplificará bastante nuestras pruebas unitarias de EJBs
  • Por fin…el Singleton EJB
  • Se amplía bastante el Timer Service, sobre todo la capacidad de scheduling…
  • Llamadas asíncronas a métodos de EJBs por fin. Antes teníamos que montar un circo a través de colas, MDBs etc… para una simple llamada no bloqueante.
  • Estandarización de los nombres JNDI de los EJBs… Esto definitivamente está muy bien.
  • AOP…Interceptores y cosillas así.

Probaremos algunas de estas cosas a lo largo del tutorial.
Vamos ahora a crearnos un simple Dao para nuestro proyecto de citas con EJBs.
Primero definimos el interfaz del Dao:

A continuación, lo implementamos con JPA en un EJB:

Fijáos que no hemos marcado en ningún momento, ni el interfaz ni en la clase @Remote ni @Local
ni nada similar. Tampoco hemos creado ningún proyecto diferente de tipo ejb o jar. Es decir, el EJB
va a estar en el proyecto web.

Ahora, todo código que se precie debería se acompañado con una o varias pruebas unitarias que certifiquen
que la cosa funciona. Creo el Test y una clase de Utilidades para levantar el contenedor:

Esperad… no le déis todavía al test que todavía hemos de configurar unas cosillas.
Para que el embedded container funcione correctamente necesitamos un fichero de configuración
llamado domain.xml, y para evitar una excepción, el fichero server.policy en las rutas de la imágen:



Esos ficheros los podéis obtener de la instalación del glassfish que os habéis descargado o en el
fichero: glassfish-embedded-all-3.0.1.jar (lo tendréis en el repositorio local de maven en [RUTA_REPO]\.m2\org\glassfish\extras\)
Eso es lo que hice yo… Vosotros tenéis los del ejemplo.
Ahora debemos configurar en el fichero domain.xml el datasource de nuestras citas. Os pongo únicamente lo que hay que incluir:

Ahora sí…dale al botón de probar el DaoTest (con JUnit) …o bien desde la consola. Veréis como se levanta
el contenedor embebido, se despliegan los ejbs, el datasource y se cierra al final del los tests:



Y lo mejor es que funciona.

Vamos a continuar haciendo un poco de negocio.
Vamos a crearnos un Stateless y le llamaremos CitasManager.
Éste nos servirá para probar algunas cosas nuevas:

Ahora haremos un test para probarlo…

Ejecutadlo y veréis como todo esto funciona. AOP con el @AroundInvoke (mirad las trazas), los métodos asíncronos,
la inyección de dependencias con @EJB, etc. También he incluido un ejemplo de crear un recordatorio de citas usando Timers.

Ahora lo ejecuto desde la consola de maven:

Bueno, ahora tenemos que empezar con la vista. En esta primera parte únicamente desplegaremos la aplicación
en el glassfish y comprobaremos que se despliega bien.
Antes de eso, debemos configurar también el datasource en el fichero domain.xml de vuestra instalación
tal y cómo lo hemos hecho en el de los tests. La ruta (por si no lo encontráis es [RUTA_GLASSFISH]\domains\domain1\config)

Una vez hecho esto, basta con agregar nuestra aplicación en la pestaña servers.
Seleccionad el servidor glassfish, pulsad el botón derecho y ejecutad Add and Remove…:



Ahora arrancar el servidor pulsando en start:



Vamos a comprobar que se ha desplegado bien. Desde la consola usaremos las herramientas de administración de glassfish: [RUTA_GLASSFISH]\bin]
Ejecutamos:



Y comprobamos que nuestra aplicación es: ejb y web.
Podemos entrar ahora en http://localhost:8080/citas/ y veréis la página que nos creó el arquetipo de maven: Hello World

Vamos con la vista

Para la vista usaremos evidentemente JSF 2.0 + Facelets. Entre las cosas nuevas de JSF 2:

  • Facelets ya forma parte de JSF. No sólo plantillas sino además componentes por composición.
  • Ãmbitos nuevos para los controladores (View y Component).
  • Hola a nuevas anotaciones, adios a los descriptores (o hasta luego, es decir, no se eliminan).
  • Soporte nativo para Ajax.
  • Se incluye un nuevo mecanismo para recuperar recursos (imágenes, css, js …) desde el classpath (En wuija hacíamos lo mismo, aunque supongo que se habrán inspirado en RichFaces)

Os recomiendo el tutorial de Alex antes de empezar, porque yo no me voy a entretener tanto a explicar las cosas: JSF 2

Vamos primero a incluir en el pom.xml la dependencia a JSF 2 y alguna más:

Ahora configuraremos JSF en el web.xml

En el código del listener podréis comprobar que rellena datos si no hay. Recordad que cuando despleguéis la aplicación
debemos tener configurado en el servidor el datasource que estamos usando, tal y como lo hicimos para el contenedor embebido.

Ahora necesitamos el faces-config.xml donde configuraremos el fichero de mensajes i18n. Este fichero está en resources

Ahora nos vamos a crear un view helper en formato ManagedBean (que es el apropiado en estos charcos). Le llamamos CitasController y le decimos que tiene ámbito de session:

Ahora nos creamos nuestras primeras páginas:

  • /WEB-INF/templates/defaultLayout.xhtml. Plantilla maestra que dará estructura a nuestras páginas. Creamos una forma sencilla con cabecera, cuerpo y pie.
  • /home.xhtml . Será nuestra página de inicio y usará la plantilla anterior.
  • Cambiamos index.jsp para apuntar a la home.

Os muestro nuestra home:

Si desplegamos la aplicación y navegamos a ella, mostrará: (si, es que desde que España ha ganado el mundial,
por estos lares nos sentimos especialmente españoles):



Vamos a continuar creando la página de entrada de una cita:

También hemos usado el converter «selectItemsConverter». Este converter lo he cogido del tutorial de JSF de Alex que os indicaba arriba.

Si pulsamos sobre «Crear una nueva Cita»:



Si guardamos:


Conclusiones

En cuanto a lo visto a JEE6 me gusta lo que va apareciendo. Todavía sigo pensando que prefiero
usar Hibernate + Spring para el Dao y el negocio que me aportan lo que realmente se necesita para hacer la mayor parte de
las aplicaciones Web y me basta un tomcat para desplegarlo, ya que se agiliza bastante el desarrollo.

Aunque la cosa es que ya me empieza resultar tentador…

He encontrado algunos problemas a la hora de usar el contenedor embebido y el plugin de glassfish para eclipse. En cuanto al primero he encontrado
el problema de la falta de documentación. En cuanto a lo segundo, supongo que se irá afinando en futuras versiones del mismo.

3 Comentarios

  1. Joer que mezcla de gustazo, pique sano y agradecimiento siento al leeros, de verdaz que si el mundo entendiera de informática, que se quitaran los Piques, Casillas y demás… chavales 😉 Vaya equipazo tenéis por Autentia…

  2. Hola Javier gracias por este tutorial esta muy bueno, queria pedirte colaboracion es que estoy tratando de pintar un combo de paises y pues como tu sabes sin necesidad de que haya una accion el debe consultar inicialmente la lista, entonces en el constructor de me Managedbean llamo a un metodo del EJB que me trae la lista pero me sale que esta nulo la instancia remota del ejb, pero cuando lo llamo desde una accion de la vista funciona perfectamente… agradezco si me podes colaborar

  3. Hola Javier,
    Me he bajado del código y al ejecutar el test, produce el siguiente error:

    java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName citas.

    Creo que el problema es que no encuentra el fichero persistence.xml.

Dejar respuesta

Please enter your comment!
Please enter your name here