En el siguiente artículo se tratara de adentrar a lector en el mundo de la programación para la Web en el lenguaje Java a través de los Servlets. Se revisara el funcionamiento básico de estos para una mejor comprensión, así como ejemplos de su API. Se abordara también en las particularidades que los hacen superiores a los CGI tradicionales y compatibilidades con ellos. Por ultimo se revisaran algunas características del Protocolo de Transferencia de Hipertexto (HTTP) y como este impacta en gran medida las funcionalidades y el rendimiento de los Servlets.
Introducción:
Entre las muchas particularidades que distinguen a la Web de los restantes medios de comunicación, esta la capacidad de interacción. Interacción que inicialmente era bastante reducida y se conseguía a través de código HTML y algunos elementos embebidos de JavaScript. Cuando se mencionaba el nombre de Java en este entorno, algunos lo asociaban a JavaScript, y otros, un poco más conocedores, lo asociaban con pequeños programas que se ejecutaban en el cliente y se llamaban Applets. Esto realmente fue el inicio de Java en la Web y surgió para darle más vida y dinamismo a la misma.
Esto nos resolvía casi todos los problemas al comienzo de la vida en la Web, y nos hacia el trabajo con Java bastante limitado pero, ¿realmente una página tiene que limitarse solo a contener textos y gráficos bonitos? Esta necesidad se comprendió muy pronto gracias al dinamismo de la informática y las exigencias de los usuarios, y comenzaron a aparecer tecnologías que convertían al usuario en la pieza principal de la aplicación, tecnologías que podían interpretar sus acciones y procesas datos no solo en el cliente si no también en el servidor. Los CGI de perl eran la solución en ese entonces. La comunidad de Java no podía quedarse atrás y se lanza la especificación original de Sevlet en junio de 1997, gracias al ingenio de los programadores de la SUN, en su versión 1.0.
Los Servlet son la respuesta de la tecnología en Java a la programación de la Interfaz de Compuerta Común (CGI). Son programas que se ejecutan en el servidor, realizando la función de una capa intermedia entre una petición proveniente de un navegador Web u otro cliente HTTP, y las aplicaciones del servidor, pudiendo utilizar toda la paquetería y potencialidades del lenguaje. Su función principal es proveer páginas web dinámicas y personalizadas, utilizando para este objetivo el accesos a bases de datos, flujos de trabajo y otros recursos.
Desarrollo
Para poder utilizar los Servlets dentro de nuestras aplicaciones web, debemos, por norma general, complementar éste con un contenedor de Servlets, que no es mas que un servidor que tenga soporte para el API Servlet. En internet disponemos de multitud de contenedores de código libre y comerciales como el Tomcat de Apache, el WebLogic de IBM, el JSWDK de la SUN,etc. Sun mantiene una lista actualizada de contenedores de Servlets que se puede encontrar en: http://java.sun.com...rvlet/industry.html.
El API Servlet nos propone una jerarquía de clases bien definidas para el trabajo con los mismos, donde podemos encontrar desde servlets sin implementaciones definidas, en lo cuales tenemos que realizar todo el trabajo como la clase GenericServlet, o clases un poco mas avanzadas como la HttpServlet, donde solo tendríamos que implementar los métodos de acceso al mismo como el doGet() o el doPost(). El principal componente del API es la interfaz Servlet. La misma esta provista de los principales métodos para manipular, no solo los servlets, si no también la comunicación de estos con los clientes. Todos los servlets implementan esta interfaz de una manera directa o indirecta. A través de cualquiera de estas clases podemos comenzar a realizar nuestros propios servlets.
Ventajas sobre los CGI tradicionales
En el momento que salió la especificación de Servelt a la luz, los CGI ya llevaban algún tiempo e la red, lo que dio una ventaja muy grande pues permitió que fueran analizados a profundidad y de esta forma poder crear métodos con mejor rendimiento, potencialidad y facilidad de uso.
Eficientes
Con el CGI tradicional, se arranca un nuevo proceso por cada petición HTTP. Si el propio programa CGI es relativamente pequeño, el costo de arrancar el proceso puede superar el tiempo de ejecución. Además, si ocurren n peticiones simultáneas al mismo programa este carga su código en memoria la misma cantidad de veces. Con los Servlet la maquina virtual de java permanece en ejecución y administra cada petición mediante ligeros subprocesos de Java y no un pesado proceso del sistema operativo. A través de la programación por hilos pueden existir n subprocesos del mismo Servlet y este encontrarse en memoria una sola vez. Esto nos da una velocidad de respuesta mayor a cada petición y una eficiencia superior en el aprovechamiento de los recursos de la maquina donde son ejecutados.
Adecuados
Leer los datos enviados por un cliente HTTP desde un CGI tradicional es un trabajo bastante engorros, se necesita parsear la cadena completa y extraer de ella los datos uno a uno. Los Servlet cuentan con una extensa infraestructura para analizar y decodificar automáticamente los datos provenientes de un formulario HTML, leer y establecer encabezados HTTP, administrar las cookies, rastrear las sesiones y muchas otras utilidades de alto nivel como estas. Además, si ya tiene algún dominio del lenguaje Java, ?para que aprender perl si ya puede aprovechar sus conocimientos en este campo?
Transportables
Los Servlet no son mas que una clase Java, por lo que pueden ser tan portables como cualquier aplicación escrita en el mismo lenguaje. Esto los convierte en multiplataforma por defecto por lo que pueden ser ejecutados en cualquier sistema operativo. Además cuentan con un API estándar. La API Servlet no incluye nada acerca de cómo son cargados los servlets, ni el ambiente en el cual corren los servlets, ni el protocolo usado para transmitir los datos del usuario. Esto permite a los servlets poder ser usados por diferentes servidores Web. Se pueden cargar indiferentemente y de forma transparente tanto desde un disco local como desde una dirección remota, de forma totalmente transparentes. Es posible utilizarlos en servidores tan populares como el Apache, el FastTrack ó el Internet Information Server.
Los Servlets pueden comunicarse entre sí, y por tanto, es posible una reasignación dinámica de la carga de proceso entre diversas máquinas. Es decir, un servlet podría pasarle trabajo a otro servlet residente en otra máquina conociendo solamente la URL de este.
Seguros
Una de las principales fuentes de vulnerabilidad en los programas CGI tradicionales proviene del hecho de que por lo general son ejecutados por entornos de sistemas operativos de propósito general. Por ello, el programador de CGI debe tener cuidado de filtrar caracteres como las comillas tipográficas y los puntos y comas pues tienen un tratamiento especial por el entorno. Esto es más complejo de lo que podría pensarse, y los problemas derivados de esta situación son constantemente ignorados en diversas bibliotecas de CGI. Una segunda fuente de problemas es el hecho de que ciertos programas de CGI son procesados por lenguajes que no verifican automáticamente los límites de las matrices o cadenas. Por ejemplo, en C y C++ es perfectamente legal asignar una matriz de 100 elementos y describir en el “elemento” número 999, el cual puede ser un lugar aleatorio de la memoria del programa. Por ello, los programadores que olvidan realizar esta verificación, abren sus propios sistemas a posibles ataques de desbordamiento en el búfer ya sea por accidente o de manera deliberada. Los servlets no tienen estos problemas. Aun si un servlet ejecuta una llamada a un sistema distante para ejecutar un programa en el sistema operativo local, no utiliza el entorno del sistema operativo para lograrlo. Y por supuesto que la verificación de los límites de las matrices y otras características para la protección de la memoria es una parte central del lenguaje de programación Java.
Equivalente en los Servlet a las variables CGI
Si ya ha desarrollado varios trabajos donde ha utilizado CGI y no desea que sean desechados, con los Servlet puede comunicarse con ellos e incluso incrustarlos en el código de un Servlet.
Entradas relacionadas:


