lunes, 4 de abril de 2011

JEE5 – 2) Configuración y primera aplicación

El presente artículo y los artículos relacionados (JEE) se basan en lo presentado en el libro Beginning Java EE5 (Editorial Apress), en los manuales y tutoriales de Sun/Oracle, y en problemas/soluciones propias.

En esta entrada se realizarán las siguientes tareas:
  • Instalar y configurar Tomcat para trabajar con Eclipse Galileo 3.5.2.
  • Instalar y configurar JBoss 5.1.0 GA.
  • Crear una aplicación básica, desplegarla en Tomcat y JBoss y revisar de manera general su estructura y funcionamiento.
Instalar y configurar Tomcat en Eclipse Galileo
Antes de instalar y configurar de Apache Tomcat, se deben cumplir los siguientes puntos:
  • Instalar Java Development Kit 1.5. La versión que se utiliza en este caso es jdk1.5.0_22, la cual se puede descargar del sitio web de Oracle (jdk-1_5_0_22-windows-i586-p.exe).
  • Configurar la variable JAVA_HOME y agregar el directorio bin de la misma al path del sistema.
  • Configurar la variable JRE_HOME, apuntando al JRE full contenido en la instalación de JDK.
  • Descargar e instalar (descomprimir) Eclipse Galileo 3.5.2.

Puesto que mi sistema es Windows 7 a 64 bits, y dado que he instalado JDK para 32 bits, para poder usar Apache Tomcat 6 con dicho JDK he requerido descargar la distribución binaria de Apache Tomcat para 32 bits: apache-tomcat-6.0.32-windows-x86.zip.

Para instalar Tomcat 6.0.32 de 32 bits (distribución binaria), basta con descomprimirlo y seguir los pasos indicados en el archivo RUNNING.txt. Por defecto, Tomcat se levanta en el puerto 8080, y una vez iniciado debe ser posible validar su funcionamiento accediendo a http://localhost:8080.

Para proseguir, vale verificar que Eclipse utilice el JRE adecuado, lo cual se consigue con el menú [Window > Preferences > Java > Installed JREs].



Para configurar Tomcat en Eclipse, en la vista “Servers”, con el menú contextual para nuevo servidor se inicia el asistente. El nombre del servidor puede estar dado por el IP de la máquina.



El directorio de instalación de apache se denomina CATALINA_HOME, y se utiliza el JRE por defecto del entorno.



Dado que no existen proyectos creados, se pasa esta parte del asistente sin realizar acciones, y se lo finaliza.



Terminado el asistente, se crea un proyecto nuevo llamado “Servers”, el cual debe permanecer abierto para poder agregar proyectos al servidor Tomcat, así como para levantarlo.


Instalar JBoss
Dado que Tomcat es un Contenedor Web (Servlet/JSP) no es apropiado para desplegar EJBs; este trabajo es apropiado para un servidor de aplicaciones como JBoss. La versión que utilizo para este conjunto de entradas es JBoss 5.1.0 GA.

Para instalar y ejecutar JBoss, basta con descargar el comprimido del sitio de JBoss (jboss-5.1.0.GA.zip), y descomprimir el contenido a un directorio con permisos suficientes (En Windows suele ser conveniente hacerlo en una ruta como c:\java\jboss), dicho directorio puede ser llamado JBOSS_HOME.

Proyecto básico
Eclipse IDE cuenta con un sinnúmero de asistentes y poderosas herramientas para crear proyectos web y proyectos JEE; sin embargo, a fin conocer de mejor manera aquello que se está construyendo, se detalla a continuación la elaboración de un proyecto JEE básico, paso a paso y sin asistencia del IDE. El ejemplo original puede ser descargado del sitio web del libro “Beginning Java EE5”.

Construyendo un proyecto JEE básico
En primer lugar, se debe crear un directorio de trabajo, el cual por conveniencia podría estar ubicado dentro del workspace que se vaya a utilizar para Eclipse. Dentro del directorio (JEE501) se agrega una página JSP index.jsp con el siguiente código:

<html>
<head>
<title>
Prueba de la instalacion
</title>
</head>

<body>
<% for(int i = 0; i < 3; i++) { %>
<h<%=i + 1%>> Hola Mundo!!! </h<%=i + 1%>>
<%}%>
</body>
</html>


La página index.jsp será el componente web de la aplicación, para validar su funcionamiento, se la empaqueta en un componente redistribuible de despliegue: holaApp.war

Estando en el directorio de trabajo creado anteriormente (JEE501), usando la consola se ejecuta el siguiente comando:

jar -cvf holaApp.war index.jsp

En donde:
-c: para crear un nuevo contenedor
-f: para que se deba ingresar un nombre para el contenedor
-v: para una salida completa de mensajes en consola

El detalle de las opciones del comando se lo puede obtener ejecutándolo sin argumentos. El resultado es un nuevo archivo war, el cual debe ser copiado al directorio CATALINA_HOME\webapps. Hecho esto, se levanta el servidor Apache Tomcat y se accede a la dirección: http://localhost:8080/holaApp/index.jsp, el resultado debe ser:


Verificación de la instalación de Tomcat y de la creación del primer war

Normalmente un proyecto web tiene más que un archivo trivial, pero la estructura general de un proyecto web se revisará posteriormente, por el momento se ha podido constatar que Tomcat (Servlet/JSP) container ha funcionado perfectamente.

