Último minuto

Tutorial: EJB 3.0 Enterprise Beans con NetBeans 5.5

Uno de los puntos fuertes e importantes de programar con Java Enteprise es la centralización del código de negocio usando EJBs.

De esta manera, cualquier aplicación (ya sea web o desde una aplicación cliente desktop) siempre tendrán la misma lógica.

El problema era que hasta antes de la versión 3.0 de EJB la programación era realmente pesada. Aprender lo que eran los beans de sesión (con estado y sin estado), crear interfaces y usar clases como javax.ejb.SessionBean, codificando los archivos de despliegue (y que eran diferentes entre los diferentes contenedores como JBoss, Jonas, etc) y no sé que tanto más... era un lío. Personalmente no me apetecía aprenderlo... ni usando los IDE más sofisticados como NetBeans, JBuilder, JDevelopment... nada.. me quedaría programando en web y listo.

Pero no pude huir fácilmente... aún la necesidad de utilizar un solo código de negocio para varias aplicaciones me rondaba.

Hasta que salió el Java EE 5.


Tuve mis dudas, pensé que sería lo mismo que antes pero más pesado. Pero no. Ahora está todo más simplificado, porque utiliza muchas características de Java SE 5.0. Una de ellas, la de usar anotaciones para simplificar código que se utilizaba en una archivo de despliegue.

Leí el tutorial "EJB 3.0 Enterprise Beans" de netbeans.org. y es lo que me ha motivado el traducirlo en este post.

Necesitamos para ello

  • (Obviamente) NetBeans 5.5 ó 5.5.1 instalado (a la publicación de este post, aún no ha salido oficialmente la versión 6, así que usaré lo que está en versión estable)

  • NetBeans Enterprise Pack. El cual se puede obtener desde aquí: http://www.netbeans.org/products/enterprise/

Comencemos ahora

Creando un proyecto de aplicación empresarial

El objetivo de este ejercicio es crear un proyecto de aplicación empresarial llamada NewsApp el cual contendrá un módulo EJB y un módulo web. La aplicación NewsApp usa un bean message-driven para recibir y procesar mensajes enviados por un servlet a la cola. La aplicación usa servlets para enviar mensajes al bean message-driven y para mostrar mensajes.”

Creando una aplicación empresarial

  1. Seleccione File > New Project del menú principal. O presione Ctrl + Mayus + N.

  2. Seleccione Enterprise Application desde la categorìa Enterprise tal como se muestra en la siguiente ventana.


    Haga clic en Next.

  3. Escriba como nombre del proyecto NewsApp y establezca como servidor a Sun Java System Application Server.

  4. Establezxca la versión de J2EE a Java EE 5, y seleccione Create EJB Module y Create Web Application Module, si no está seleccionado.

  5. Haga clic en Finish.

Resumen

En este ejercicio hemos creado una aplicación empresarial Java EE 5 que contiene un módulo EJB y un módulo web.”

Codificando el módulo EJB

En este ejercicio crearemos objetos en el módulo EJB. Crearemos una clase entidad, un bean message-driven y una fachada (façade) de sesión. También crearemos una unidad de persistencia que proporcionará el contenedor con información para administrar nuestras entidades, y los recursos del servicio de mensajería java (JMS) que manejará nuestros beans message-driven”.

Creando una Unidad de Persistencia

Primero crearemos una unidad de persistencia que define el origen de datos y el administrador de entidades que se usarán en nuestro proyecto.

  1. Hacer clic derecho en el módulo EJB y seleccionar New > File / Folder

  2. De la categoría Persistence seleccionamos Persistence Unit.

    Hacemos clic en "Next".
  3. Utilizaremos los valores por defecto que se muestra en la ventana.
    Además, seleccionamos como Data Source el valor jdbc/sample.
  4. Hacemos clic en Finish.
El IDE habrá creado el archivo persistence.xml y lo mostrará en el editor de código en vista de diseño.

Cerrar el archivo persistence.xml.

Creando la clase entidad NewsEntity

