Construir Aplicaciones EJB con JBoss, Lomboz y Eclipse

Esta p�gina cubre c�mo crear un componente EJB de sesi�n sin estado. Este bean ser� el responsable de autenficiar al usuario comunic�ndose con la base de datos utilizando un DAO (Data Access Objetc) que encapsula el c�digo JDBC. Un DAO tiene todos los atributos (campos) y comportamientos (m�todos) correspondientes al bean que lo est� utilizando.

A todos los clientes, suministradores y managers de MyStore se les ha suministrado un nombre de usuario y un userid para acceder a los servicios de MyStore, pero para poder acceder a estos servicios todas est�s entidades primero tienen que entrar (login) en el sistema (MyStore). El m�todo de autentificaci�n se llama loginUser, y toma dos par�metros String: username y password y devuelve el userID si la autenficaci�n tuvo �xito.

Nota:
El m�todo loginUser es un m�todo de negocio, normalmente los m�todos de negocio llevan a cabo operaciones o procesamientos de valores sobre componentes EJB. Desde la perpectiva de los clientes, ellos s�lo pueden ver los m�todos de negocio e invocarlos sobre un bean.

.�Crear el Proyecto J2EE:

Bien, empezemos a escribir el primer componente de este tutorial:

  • Ve a File > New > LombozJ2EE Project, aparecer� el wizard de creacci�n de proyectos.
  • Pon MyStore como nombre del proyecto y pulsa Next .
  • Debajo de Java Settings Check source, deber�a est�r MyStore/src, las librer�as deber�an apuntar a $JAVA_HOME, luego pulsa Next.
  • Nota:
    Este paso se vi� en p�ginas anteriores, pero debido a un bug en Eclipse 2.1, es importante chequear que la configuraci�n de las librer�as es la adecuada.
  • Dentro de Create J2EE Module, selecciona la pesta�a Web Modules y pulsa Add.., introduce OnlineStore como el nombre de m�dulo; y pulsa OK como se muestra en la siguiente figura:
  • Dentro de Create J2EE Module, selecciona la pesta�a EJB Modules y pulsa Add.., introduce MyStoreMgr como el nombre el m�dulo y pulsa OK.
  • Dentro de Create J2EE Module, selecciona la pesta�a Targeted Servers, selecciona JBOSS 3.2.1 ALL pulsa Add.. y luego Finish.

.�Crear el Bean sin Estado:

  • Ve a Package Explorer, expande el nodo Mystore, selecciona src, pulsa el bot�n derecho y aparecer� un men� desplegable.
  • En el men� ve a New > Lomboz EJB Creation Wizard.
  • Introduce au.com.tusc.session, como el nombre del paquete, StoreAccess como nombre del bean y selecciona el tipo de bean como stateless; pulsa Finish.

Esto crear� un paquete llamado au.com.tusc.session bajo src y tambi�n crear� el bean StoreAccessBean dentro de ese paquete, como se ve en la siguiente figura:

Como podr�s apreciar en la siguiente figura, se ha creado una etiqueta a nivel de clase (@ejb.bean), que tiene asignados el tipo del bean, su nombre y el nombre JNDI que se generar� en el interface Home. Esta etiqueta tambi�n generar� los descriptores de despliegue en los ficheros ejb-jar.xml y jboss.xml cuando generes tus clases EJB, lo que se cubrir� un poco m�s adelante.

Nota:
Esto generar� el nombre del bean, el nombre JNDI, y el tipo del bean que hay en el fichero. Tambi�n, se le a�ade Bean al nombre del fichero. De nuevo, hay que ser cuidadoso con las convenciones de nombrado, especificando s�lo el nombre del bean en el wizard sin a�adirle la palabra Bean ya que el wizard la a�adir� por nosotros.
Si expandes el nodo MyStoreMgr/META-INF dentro del explorador de paquetes ver�s que Lomboz ha generado siete ficheros utilizando Xdoclet como se ve en la siguiente figura:

