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:
- Nociones Basicas de Java
- Nociones Basicas de XML
- Tener instalado el JDK 1.4+
- Conocimientos básicos de Ant (Ver tutorial
de Ant)
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
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:
- Simple
- Eficiente
- Integrado (El termino en Ingles es Embedded, algunos libros de sistemas lo traducen como embebido, pero suena muy raro y nos nos da una idea clara del significado, ademas en Ingles embedded es sinomino de integrated)
- Conectable (Pluggable)
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
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).
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.
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.
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
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.
© Copyright Mario Alberto Ramirez, todos los derechos reservados