En este ejercicio crearemos la clase entidad NewsEntity. Para conocer más sobre lo que es una clase entidad, revisar las siguientes entradas:
Para crear la clase NewsEntity, haremos lo siguiente:
  1. Clic derecho sobre el módulo EJB en la venta de proyectos, y seleccionar New > File / Folder para abrir el asistente de New File
  2. De la categoría Persistence, seleccione Entity Class

    Clic en Next
  3. Escriba como nombre de la clase NewsEntity y como paquete ejb y dejar el tipo de la clave primaria con el valor Long

    Clic en Finish
Agregue dos propiedades de tipo String: body y title. Puede usar el nodo de "Bean Patterns" de la clase para hacerlo más rápido. Debería quedar así:

Creando el bean Message-Driven NewMessage

Ahora crearemos el bean message-driven NewMessage en nuestró módulo EJB. Usaremos el asistente New Message-Driven para crear el bean y los recursos JMS necesarios.
Para crear el bean message-driven usaremos el asistente del IDE. Para ello haremos lo siguiente:
  1. Clic derecho en el módulo EJB, seleccionar New > File /Folder.
  2. De la categoría Enterprise seleccionamos Message-Driven Bean
    Clic en Next
  3. Escribimos como nombre NewMessage, como paquete ejb, y como Destination Type el valor Queue seleccionado, tal como se ve en la siguiente imagen:
    Clic en Finish
Al finalizar, la clase bean message-driven NewMessage.java ha sido creado, y se abre su código fuente en el editor de código.
Notará que existe la siguiente anotación:
Esta anotación dice al contenedor que el componente es un bean message-driven (bean manejador de mensajes) y cual es el recurso JMS usado por el bean. Cuando el IDE genera la clase, el nombre del mapeo del recurso (jms/NewMessage) está derivado del nombre de la clase (NewMessage.java). El recurso JMS está mapeado al nombre JNDI del destino desde el cual el bean recibirá los mensajes. El asistente New Message-Driven Bean ha creado el recurso JMS por nosotros. El API EJB 3.0 nos permite buscar objetos en nombres de spacio JNDI desde la clase bean que queramos sin necesidad de configurar descriptores de despliegue que especifican los recursos JMS.

Las especificaciones de EJB 3.0 nos permite usar anotaciones para introducir recursos directamente en las clases. Ahora usaremos anotaciones para introducir el recurso MessageDrivenContext dentro de nuestra clase, y luego insertaremos el recurso PersistenceContext el cual será usado por el API EntityManager que maneja la persistencia de entidades. Agregaremos las anotaciones a la clase desde el editor de código.
  1. Agregamos las siguientes líneas después de la declaración de la clase.
    Recomiendo usar el autollenado del IDE presionando Ctrl + Espacio cuando se escriba la anotación y el tipo MessageDrivenContext.
  2. En el fondo del código fuente hacemos clic derecho, luego seleccionamos Persistence > Use Entity Manager.
    Esto convertirá el código a lo siguiente:
  3. Cambiar el nombre del método persist() a save() y modificar el contenido para que luzca así:
  4. Modificar el método onMessage() para que luzca así:
  5. Grabamos el archivo.

Creando el Bean de Sesión

Ahora crearemos una fachada de sesión para la clase entidad NewsEntity. Para ello, hagamos lo siguiente:
  1. Clic derecho sobre el módulo EJB y seleccionar New > File / Folder.
  2. De la categoría Persistence, seleccionar Session Beans for Entity Classes
    Clic en Next
  3. De la lista de clases entidad disponible, seleccionar NewsEntity y haga clic en Add.

    Clic en Next
  4. Verificar que el paquete sea ejb y que la interfaz local se crearán.
    Clic en Finish
Al finalizar, la clase fachada de sesión NewsEntityFacade.java se habrá creado y abierto en el editor de código. El IDE también creará la interfaz local NewsEntityFacadeLocal.java

La tecnología EJB 3.0 simplifica la creación de beans de sesión reduciendo considerablemente el código necesario. Puedes ver que la anotación @Stateless se está usando para declarar la clase como un componente bean de sesión sin estado y que la clase no necesita una implementación de javax.ejb.SessionBean. El código también está mucho más limpio porque con la tecnología EJB 3.0 los métodos de negocio ya no necesitan de excepciones verificadas (o sea, que utilice alguna sentencia throws)

Puedes ver que el recursos PersistenceContext fue insertada directamente al componente bean de sesión cuando se creó la fachada de sesión.

Resumen