Ahora vamos a generar todos los interfaces, incluyendo el Home, el Remote, el DAO y otras clases de ayuda. Explicaremos porqu� un poco m�s adelante, por el momento s�lo sigue estos pasos. Pero antes de que te excites demasiado hay algunos conceptos que cubrir.

  • Ve a MyStoreMgr/META-INF y selecciona o abre el fichero ejbGenerate.xml.
    Nota:
    Lomboz utiliza este fichero para generar los interfaces y clases de ayuda necesarias, por eso, en el caso de que tengas necesidades especiales tendr�s que personalizar este fichero. (Mira la documentaci�n de Xdoclet para m�s informaci�n).
    El fichero ejbGenerate.xml se genera s�lo una vez cuando creamos el m�dulo EJB. Por eso, cualquier cambio realizado en este fichero se reflejar� incluso si modificamos nuestra clase bean y generamos las clases una y otra vez.

    Como puedes ver a partir del fragmento de c�digo mostrado en la anterior figura, se han definido las siguientes etiquetas:

    • <dataobject/> genera objetos de datos para contener valores de campos persistentes del EJB, que corresponden con columnas en la tabla de la base de datos asociada
      Nota:
      <dataobject/> se ha quedado obsoleto en favor de Value Object que es m�s poderoso en t�rminos de relaciones (1-1, 1-n y n-m).
    • <utilobject/> Crea un m�todo para generaci�n de GUID y para acceder a los objetos Home local y remoto.
    • <remoteinterface/> Genera los interfaces remotos para EJBs.
    • <localinterface/> Genera los interfaces locales para EJBs.
    • <homeinterface/> Genera los interfaces home remotos para EJBs.
    • <localhomeinterface/> Genera los interaces home locales para EJBs.
    • <entitypk/> Genera clases de claves primarias para EJBs de entidad.
    • <entitybmp/> Crea clases de bean de entidad para EJBs de entidad BMP.
    • <entitycmp/> Crea clases de bean de entidad para EJBs de entidad CMP.
    • <session/> Genera clases de bean de sesi�n.
    Nota:
    No hay una etiqueta para generar un DAO.
    Por eso, tenemos que incluir esta etiqueta <dao/>.
    Si quieres ver m�s detalles, visita la documentaci�n de Xdoclet.

    Como puedes ver en este otro fragmento del c�digo tambi�n se han definido las siguientes etiquetas:

    • <jboss/> es una etiqueta espec�fica de JBOSS que �ste necesita. Tienes que especificar datasource, datasourcemapping y preferredrelationmapping. Como difieren seg�n las bases de datos, debes especificar los valores apropiados para tu entorno. Si comentamos estas etiquetas JBOSS utilizar� los valores por defecto correctos para la base de datos interna Hypersonic SQL, pero por el momento los rellenaremos de cualquier forma.

    Los otros dos ficheros importantes para nosotros son ejb-jar.xml y jboss.xml. El primero tiene todos los descriptores de despliegue para los beans y el segundo tiene los descriptores de despliegue espec�ficos de JBOSS requeridos por el propio JBOSS.

    Nota:
    El fichero ejb-jar.xml se genera cada vez que se generan las clases interfaces y de ayuda para nuestro bean. Para la primera vez, est� vac�o. jboss.xml tambi�n se generar� cada vez que generemos las clases de nuestro bean.

.�Configurar el DAO:

Ahora, personalicemos ejbGenerate.xml para configurar un DAO.

  • Hemos incluido una etiqueta <dao> que especifica el directorio de destino para el interface DAO generado y qu� patr�n utilizar:

  • Hemos incluido el datasource, el datasoucremapping y el preferredrelationmapping mostrados en el siguiente fragmento de c�digo:
    1. datasource="java:/DefaultDS" es un nombre JNDI local para la fuente de datos a utilizar.
    2. datsourcemapping="Hypersonic SQL" mapea los objetos/valores a las columnas y los tipos de datos asociados con esas columnas.
    3. preferredrelationmapping="foreign-key" define el tipo de base de datos a utilizar.

    Como est�mos utilizando la base de datos Hypersonic, estos par�metros son los apropiados. Estos par�metros est�n relacionado con el fichero de configuraci�n standardjbosscmp-jdbc.xml que controla los mapeos CMP-a-JDBC para JBOSS. Este fichero reside en $JBOSS_HOME/server/conf/. Abajo puedes ver un fragmento del c�digo de standardjbosscmp-jdbc.xml:

Nota:
La forma en que trabaja Xdoclet es un poco diferente de algunos estilos de programaci�n convencionales, las etiquetas de Xdoclet generar�n estos interfaces (home y remoto) junto con las clases de ayuda necesarias, que luego se utilizar�n en las clases del bean y de la implementaci�n de DAO. Sin embargo, hasta que no est�n generadas, no podemos escribir ning�n m�todo de negocio en el Bean ni envolturas JDBC en la clase de implementaci�n del DAO. Si esto te parece confuso simplemente sigue los pasos, espero que pronto se te aclare todo esto.

.�Crear el Interface DAO:

