Acerca de
Curriculum Vitae
Blog
Artículos


Jetty Web Server y el Front Controller Pattern

Introducción

Este es un tutorial de Jetty, un Servidor Web 100% en Java, muy flexible y con un footprint muy pequeño, lo cual nos permite utilizarlo Integrandolo (embeddeding) dentro de una aplicación stand alone.

En este tutorial vamos a aprender a configurar el Servidor, como hacer el deployment de una aplicacion, como utilizar el plugin de Ant para Jetty. En artículos subsecuentes relacionados con aplicaciones web (spring, ajax, etc), estaremos utilizando el Jetty web server para hacer pruebas.

Como ejemplo utilizaremos una aplicación web muy sencilla en la cual se utiliza el patron de diseño Front Controller utilizando la estrategia Command and Controller (El cual por cierto, puede set utilizado como punto de partida para el desarrollo de una aplicacion muy sencilla que sigue las mejores practicas de J2EE pero sin llegar a utilizar ningún framework).

Si han leido alguno de mis otros artículos ya saben cual es la idea, primero hay que descargar el ejemplo, verlo funcionando y despues explicamos como funciona.

No olvides dejar comentarios, sugerencias y dudas en la sección de comentarios.

Requisitos: Los únicos prerequisitos previos para entender y ejecutar el ejemplo son:
Descarga y Ejecución del ejemplo

Para correr el ejemplo, descarga el siguiente archivo y descomprímelo en tu disco duro, desde una ventana de ms-dos (o un shell de Unix/Linux) , cambia de directorio hacia la ruta donde hayas descomprimido el ejemplo, y ejecuta el siguiente comando (es necesario haber configurado previamente Ant ):


D:\cd JettyTutorial

D:\JettyTutorial>ant jetty.run



Si configuraste correctamente las variables de entorno debes de ver la siguiente salida:


D:\JettyTutorial>ant jetty.run
Buildfile: build.xml


buildSimpleCommand:
[javac] Compiling 5 source files to D:\mario\desarrollo\www.marioalberto.com.mx\tutorialesCode\JettyTutorial\SimpleCommand \WEB-INF\classes
[javac] Note: D:\mario\desarrollo\www.marioalberto.com.mx\tutorialesCode\JettyTutorial\src\com\marioalberto\tutorial\jetty \frontcontroller\ControllerServlet.java uses unchecked or unsafe operations.
[javac] Note: Recompile with -Xlint:unchecked for details.

gen.war:
[war] Building war: D:\mario\desarrollo\www.marioalberto.com.mx\tutorialesCode\JettyTutorial\webapps\SimpleCommand.war

jetty.run:
[jetty] Configuring Jetty for project: Jetty-Ant integration test
[jetty] Setting property 'jetty.home' to value '.'
[jetty] Setting property 'jetty.class.path' to value 'lib'
[jetty] 2008-08-19 18:05:48.949::INFO: Logging to STDERR via org.mortbay.log.StdErrLog
[jetty]
[jetty] Configuring Jetty for web application: SimpleCommand
[jetty] Webapp source directory = D:\mario\desarrollo\www.marioalberto.com.mx\tutorialesCode\JettyTutorial\webapps\SimpleC ommand.war
[jetty] Context path = /SimpleCommand
[jetty] Classpath = []
[jetty] Default scanned paths = []
[jetty] Extra scan targets = []
[jetty] Temp directory = D:\SimpleCommand
[jetty] web.xml file = \SimpleCommand\webapp\WEB-INF\web.xml
[jetty]
[jetty] Configuring Jetty for web application: webtest
[jetty] Webapp source directory = D:\mario\desarrollo\www.marioalberto.com.mx\tutorialesCode\JettyTutorial\webapps\webtest
[jetty] Context path = /webtest
[jetty] Classpath = []
[jetty] Default scanned paths = []
[jetty] Extra scan targets = []
[jetty] Temp directory = D:\webtest
[jetty] web.xml file = D:\mario\desarrollo\www.marioalberto.com.mx\tutorialesCode\JettyTutorial\webapps\webtest\WEB-INF\we b.xml
[jetty] 2008-08-19 18:05:49.980::INFO: jetty-6.1.7
[jetty] 2008-08-19 18:05:49.136::INFO: Extract jar:file:/D:/mario/desarrollo/www.marioalberto.com.mx/tutorialesCode/Jetty Tutorial/webapps/SimpleCommand.war!/ to D:\SimpleCommand\webapp
[jetty] 2008-08-19 18:05:50.089::INFO: No Transaction manager found - if your webapp requires one, please configure one.
[jetty] 2008-08-19 18:05:52.275::INFO: No Transaction manager found - if your webapp requires one, please configure one.
[jetty] 2008-08-19 18:05:53.228::INFO: Started SelectChannelConnector@0.0.0.0:8080.2982!Static

Si es asi, acabas de Compilar una Aplicación Web, levantar una instancia de Jetty y hacer el deployment de dos aplicaciones web .

Para ver las aplicaciones solo abre los siguientes URL's en tu navegador:

http://localhost:8080/webtest/
http://localhost:8080/SimpleCommand/

Si tienes algun problema al intentar ejecutar el ejemplo, puedes exponer tus dudas en la sección de comentarios donde intentaré ayudarte lo mas pronto posible.
Recuerda que es necesario haber instalado y configurado previamente Ant

¿ Que es Jetty?

Jetty es un web server y contenedor de Servlets, de código abierto desarrollado al 100% con java.

El objetivo principal de los desarroladores de Jetty es crear un Web Server que sea: Debido a que su tamaño en Kb es pequeño, y a la flexibilidad de configuraciones, an algunas ocasiones Jetty se utiliza para que aplicaciones Java puedan tener integrados Servicios Web como se puede ver en la siguiente figura:.



En la actualidad hay muchos sitios y productos que estan utiliza Jetty o estan basados en el, pero como como uno de los objetivos de Jetty es ser tan poco invasivo como sea posible, Jetty permanece invisible.

Jetty se puede usar como:

-Un servidor web tradicional para contenido estatico y dinamico
-Un Servidor de contenido dinamico conectado con un servidor de HTTP como Apache a traves de mod_proxy
-Un componente integrado dentro de una Aplicación Java

¿Que hace el ejemplo?

El ejemplo inicializa una instancia de Jetty en el puerto 8080 y hace el deployment de dos aplicaciones web, la primera (webtest) es bastante sencilla y consiste unicamente en un JSP que ejecuta algunas instrucciones apoyandose en el Standard Tag Library.

El segundo ejemplo es un poco mas elaborado y consiste en un aplicación web que implementa de manera muy sencilla el Patrón de Diseño de J2EE Front Controller (como se explica en Core J2EE Design Patterns).


Arquitectura y Configuracion de Jetty


Debido a la flexibilidad de Jetty, hay varias maneras de Configurar e Iniciar una Instancia del Servidor básicamente lo que hay que hacer crear y configurar una instancia de la clase org.mortbay.jetty.Server

De acuerdo a la documentacion y como podemos observar en el diagrama la clase Server, funciona como una especie de tuberia entre una collección de Connetors que aceptan conexiones a traves de HTTP y una colección de Handlers que atienden peticiones de las conecciones y generan la respuesta correspondiente, todo este trabajo se hace a traves de Threads que se obtienen de un Pool.

Tomando en cuenta lo anterior y debido a que Jetty esta conformado de "Plain Old Java Objects" (POJOs)
la configuración se puede llevar a cabo de varias formas:


1) Crear la instancia dentro de una aplicación de Java y asignarle el Connector y el Handler correspondiente:
        Server server = new Server();
        Connector connector=new SocketConnector();
        connector.setPort(8080);
        server.setConnectors(new Connector[]{connector});

        ServletHandler handler=new ServletHandler();
        server.setHandler(handler);
        server.start();
        server.join();

2) La distribución de Jetty incluye el jar start.jar desde el cual se puede iniciar una instancia del server leyendo las configuraciones desde archivos XML.
Dentro del start.jar existe la clase org.mortbay.start.Main, la cual se encarga de leer las configuraciones del archivo xml.
En el archivo se especifican los respectivos Conectores(Connectors) y Manejadores(Handlers).

3) Jetty cuenta con un Plugin para Ant, de esta forma podemos configurar una instancia y hacer un deployment directamente desde el archivo build.xml.

El plugin de Ant para Jetty

Para poder utilizar el plugin de Ant es necesario contar con el jar correspondiente, la distribucion estandar de jetty no cuenta con este jar (es necesario obtenerlo del repositorio y generar el jar con Maven), pero en el archivo zip del ejemplo se incluye un jar con las clases (task's de ant) necesarias.
  
    
     
  
  
  
          
             
                 
                
                
             
               
              
         
  
Como se puede observar en el listado anterior para poder utilizar el plugin de Jetty se utiliza la instruccion taskdef con la cual le indicamos lo siguiente a Ant:

1) Que busque en el classpath jetty.plugin.classpath el archivo jar que contiene el plugin (las classes), el archivo es: jetty-ant-6.1.5.jar

2) Que busque el archivo task.properties (el cual se encuentra dentro del jar) en donde se especifica el task que se encargara de realizar todo es org.mortbay.jetty.ant.JettyRunTask, esto lo podemos comprobar abriendo el archivo jetty-ant-6.1.5.jar que se encuentra en el directorio lib


Una vez configurado el taskdef podemos configurar un target en el cual ya podemos utilizar el tag <jetty >
, dentro de este tag podemos enviarle varias propiedades del Sistema a Jetty con el tag systemProperty.
Tambien utilizamos el tag webApp para indicarle que aplicaciones deben de ser instaladas (¿deployeadas?) En este caso le decimos que instale dos: webtest y SimpleCommand, se le indica que webtest la tomara de un directorio y SimpleCommand la toma de un war. Para mas información de como configurar Jetty con el Plugin de Ant, pueden consultar aqui.


El Ejemplo con Patrón de Diseño Front Controller


Una de las aplicaciones Web que se incluyen en este ejemplo es SimpleCommand, la cual es una implementación sencilla del Front Controller (que a su vez es un patron MVC )como se menciona en Core J2EE Patterns.

Lo que se hace con esta aplicacion es atender todas las peticiones *.do a traves de un Controller (ControllerServlet) el cual a su vez es un Servlet.

Esta configuración se hace desde el archivo Web.xml dentro del directorio WEB-INF.
El controller delega la acción a realizar a los Comandos correspondientes (InitCommand y WriteCommand) los cuales a su vez se encargan de preparar en la session los datos del Modelo (ModelBean) correspondiente que utilizara la Vista (view.jsp).

La vista unicamente se encarga de obtener datos del Modelo y Desplegarlos

El codigo fuente de los archivos que implementan el Front Controller de la aplicación estan en el directorio: src\com\marioalberto\tutorial\jetty\frontcontroller




Resumen


Hoy en dia hay una gran cantidad de opciones para utilizar una implementación de un Servlet Container, una de las mas ligeras y flexibles es Jetty.
En los proximos articulos y tutoriales, voy a utilizar este Web Server, para poder ejecutar Servlets,JSP's ,Web Services y Ajax, sin tener que descargar un Contenedor mas pesado.
Espero que este articulo te sea de utilidad, recuerda que puedes poner tus dudas en la sección de comentarios donde seran atendidas a la brevedad.



4 Comentario(s)
achake-2008-11-21 03:53:13
Simplemente gracias.
Tenía mis dudas en utilizar Jetty para un Trabajo Fin de Carrera porque no encontraba documentación básica, pero gracias a este tutorial ya me he decidido.


jmanuel_m-2010-01-14 10:39:42
Muchas gracias por la información.
Todo esta muy bien explicado.

saludos!

adolfo-2010-03-24 05:38:24
Hola Mario. Estoy tratando de ejecutar una página JSP con Jetty, pero no encuentro la manera. En mi proyecto de Eclipse, tengo una clase encargada de arrancar el servidor Jetty, pero al abrir Internet Explorer y tratar de ejecutar el JSP me sale el siguiente error:

HTTP ERROR: 500
init
RequestURI=/BDR/estadisticas.jsp

¿Qué está ocurriendo?¿Hay algo que esté haciendo mal?

Gracias. Un saludo.

adolfo-2010-03-24 07:30:04
Hola Mario. Estoy tratando de ejecutar una página JSP con Jetty, pero no encuentro la manera. En mi proyecto de Eclipse, tengo una clase encargada de arrancar el servidor Jetty, pero al abrir Internet Explorer y tratar de ejecutar el JSP me sale el siguiente error:

HTTP ERROR: 500
init
RequestURI=/BDR/estadisticas.jsp

¿Qué está ocurriendo?¿Hay algo que esté haciendo mal?

Gracias. Un saludo.


Agregar Comentarios:
Nombre/Alias:
Email:
Url:
Comentarios:
Escribe las palabras (es para evitar spam):
© Copyright Mario Alberto Ramirez, todos los derechos reservados