Arquitectura JEE

Ramiro Lago (Abril 2007)

Introducción

Las razones que empujan a la creación de la plataforma JEE:

La plataforma JEE implica una forma de implementar y desplegar aplicaciones empresariales. La plataforma se ha abierto a numerosos fabricantes de software para conseguir satisfacer una amplia variedad de requisitos empresariales. La arquitectura JEE implica un modelo de aplicaciones distribuidas en diversas capas o niveles (tier). La capa cliente admite diversas tipos de clientes (HTML, Applet, aplicaciones Java, etc.). la capa intermedia (middle tier) contiene subcapas (el contenedor web y el contenedor EJB). La tercera capa dentro de esta visión sintética es la de de aplicaciones 'backend' como ERP, EIS, bases de datos, etc. Como se puede ver un concepto clave de la arquitectura es el de contenedor, que dicho de forma genérica no es más que un entorno de ejecución estandarizado que ofrece unos servicios por medio de componentes. Los componentes externos al contenedor tienen una forma estándar de acceder a los servicios de dicho contenedor, con independencia del fabricante.

Algunos tipos de contenedores:

Los contenedores incluyen descriptores de despliegue (deployment descriptors), que son archivos XML que nos sirven para configurar el entorno de ejecución: rutas de acceso a aplicaciones, control de transacciones, parámetros de inicialización, etc.

La plataforma JEE incluye APIs para el acceso a sistemas empresariales:

Documento de SUN: JEE blueprints

Documento de SUN: Tutorial sobre JEE 5

 

Servidor de aplicaciones JEE

A continuación vamos a entrar en más detalle. Para ello, hemos subrayado en el siguiente gráfico los elementos más importantes y usuales. La arquitectura de un servidor de aplicaciones incluye una serie de subsistemas:

Pero conviene empezar por el principio, es decir, el lenguaje básico de interconesión: el protocolo HTTP. Es un protocolo de aplicación, generalmente implementado sobre TCP/IP. Es un protocolo sin estado basado en solicitudes (request) y respuestas (response), que usa por defecto el puerto 8080:

¿Qué ocurre cuando un navegador invoca una aplicación? El cliente (el navegador) no invoca directamente el contenedor de aplicaciones, sino que llama al servidor web por medio de HTTP. El servidor web se interpone en la solicitud o invocación; siendo el servidor web el responsable de trasladar la solicitud al contenedor de aplicaciones.

Aspectos a considerar de forma síncrona:

Otros aspectos del contenedor web:

Un ejemplo de servlet

Para empezar a familiarizarnos con lo que es un servlet vamos a ver un pequeño ejemplo en el que se crea una página que contiene el típico "Hola mundo":


import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

public class Saludo extends HttpServlet {
   public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();
      out.println("<html>");
      out.println("<head><title>Bienvenido al primer servlet</title></head>");
      out.println("<body bgcolor=\"#FFFF9D\"><FONT color=\"#000080\" FACE=\"Arial,Helvetica,Times\" SIZE=2>"+
		  "<CENTER><H3>Servlets</H3></CENTER>");
      Date d = new Date();
      out.println("<HR><p>¡Hola Mundo!. Fecha y hora: " + d.toString() +  ". Esto es Java.</p>");
      out.println("</body></font></html>");
   }
}

La mayoría de servlets heredan de HttpServlet. La JVM del servidor de aplicaciones recibe una solicitud, para dar la respuesta realiza una serie de tareas::

Esto sólo es un pequeño anticipo de los que es un Servlet o un JSP. Los detalles del ciclo de vida de estas clase/páginas vendrán más adelante.

En el siguiente ejemplo de formulario en HTML podemos ver como se invoca al servlet anterior:


<form action="../../servlet/hola_mundo" method="get" target=_blank >
<p><input type="submit" name="Submit" value="Pulse aqui para llamar al servlet que saluda"></p>
</form>

El form en "real":

En la parte 'action' del formulario indicamos la URL o URI del recurso (en nuestro ejemplo es el servlet de saludo). Con el atributo 'method' indicamos el método de invocación. Con este método los parámetros de la solicitud aparecen explicitos, es decir, se incluyen en la URL de solicitud. Sin embargo con el método POST los parámetros quedan ocultos al cliente, ya que se transmiten en el cuerpo de la solicitud. El botón es el tipo 'submit', lo que indica que su pulsación disparará la acción (solicitud de recurso).

Para acceder a una introducción sobre servlets: JEE - Servlets - Introducción.

