lunes, 5 de marzo de 2012

Introducción a los EJB

En primer lugar un saludo a todos los lectores de este blog y las disculpas del caso por haber estado retirado tanto tiempo. Lo que sucede es que estuve dedicado de lleno al desarrollo de mi tesis de grado. Sumado a esto el tema laboral he tenido poco tiempo para volver a postear... pero aquí estamos de nuevo, listos para seguir compartiendo el conocimiento y eso es lo más importante. Para volver a tomar el ritmo quiero presentarles en esta oportunidad un artículo dedicado a uno de los componentes más interesantes de la edición empresarial de Java: !Los EJB! - Y es que últimamente el desarrollo de aplicaciones compartidas es el común denominador al que tenemos que hacer frente la gente que estámos inmersos en el mundo Java.
Una aplicación compartida es aquella aplicación en la cuál no todos sus componentes se encuentran en la misma computadora, es decir no corren bajo la misma máquina virtual.
Y esta tendencia a desarrollar este tipo de aplicaciones se debe a una serie de factores derivados de buenas prácticas y patrones de desarrollo, entre ellos la reutilización de componentes, que ha sido una práctica que ha venido siendo aplicada desde la génesis de la programación (de diferentes maneras obviamente). Sin embargo los EJB llevan esto a otro nivel y en este post hablaremos de ello.

Para entender mejor lo que son los EJB y su arquitectura (Figura 1) vamos a poner un ejemplo sencillo. Supongamos que queremos desarrollar una aplicación para la autenticación de usuarios de un banco.

Figura 1. Arquitectura de los EJB 

Lo primero que se nos ocurre es desarrollar una aplicación la cuál preguntará al usuario su número de cuenta y su clave bancaria, luego se conectará a la base de datos y comprobará la existencia de por lo menos un registro perteneciente a este usuario. Con esto nuestra aplicación tendría la arquitectura mostrada en la Figura 2.

Figura 2. Arquitectura un sistema transaccional tradicional

A pesar de ser un sistema funcional lo primero que podemos notar es que no se trata de una aplicación compartida pues todo se ejecuta dentro del ámbito de una sola aplicación. Es una arquitectura sencilla, es cierto!!!... pero esta facilidad de implementación podría llevarnos a futuros problemas frente a cambios en las especificaciones de la aplicación que estamos desarrollando. Toda la funcionalidad del software se encuentra altamente acoplada por lo que se necesitará distribuir las funciones en diferentes componentes específicos. A estos componentes se les conoce como Enterprise JavaBeans (EJB). Los EJB vienen al rescate presentándonos una arquitectura distinta, en donde se dividirá la aplicación en distintos dominios. Cada dominio será gobernado por EJB's que se encargarán de realizar determinada tarea como el establecer la conexión a bases de datos, otros se encargarán de manejar las sesiones y otros de la presentación de la información y el modo en que esta es accesada. 

!La solución está dada! - Evidentemente la documentación sobre esto es abundante y creo que con lo que se ha comentado anteriormente es suficiente para comprender un poco de lo que son los EJB y la forma en que segmentan la lógica de nuestras aplicaciones. Quizás lo tratado anteriormente carece de importancia para muchos pero considero que un ejemplo práctico, para aclarar el panorama, siempre es bueno antes de adentrarnos en el desarrollo en sí.

Bueno, ahora vamos a desarrollar una aplicación en donde usaremos EJB para autenticarnos como usuarios para lo cuál usaremos un EJB de Sesión sin Estado (Stateless) [Más acerca de los EJB] pues el usuario realiza una consulta, recibe el resultado y ahí finaliza todo el proceso.

Para empezar vamos a crear una aplicación empresarial en Netbeans para lo cuál hacemos lo siguiente:

Abrimos el asistente para la creación de proyetos y seleccionamos Enterprise Application:


Le colocamos un nombre a nuestro proyecto (BancoBean).


Seleccionamos nuestro servidor (Glassfish 3.1 en nuestro) caso y finalizamos el asistente.


Realizados todos estos pasos debemos tener algo como esto:


El primer proyecto es el que se encarga de gestionar y contener a los otros proyectos que se muestran bajo este (BancoBean-ejb y BancoBean-war). En el proyecto contenedor no se agregará ninguna clase java pues este solo manejará a los otros dos proyectos para lo cuál necesitará solamente algunos detalles de configuración. Ahora agregamos un nuevo paquete en nuestro proyecto BancoBean-ejb el cuál se encargará de la validación de nuestro usuario.


Ahora creamos nuestro EJB (AutenticadorBean) usando el asistente tal como se muestra en la siguiente figura:


Será un EJB de sesión sin estado por la razón que ya se comentó anteriormente. Podemos observar, además, que existe la posibilidad de crear una Interfaz, ya se Local, Remota o ambas. Cada EJB ofrece determinados métodos que pueden ser llamados por un cliente. También debe haber algunos métodos que naturalmente no deben ser públicos. Es por esta razón que un EJB debe implementar al menos una de estas interfaces, en donde se representarán los métodos públicos. La Interface Local posee métodos que pueden ser accedidos desde la misma máquina virtual mientras que la Interface Remota es para llamadas de métodos remotos. Como en nuestro caso usaremos nuestro EJB desde la misma aplicación, seleccionamos la opción Local.


Dentro de la Interface AunteticacionBeanLocal debe ir lo siguiente:
@Local
public interface AunteticacionBeanLocal {

    public boolean esUsuarioValido(String numeroCuenta, String password);
}
Y ahora la implementación del método:
@Stateless
public class AunteticacionBean implements AunteticacionBeanLocal {

    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
    @Override
    public boolean esUsuarioValido(
            String numeroCuenta, String password) {
        if (numeroCuenta.equals("test") && password.equals("123456")) {
            return true;
        }
        return false;
    }
}
Evidentemente en lugar de usar ese código podemos autenticar a nuestros usuarios utilizando información de una base de datos.

Ahora vamos a crear un paquete llamado com.blogspot.rolandopalermo.servlets en nuestro proyecto BancoBean-war de la siguiente manera:


Dentro de este paquete van a ir las clases que se van a encargar de invocar a los métodos de la interfaz local de nuestro EJB. Ahora con ayuda del asistente vamos a crear un servlet llamado ServletValidador.


Y configuramos los parámetros del servlet de la siguiente manera:
  • Name = ServletValidador
  • UrlPatterns: /servletValidador

Editamos el archivo index.jsp en nuestro proyecto BancoBean-war para el ingreso de los datos por parte del usuario.
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>JSP Page</title>
 </head>
 <body>
  <form action="servletValidador">
   <table border="0">
    <tbody>
     <tr>
      <td>Numero de cuenta</td>
      <td><input type="text" name="numeroCuenta" value="" /></td>
     </tr>
     <tr>
      <td>Contraseña</td>
      <td><input type="password" name="claveCuenta" value="" /></td>
     </tr>
    </tbody>
   </table>
   <input type="submit" value="Ingresar" />
  </form>
 </body>
</html>
Ahora en nuestro servlet agregamos el siguiente atributo con su respectiva anotación:
@EJB
private AunteticacionBeanLocal autenticador;
Y el método processRequest de nuestro servlet autenticador debe quedar así:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    try {
        String usuario = request.getParameter("numeroCuenta");
        String pass = request.getParameter("claveCuenta");
        if (autenticador.esUsuarioValido(usuario, pass)) {
            out.println("Correcto");
        } else {
            out.println("Incorrecto");
        }
    } finally {
        out.close();
    }
}

El proyecto que se debe ejecutar es el proyecto contenedor pues en caso contrario la aplicación no se desplegará correctamente. Lo que debemos observar es algo como esto:

Numero de cuenta
Contraseña


Al completar los campos requeridos nuestro servlet realizará la autenticación pero quien manejará la lógica de cómo se realizará este proceso es un EJB.

No es necesario profundizar más sobre los EJB para comprender su funcionamiento. Este solo ha sido un ejemplo básico del uso de los EJB que espero pueda servir de introducción a este componente que nos abre un mundo de posibilidades. Más adelante estaré posteando más artículos relacionados a los EJB y su integración con otras tecnologías como JPA y JSF 2.0.

Descarga el proyecto en el siguiente enlace:

Photobucket

Espero sus comentarios y sugerencias.

5 comentarios:

Anónimo dijo...

Muy bien explicado, el problema es que el proyecto no funciona, me parece que le hace falta el archivo web.xml
Saludos

Anónimo dijo...

Muy buena explicacion, aunque hay un error o algo sin aclarar: que los EJBs se encargan del desacoplamiento de un Application client y no de un Browser client; en este ultimo caso serían los componentes Servlet y JSP los que cumplirian esta funcion en el Web container. EJBs viven solo en el EJB container.
He dado mi punto de vista según informacion obtenida por manuales y tutoriales de libros de expertos en la materia y según mi entendimiento de las figuras gráficas expuestas por estos libros.
Gracias,
Juan

Anónimo dijo...

Excelente explicación ahora he entendido mas la funcionalidad. Solo me asalta la duda de como invocar los métodos desde otra aplicación. Gracias

Anónimo dijo...

Felicitaciones, muchas gracias por el tutorial,que bueno que existan personas con esta paciencia para compartir asi sus conocimientos

Pedro Díaz dijo...

Muy bueno el ejemplo para sentar las bases de lo que es un EJB. El siguiente ejemplo podría ser hacer uno de Sesión con Estado, que para un banco sería lo más apropiado.
Un saludo.

Publicar un comentario