En este ejercicio, hemos codificado una clase entidad y un bean manejador de mensajes (message-driven) en el módulo EJB. Luego hemos creado una fachada de sesión para la clase entidad. También hemos creado los recursos JMS que serán usados por nuestra aplicación.

Codificando el módulo Web

Ahora crearemos dos servlets: ListNews y PostMessage. Se encargarán de listar los registros y agregar mensajes respectivamente.

Creando el servlet ListNews

En este ejercicio crearemos un servlet simple para mostrar nuestros datos. Usaremos anotaciones para llamar a nuestro bean de entidad desde nuestro servlet.
  1. Clic derecho sobre el módulo web, y seleccionar New > Servlet
  2. Escribimos ListNews para el nombre de la clase, y escribimos web como nombre de paquete.
    Clic en Finish
Con esto, la clase ListNews.java se abrirá en el editor de código. En él haremos lo siguiente.
  1. Clic derecho en el código fuente y seleccionar Enterprise Resources > Call Enterprise Bean.
  2. En la ventana de diálogo Call Enterprise Bean, seleccionar NewsEntityFacade y hacer clic en OK.

    Con esto, el recurso bean de entidad será insertado en el servlet usando la anotación @EJB
  3. Modificar el método proccessRequest() con el siguiente contenido:
    No olvidar escribir los nombres de las clases presionando Ctrl + Espacio para abrir el autollenado, y de paso hace los imports necesario. También podría presionar Alt + Mayúsculas + F para generar los imports necesarios.
  4. Guardamos los cambios del archivo.

Creando el servlet PostMessage

Ahora creamores el servlet PostMessage que se encargará de enviar mensajes al contenedor EJB. Usaremos anotaciones para insertar recursos JMS al servlet, especificando el nombre de la variable y el nombre de su mapeo. Luego agregaremos el código para enviar el mensaje JMS y mostraremos un formulario web para agregar un mensaje.
  1. Clic derecho sobre el proyecto módulo web y seleccionar New > Servlet
  2. Escribir PostMessage para el nombre de clase, y web para el nombre del paquete.
    Clic en Finish
Al terminar, la clase PostMessage.java se abrirá en el editor de código. Ahora haremos lo siguiente en el editor:
  1. Escribimos las siguientes anotaciones para insertar los recursos ConnectionFactory y Queue seguido de la declaración de sus respectivas variables.

  2. Ahora agregaremos el siguiente código que permitirá leer los valores de los parámetros enviados por el formulario, creará un objeto NewsEntity y lo enviará al JMS.
  3. Ahora editamos la salida que dará el servlet, que será el formulario. Este código debe estar después del código anterior. Ambos hacen el método processRequest()

  4. Guardamos los cambios.

Ejecutando el proyecto

Ahora, nos toca apreciar la melodía de la orquesta. Como queremos que se muestre el listado de nuestros datos (que es el servlet /ListNews) haremos lo siguiente.
  1. Clic derecho sobre el nodo de la aplicación NewsApp y seleccionamos Properties.
  2. Seleccionamos Run en el panel Categories
  3. En el campo Relative URL, escribimos /ListNews
  4. Clic en OK
  5. En la ventana de proyectos, clic derecho sobre el nodo de la aplicación enterprise NewsApp y seleccionar Run Project.
Con esto, se creará la tabla NEWSENTITY en la base de datos sample de Derby (podemos presionar las teclas Ctrl + 5 y ver dentro del nodo Databases la conexión a la base de datos jdbc:derby://localhost:1527/sample. Abrimos esa conexión - usuario app / password app - y podemos ver la tabla creada, y ver sus registros), se cargará el contenedor EJB, y el contenedor web.

En nuestro navegador se verá el listado de registros (la primera vez no habrá nada, claro) y al hacer clic en Add new message nos presentará el formulario para registrar un mensaje.

Pruébalo... y piensa dónde más lo puedes utilizar. Tus aplicaciones enterprise serán mucho más fáciles de hacer.

Investiga

Nunca encontrarás todo lo que necesitas en una web. Solo encontrarás partes que juntándolas harás algo nuevo. Así que, trata de modificar la aplicación para que funcione con JSF.

Recursos


El proyecto que desarrollé lo puedes descargar de aquí: http://diesil-java.googlecode.com/files/newsapp.tar.gz