Las capas de la arquitectura

En la arquitectura JEE se contemplan cuatro capas, en función del tipo de servicio y contenedores:

La visión de la arquitectura es un esquema lógico, no físico. Cuando hablamos de capas nos referimos sobre todo a servicios diferentes (que pueden estar físicamente dentro de la misma máquina e incluso compartir servidor de aplicaciones y JVM)

 

A continuación veremos algunos de los diversos escenarios de aplicación de esta arquitectura

 

Escenario desde un navegador

Es el escenario canónico, donde aparecen todas las capas, empezando en un navegador HTML/XML. La generación de contenidos dinámicos se realiza normalmente en páginas JSP. La capa EJB nos permite desacoplar el acceso a datos EIS de la interacción final con el usuario que se produce en las páginas HTML y JSP:

 

XML utiliza HTTP como su soporte para el trasnporte.

Una pregunta muy común es cuando usar servlets y cuando usar páginas JSP. La pregunta es lógica, al fin y al cabo ambos mecanismos permiten generar contenidos dinámicos y además las JSP son servlets generados por el servidor de aplicaciones. La norma es que la mayor parte de las interacciones con el usuario se realizarán en las JSP debido a su flexibilidad, ya que integran de forma natural etiquetas HTML, XML, JSF, etc. Los servlets serán la excepción (un ejemplo típico es usar un servlet como controlador (un controlador recibe peticiones o eventos desde el interfaz de cliente y "sabe" el componente que debe invocar).

 

Escenario desde una aplicación

Podemos considerar que tenemos como cliente una aplicación stand-alone, que puede ser una aplicación Java o incluso un programa en Visual Basic. La aplicación puede acceder directamente a la capa EJB o a la base de datos del EIS (esto último por medio de JDBC):

 

Escenario basado en la web (web-centric application)

La plataforma JEE no obliga a usar en un sistema todas las capas. Lo esencial es escoger el mecanismo adecuado para el problema. En este sentido, en ocasiones no hay (ni prevemos que haya) la complejidad como para requerir una capa EJB. Se denomina escenario web-centric porque el contenedor web es el que realiza gran parte del trabajo del sistema:

 

En este tipo de escenario la capa web implica tanto lógica de presentación como lógica de negocio. Pero lo deseable es no mezclar todas las cosas, planteando un diseño limpio y modular. Para ello las JSP y servlets no suelen acceder de forma directa a la base de datos, sino que lo hacen por medio de un servicio de acceso a datos:

 

El escenario web-centric es el más ampliamente utilizado actualmente.

 

Nota sobre MVC

Es muy usual utilizar el patrón MVC como patrón arquitectónico. En este patrón ya sabemos que el modelo representa los datos y las reglas de negocio que determinan el acceso y modificación de los datos. La vista traduce los contenidos del modelo a un o unos modos de presentación. Cuando el modelo cambia, es responsabilidad de la vista mantener la consistencia de la presentación. El controlador define el comportamiento de la aplicación, es decir, asocia (map) las peticiones del usuario (captadas por botones, ítems de menú, etc.) con acciones realizadas por componentes del modelo. En una aplicación web las peticiones aparecen como peticiones HTTP que usan normalmente el método POST o GET para invocar a la capa web. El controlador es el responsable de seleccionar la vista que debe responder a la petición realizada por el usuario.

Ya dijimos en el escenario web-centric que en bastantes ocasiones las aplicaciones no requieren acceder a múltiples sistemas empresariales, es decir, la capa de lógica de negocio no requiere fuerte conectividad distribuida con sistemas empresariales. No se contemplan EJBs, pero esto no significa que desaparezcan los componentes del modelo, sino que los servicios del modelo se implementan en JavaBeans (no Enterprise JavaBeans) para ser utilizados por Servlets/JSP dentro de la capa web:

En una aplicación centrada en la capa Web sigue existiendo, aunque sea ligera, un modelo, que contiene entidades y reglas de negocio; es decir, el que no sean necesarios los EJB no implica no modularizar, mezclarlo todo y eliminar los componentes del modelo.

Nota: La especificación JEE no considera como componentes JEE a los Java Beans ya que son diferentes de los EJB (no confundirlos). La arquitectura de componentes JavaBeans se pueden utilizar tanto en la capa de cliente como de servidor, mientras que los componentes Enterprise JavaBeans sólo se utilizan en la capa de negocio como parte de los servicios del servidor.


Volver al índice