Como vamos a utilizar un DAO para acceder a la base de datos para este Bean sin estado, tenemos que crear una clase DAOImpl que implemente el interface DAO generado.

  • Ve a src y a�ade un paquete llamado au.com.tusc.dao; a�ade una clase llamada StoreAccessDAOImpl en ese paquete:
  • Ahora ve a tu clase Bean y declara esta etiqueta a nivel de clase (es decir, en la parte superior) para generar el interface DAO:
    @ejb.dao class="au.com.tusc.session.StoreAccessDAO"
     impl-class="au.com.tusc.dao.StoreAccessDAOImpl"
    
  • Expande el nodo StoreAccessBean en el explorador de paquetes. Pulsa con el bot�n derecho y aparecer� un men� desplegable. En ese men� ve a Lomboz J2EE > Add EJB to module, selecciona EJB '[MyStoreMgr]' y pulsa OK.
  • Expande el nodo MyStoreMgr bajo MyStore Project en el explorador de paquetes. Pulsa con el bot�n derecho y aparecer� un men� desplegable. Ve a Lomboz J2EE > Generate EJB Classes como se muestra en la siguiente figura:

Los interfaces EJB y las clases de ayuda se generan en el directorio ejbsrc/au.com.tusc.session como se muestra en la siguiente figura:

Se han generado 7 ficheros:

  • StoreAccess es el interface remoto.
  • StoreAccessLocal es el interface local.
  • StoreAccessSession extiende nuestra clase bean llamada StoreAccesBean.
  • StoreAccessHome es el interface home remoto.
  • StoreAccessLocalHome es el interface home local.
  • StoreAccessUtil es una clase de ayuda que tiene m�todos para acceder a los interfaces Home y LocalHome junto con la generaci�n del GUID.
  • StoreAccesDAO es el interface DAO que se utilizar� para implementar nuestro StoreAccessDAOImpl en au.com.tusc.dao.

StoreAccessDAO se genera mediante esta etiqueta declarada en StoreAccesBean. Si no declaras esta etiqueta en este fichero no se generar� este interface:

@ejb.dao class=au.com.tusc.session.StoreAccessDAO
   impl-class=au.com.tusc.dao.StoreAccessDAOImpl

Otros ficheros de inter�s que se generan son ejb-jar.xml y jboss.xml en MyStoreMgr/META-INF.

Como se muestra en la siguiente figura, se han generado unos nuevos descriptores en el fichero ejb-jar.xml:

Estos descriptores se han generado mediante la siguiente etiqueta declarada en el fichero StoreAccesBean:

@ejb.bean name ="StoreAccess"
  jndi-name="StoreAccessBean"
  type="Stateless"

Esta etiqueta la a�adi� Lomboz en el wizard de creaci�n del bean.

Esta etiqueta tambi�n genera los siguientes descriptores de despliegue en jboss.xml como se ve en el siguiente fragmento:

Entonces, ya sabes cuales son las clases responsables de generar las clases, los interfaces y los descriptores.

.�A�adir un M�todo de Negocio:

El siguiente paso es a�adir un m�todo de negocio al bean.

  • Ve a StoreAccesBean pulsa con el bot�n derecho y selecciona New en el men� desplegable; selecciona Lomboz Ejb Method Wizard.
  • A�ade un m�todo de negocio con la siguiente firma:
     
    signature: public String loginUser (String username, String password).
    
  • Selecciona Method Type como Business e Interface como Remote como se ve en la siguiente figura:
  • Este wizard genera un m�todo loginUser en nuestra clase bean, con la etiqueta a nivel de m�todo @ejb.interface mostrada abajo:

    Esta etiqueta es la responsable de generar este m�todo en el Interface Remoto (en este caso es StoreAccess que se crear� una vez que generemos las clases. Esta etiqueta se cubrir� un poco m�s adelante.

    Ahora, este m�todo de negocio necesita invocar a un m�todo del DAO, atrav�s del que se comunicar� con la base de datos. Por lo tanto, a�adiremos otra etiqueta a este m�todo, para que en el interface DAO se genere un m�todo con esta firma, que podemos implementar en la clase DAOImpl. Entonces este m�todo de negocio puede invocar el m�todo de la clase DAOImpl para obtener el resultado deseado.

    @dao.call name="loginUser"

    A�ade esta etiqueta como se ve en la siguiente figura:

    Ahora genera de nuevo tus clases EJB como viste en los pasos anteriores.

    Nota:
    Ok, OK!, como referencia aqu� tienes los pasos que tienes que seguir:
    1. Expande el nodo MyStoreMgr en el proyecto MyStore en el Package Explorer.
    2. Pulsa con el bot�n derecho y aparecer� un men� desplegable.
    3. Ve a Lomboz J2EE > Generate EJB

    Despu�s de generar las clases, primero veremos el interface DAO generado y luego la clase Sessi�n.

  • En StoreAcessDAO se han generado dos m�todos:
    1. init() por defecto.
    2. loginUser(), generado por esta etiqueta:
      @dao.call name="loginUser"
    Nota:
    Por favor, no edites ninguna clase generada por Xdoclect.
  • En StoreAcessSession hay dos m�todos de interes:
    1. getDAO() crea un ejemplar de la clase DAOImpl.
    2. loginUser(), llama al m�todo loginUser de la clase DAOImpl, que tenemos que implementar.

    Fragmento de c�digo de StoreAccessSession:

.�Implementar el Interface DAO:

Ahora, implementaremos los m�todos de la clase StoreAccessDAOImpl:

  • Primero importamos los siguientes paquetes:
    javax.naming.InitialContext;
    javax.sql.DataSource;
    java.sql.Connection;
    java.sql.PreparedStatement;
    java.sql.ResultSet;
    java.sql.SQLException;
    
  • Cambia la declaraci�n de tu clase para que StoreAccessDAOImpl implemente StoreAccessDAO.
  • A�ade un campo para almacenar la referencia a la factor�a de recursos JDBC:
    private DataSource jdbcFactory;
  • En el m�todo init(), busca la referencia jdbc/DefaultDS utilizando el aPI JNDI, y almacena la referencia en la variable jdbcFactory.
    El string de b�squeda es java:comp/env/jdbc/DefaultDS.
  • En el m�todo loginUser(), primero obtenemos la conexi�n a la base de datos utilizando jdbcFactory.
  • Crea una sentencia SQL que busque el userid en la tabla StoreAccess donde userid y password se proporcionan para cada usuario.
  • Devuelve el userid si tiene �xito, si no lo tiene, lanza una SQLException.
  • Vuelve a tu m�todo loginUser en la clase StoreAccessBean, y a�ade algunas sentencias de depuraci�n como se muestra en este fragmento:
Nota:
No tenemos que llamar al m�todo loginUser de StoreAccessDAOImpl, ya que est� siendo invocado por el m�todo loginUser de la clase StoreAccessSession que desciende de la clase StoreAccessBean, es decir, la clase StoreAccessSession ha sobreescrito este m�todo.

Abajo puedes ver un fragmento de c�digo de StoreAccessSession:

.�A�adir M�todos de Retro-llamada:

Ahora, a�adiremos los siguientes m�todos de retrollamada a la clase StoreAccessBean:

  1. setSessionContext
  2. UnsetSessionContext
Nota:
Es el contenedor EJB el que invoca a estos m�todos de retro-llamada.
  • Importa la clase SessionContext
    import javax.ejb.SessionContext;
  • A�ade un campo para almacenar sessionContext:
    protected SessionContext ctx;
  • A�ade un m�todo setSessionContext con sessionContext como par�metro y asign�le a �ste la variable sessionContext como se muestra en el siguiente fragmento de c�digo:
  • De forma similar a�ade el m�todo unsetSessionContext, asigna un valor null a la variable, como has visto arriba.
  • Nota:
    La clase StoreAccessSession desciende de la clase abstracta StoreAccessBean e implementa SessionBean, que sobreescribir� todos los m�todos del interface SessionBean. Por eso, despu�s de finalizar estos m�todos de la clase bean, genera de nuevo tus clases EJB. Se sobreescribir�n los m�todos de SessionContext, como se ve en el siguiente fragmento de c�digo:

Ahora veamos los interfaces Home y Remote generados.

En el caso del interface Remote todos los m�todos de negocio declarados en el bean se han generado con la misma firma. Esto es a cusa de las etiquetas a nivel de clases declaradas en el bean StoreAccess que hemos discutido antes. Abajo puedes ver un fragmento del c�digo:

Por eso, loginUser se ha generado en un Interface Remote llamado StoreAccess como se ve abajo a causa de esta etiqueta:

En el caso del interface Home s�lo se ha creado un m�todo llamado create, que se genera por defecto a causa de la etiqueta <homeinterface/> que hay en ejbGenerate.xml como se ve abajo:

Adem�s de esto, est�n JNDI_NAME y COMP_NAME (que es el nombre l�gico para buscar el componente), estos se generan mediante la etiqueta declarada a nivel de clase en la clase StoreAccessBean, como se puede ver en la siguiente imagen:

Nota:
Para ver otras opciones asociadas con estas etiquetas no dudes en ojear la secci�n de ejbdoclet en la documentaci�n de Xdoclet.

Ahora que ya hemos cubierto todos estos aspectos y la funcionalidad de nuestro bean est� completa. Vamos a por los descriptores de despliegue...

.�Desplegar el Bean:

Para poder desplegar el bean hemos declarado unas cuantas etiquetas en la clase StoreAccessBean, como puedes ver en el siguiente c�digo:

  • A�ade esta etiqueta a nivel de clase (en la parte superior):
    @ejb.resource-ref res-ref-name="jdbc/DefaultDS"
    res-type="javax.sql.Datasource"
    res-auth="Container"
    

    Esta etiqueta generar� los descritores de despliegue en ejb-jar.xml, ya que el bean tiene que saber a qu� datasource te vas a conectar, de qu� tipo es, etc. Esto generar� estos descriptores como se muestra en el siguiente fragmento de c�digo:

  • A�ade esta etiqueta en StoreAccessBean a nivel de clase (en la parte superior):
    @jboss.resource-ref res-ref-name="jdbc/DefaultDS" jndi-name="java:/DefaultDS"
    

    Esta etiqueta generar� los descriptores de despliegue en jboss.xml, ya que el servidor de aplicaciones tiene que conocer el nombre JNDI del datasource con el que se tiene que registrar. Esto generar� los descriptores mostrados en el siguiente c�digo:

Ahora que todo est� completo, es hora de desplegar el bean.

  • Primero, regenera tus clases EJB siguiendo los pasos que hemos visto antes.
    Nota:
    Hemos generado las clases una y otra vez, para poder explicar cada paso y sus resultados. Una vez que est�s familiarizado con estos pasos dejar�s de necesitar estas iteracciones. De cualquier forma, no tiene importancia, ya que tu implementaci�n nunca se ver� modificada por este paso extra.
  • Ve a Lomboz J2EE View y expande el nodo MyStore , expande MyStoreMgr y selecciona Jboss 3.2.1 ALL.
  • Pulsa con el bot�n derecho y selecciona Debug Sever en el men� desplegable, como se ve en la siguiente figura:
  • Ve al nodo MyStoreMgr en la vista LombozJ2EE, pulsa con el bot�n derecho y selecciona Deploy en el men� desplegable:
  • Y ahora espera el resultado del despliegue. Si todo ha ido bien, ver�s en la consola un mensaje como �ste:

Ahora, ya hemos desplegado nuestro bean, s�lo nos queda crear un test de cliente que invoque el m�todo loginUser sobre StoreAccessBean...

.�Crear Nuestro Test de Cliente:

  • Ve al nodo Project MytStore, selecciona el nodo src y pulsa con el boton derecho.
  • Selecciona New en el men� desplegable; selecciona Lomboz EJB Test Client Wizard como se ve en la siguiente figura:
  • Seleciona au.com.tusc.client como el nombre del paquete, SessionClient como el nombre, au.com.tusc.session.StoreAccessHome como el EJB Home y au.com.tusc.session.StoreAccess como el EJB Interface, como se ve en la siguiente figura:

    Esto generar� los m�todos necesarios en nuestra clase SessionClient y s�lo tendremos que invocar al m�todo loginUser en el bean, como se ve abajo:

  • El �ltimo paso es escribir el c�digo de nuestro cliente:

    A�ade estas l�neas dentro del m�todo testBean, como se ve en la siguiente figura:

    System.out.println("Request from client : ");
    System.out.println("Reply from Server: Your userid is "+
    myBean.loginUser("ANDY","PASSWD"));
    

.�Probar Nuestro Cliente:

  • Ahora, para poder probar el cliente, selecciona el nodo SessionClient, vea al men� superior y selecciona el icono con el "hombre corriendo".
  • Selecciona Run as y selecciona Java Application, como se ve en la siguiente figura:
  • Ahora en tu consola, si obtienes una respuesta U2 para ANDY, quiere decir que tu llamada ha tenido �xito, como puedes ver en la siguiente imagen:
Nota:
Ahora ya has desplegado tu primer bean de sesi�n sin estado y lo has probado con �xito; a partir de ahora deber�as sentirte c�modo utilizando Lomboz. En el futuro no entraremos en los detalles de los pasos para utilizar Lomboz y nos concentraremos en otros aspectos de los beans.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO