Skip to content

11. Versión 6 - Integración de la capa web en una arquitectura de tres capas JSF / EJB

11.1. Arquitectura de la aplicación

La arquitectura de la aplicación web anterior era la siguiente:

Sustituimos la capa simulada [métier] por las capas [métier, DAO, jpa] implementadas mediante EJB en el apartado 7.1:

11.2. El proyecto NetBeans de la capa web

El proyecto NetBeans de la versión web n.º 2 se obtiene copiando el proyecto anterior:

  • [1]: se copia el nuevo proyecto y se pega en la pestaña [Projects],
  • [2]: se le asigna un nombre y se establece su carpeta,
  • [3]: el proyecto ya está creado,

El nuevo proyecto tiene el mismo nombre que el anterior. Lo cambiamos:

  • [4]: cambiamos el nombre del proyecto,
  • [5]: cambiamos su nombre, así como el de artifactID.

Tenemos que realizar pocos cambios para adaptar esta capa web a su nuevo entorno: la capa simulada [metier] debe sustituirse por la capa [metier, DAO, jpa] del servidor creado en el apartado 7.1. Para ello, hacemos dos cosas:

  • eliminamos los paquetes [exception, metier, jpa] que estaban presentes en el proyecto anterior.
  • Para compensar esta eliminación, añadimos a las dependencias del proyecto web el proyecto del servidor EJB creado en el apartado 7.1.
  • En [1], añadimos una dependencia al proyecto,
  • en [2], se selecciona el proyecto Maven de la capa [métier]. En [3], se especifica su tipo y en [4] su alcance. Este es provided para indicar que será proporcionado (provided) al módulo web por su entorno de trabajo. Pronto veremos que se lo proporcionará una aplicación empresarial,
  • en [5], se ha añadido la dependencia.

El archivo [pom.xml] queda entonces así:


<dependencies>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>mv-pam-ejb-metier-dao-eclipselink</artifactId>
      <version>${project.version}</version>
      <scope>provided</scope>
      <type>ejb</type>
    </dependency>
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-web-api</artifactId>
      <version>6.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

Ahora podemos eliminar los paquetes de la capa [métier] que ya no son necesarios:

  

También debemos modificar el código del bean [Form.java]:


public class Form {
  
  public Form() {
  }
  
  // capa de negocio
  private IMetierLocal metier=new Metier();
  
  // campos del formulario
...

La línea 7 instanciaba la capa simulada [métier]. Ahora debe hacer referencia a la capa real [métier]. El código anterior queda así:


public class Form {
  
  public Form() {
  }
  
  // capa de negocio
  @EJB
  private IMetierLocal metier;
  
  // campos del formulario

En la línea 7, la anotación @EJB indica al contenedor de servlets que va a ejecutar la capa web que debe inyectar en el campo metier de la capa 8 el EJB, que implementa la interfaz local IMetierLocal.

¿Por qué la interfaz local IMetierLocal en lugar de la interfaz IMetierRemote? Porque la capa web y la capa EJB se ejecutan en la misma JVM:

Las clases del contenedor de servlets pueden hacer referencia directamente a las clases EJB del contenedor EJB.

Eso es todo. Nuestra capa web está lista. La transformación ha sido sencilla porque nos habíamos encargado de simular la capa [métier] mediante una clase que respetaba la interfaz IMetierLocal implementada por la capa [métier] real.

11.3. El proyecto NetBeans de la aplicación empresarial

Una aplicación empresarial permite el despliegue simultáneo en un servidor de aplicaciones de la capa [web] y de la capa EJB de una aplicación, respectivamente en el contenedor de servlets y en el contenedor EJB.

Procedemos de la siguiente manera:

  • en [1], creamos un nuevo proyecto
  • en [2], seleccionamos la categoría [Maven]
  • en [3], seleccionamos el tipo [Enterprise Application]
  • en [4], se le da un nombre al proyecto
  • en [5], elegimos Java EE 6
  • en [6], un proyecto empresarial puede incluir hasta dos tipos de módulos:
    • un módulo EJB
    • un módulo web

Se puede solicitar, al mismo tiempo que la creación del proyecto empresarial, la creación de estos dos módulos, que estarán vacíos al principio. Un proyecto empresarial solo sirve para el despliegue de los módulos que forman parte de él. Aparte de eso, es una cáscara vacía. En este caso, queremos desplegar:

  • un módulo web existente, el [mv-pam-jsf2-alone]. Por lo tanto, no es necesario crear un nuevo módulo web.
  • un módulo EJB ya existente, [mv-pam-ejb-metier-dao-eclipselink]. En este caso tampoco es necesario crear uno nuevo.

En [6], creamos un proyecto empresarial sin módulos. Le añadiremos sus módulos web y EJB más adelante.

  • En [7] se han creado dos proyectos Maven. El proyecto empresarial es el que tiene el sufijo «ear». El otro proyecto es un proyecto Maven padre del anterior. No nos ocuparemos de él.

Añadimos el módulo web y el módulo EJB al proyecto empresarial:

  • en [1], añadimos una nueva dependencia,
  • en [2], añadimos el proyecto EJB [mv-pam-ejb-metier-dao-eclipselink]. Cabe destacar su tipo ejb,
  • en [3], se añade el proyecto web [mv-pam-jsf2-ejb]. Cabe destacar su tipo war.

El archivo [pom.xml] queda entonces así:


<dependencies>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>mv-pam-ejb-metier-dao-eclipselink</artifactId>
            <version>${project.version}</version>
            <type>ejb</type>
        </dependency>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>mv-pam-jsf2-ejb</artifactId>
            <version>${project.version}</version>
            <type>war</type>
        </dependency>
    </dependencies>

Antes de implementar la aplicación empresarial [mv-pam-webapp-ear], nos aseguraremos de que la base de datos MySQL [dbpam_eclipselink] exista y esté completa. Una vez hecho esto, podemos implementar la aplicación empresarial [mv-pam-webapp-ear]:

  • en [1], la aplicación empresarial se ha implementado
  • en [2], la aplicación empresarial [mv-pam-webapp-ear] se ha implementado correctamente.

En el navegador aparece la siguiente página:

  • en [1], la URL solicitada
  • en [2], la lista de empleados se ha rellenado con los elementos de la tabla [Employes] de la base de datos dbpam.

Se invita al lector a repetir las pruebas de la versión web n.º 1. A continuación se muestra un ejemplo de ejecución:

Image