El siguiente paso será empaquetar el war creado (los componentes web) dentro de un ear. Un ear puede contener archivos war, jar, descriptores (archivos xml), etc., todos en el contexto de una misma aplicación empresarial.

Dentro del directorio JEE501, se crea el directorio META-INF, y dentro del mismo, se incluye el archivo application.xml, el cual es el descriptor de despliegue de la aplicación:

<?xml version=“1.0” ?>
<application>
<display-name>Hola JEE</display-name>
<module>
<web>
<web-uri>holaApp.war</web-uri>
<context-root>/hola</context-root>
</web>
</module>
</application>


Para construir el ear, de manera análoga a lo que se hizo con el war, estando en el directorio JEE501 se ejecuta el comando:

jar -cvf holaAppEar.ear holaApp.war META-INF

Para probar el funcionamiento del ear, se lo debe desplegar en el servidor de aplicaciones que se instaló, para hacer esto hay que situarse en JBOSS_HOME\server, allí se encuentran las instancias (configuraciones) que provee el servidor predeterminadamente. Para crear una propia instancia y mantener las existentes sin modificaciones, se puede copiar cualquiera de ellas y renombrar la copia; en este caso, se utiliza como plantilla la instancia default y se crea la instancia “mijee5”.

En el directorio JBOSS_HOME\server\mijee5\conf\bindingservice.beans\META-INF, se encuentra el archivo de configuración bindings-jboss-beans.xml, en el cual se cambia el parámetro que define el conjunto de bindings para uso de la instancia, para que quede de esta forma la configuración:

<parameter>${jboss.service.binding.set:ports-01}</parameter>

Esto resulta útil, puesto que el servidor Tomcat que se configuró utiliza el puerto 8080, y con el cambio indicado en el parámetro, la instancia de mijee5 lo hará en el puerto 8180. Esta configuración también resulta útil para poder levantar distintas instancias de JBoss en una misma máquina al mismo tiempo.

En el directorio deploy de mijee5, se coloca el empaquetado holaAppEar.ear, y estando situado en JBOSS_HOME\bin, se utiliza el siguiente comando para levantar el servidor:

run.bat -c mijee5 -b 0.0.0.0

-c: para indicar cual instancia se va a levantar
-b: para indicar en qué interfaces de red se va a levantar la instancia, 0.0.0.0 es para todas las interfaces

Habiendo seguido los pasos anteriores, el resultado sería:



Consola indicando que la instancia mijee5 se ha levantado correctamente



Página de inicio para la administración de JBoss



La Consola JMX muestra que se han desplegado el ear y su módulo war



La aplicación levantada, nótese que el URL es el contexto raíz indicado en el descriptor application.xml
¿Cómo funciona?
La última pantalla muestra una página web con tres títulos que dicen “Hola Mundo!!!”, si se muestra el código fuente de la página, lo que tenemos es bastante simple:

<html>
<head>
<title>
Prueba de la instalacion
</title>
</head>

<body>
<h1> Hola Mundo!!! </h1>
<h2> Hola Mundo!!! </h2>
<h3> Hola Mundo!!! </h3>
</body>
</html>

La cuestión es, ¿Cómo se transformó el código JSP en el HTML mostrado? Como se mencionó en la primera entrada, “JSP es un lenguaje de plantillas para escribir Servlets”; de hecho, cuando el servidor JBoss recibe una petición de lo que se encuentra en el contexto raíz de su módulo web (holaApp.war, /hola), utiliza sus contendores web, jsp y servlet para generar el código fuente del servlet para la página index.jsp, para compilarlo, cargarlo e instanciarlo, y finalmente es el servlet el encargado de retornar al cliente un flujo (OutputStream) que contiene el HTML que se despliega (el detalle de este punto será retomado en la siguiente entrada).

Como se vio, el war generado pudo desplegarse en Tomcat y podría desplegarse en JBoss de la misma manera; sin embargo, al empaquetarlo en un ear, se posibilita que coexista con lógica que no necesariamente debe residir en “la capa web”, es decir, dentro del war, pero que es parte de la lógica de toda una aplicación.

La estrucutra de archivos del ejemplo es súmamente simple, pues un proyecto real puede ser bastante complejo, no obstante, se cumple un propósito clave con dicha estructura: indicar que en un empaquetado de despliegue existen componentes y archivos de soporte (descriptores, manifiestos, propiedades). En este caso, el empaquetado holaApp.war incluye un componente jsp y un archivo de soporte agregado durante la creación del empaquetado, se trata de un archivo de manifesto, el cual viene a ser como un directorio de contenidos para el empaquetado. Por su parte el ear tiene un módulo web (holaApp.war) y cumpliendo el estándar, dentro de un directorio META-INF tiene el descriptor de despliegue de la aplicación (application.xml), el cual es utilizado por el servidor para saber cómo acceder a los componentes del ear.

Sinópsis y siguientes temas
En el presente documento se ha revisado la instalación y configuración de Apache Tomcat y de JBoss, de manera que ambos servidores puedan trabajar a la vez en una misma máquina. También se ha construido una aplicación JEE elemental, pero útil para explicar lo más relevante sobre su proceso de empaquetamiento y despliegue. Más adelante se revisarán los tópicos más importantes de JSP, con lo cual se conseguirá un sustento sólido para abordar JSF.