Java Servlet
Java Servlet
JAVA SEVRLET Introduccin: Entre las muchas particularidades que distinguen a la Web de los restantes medios de comunicacin, esta la capacidad de interaccin. Interaccin que inicialmente era bastante reducida y se consegua a travs de cdigo 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 ms conocedores, lo asociaban con pequeos 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 ms vida y dinamismo a la misma. Esto nos resolva casi todos los problemas al comienzo de la vida en la Web, y nos hacia el trabajo con Java bastante limitado pero, realmente una pgina tiene que limitarse solo a contener textos y grficos bonitos? Esta necesidad se comprendi muy pronto gracias al dinamismo de la informtica y las exigencias de los usuarios, y comenzaron a aparecer tecnologas que convertan al usuario en la pieza principal de la aplicacin, tecnologas que podan interpretar sus acciones y procesas datos no solo en el cliente si no tambin en el servidor. Los CGI de perl eran la solucin en ese entonces. La comunidad de Java no poda quedarse atrs y se lanza la especificacin original de Sevlet en junio de 1997, gracias al ingenio de los programadores de la SUN, en su versin 1.0. Los Servlet son la respuesta de la tecnologa en Java a la programacin de la Interfaz de Compuerta Comn (CGI). Son programas que se ejecutan en el servidor, realizando la funcin de una capa intermedia entre una peticin proveniente de un navegador Web u otro cliente HTTP, y las aplicaciones del servidor, pudiendo utilizar toda la paquetera y potencialidades del lenguaje. Su funcin principal es proveer pginas web dinmicas 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 cdigo 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 jerarqua 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 tendramos que implementar los mtodos 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 mtodos para manipular, no solo los servlets, si no tambin la comunicacin de estos con los clientes. Todos los servlets implementan esta interfaz de una manera directa o indirecta. A travs de cualquiera de estas clases podemos comenzar a realizar nuestros propios servlets.
Figura 1. Jerarqua Ventajas sobre los CGI tradicionales En el momento que sali la especificacin de Servelt a la luz, los CGI ya llevaban algn tiempo e la red, lo que dio una ventaja muy grande pues permiti que fueran analizados a profundidad y de esta forma poder crear mtodos con mejor rendimiento, potencialidad y facilidad de uso. Eficientes Con el CGI tradicional, se arranca un nuevo proceso por cada peticin HTTP. Si el propio programa CGI es relativamente pequeo, el costo de arrancar el proceso puede superar el tiempo de ejecucin. Adems, si ocurren n peticiones simultneas al mismo programa este carga su cdigo en memoria la misma cantidad de veces. Con los Servlet la maquina virtual de java permanece en ejecucin y administra cada peticin mediante ligeros subprocesos de Java y no un pesado proceso del sistema operativo. A travs de la programacin 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 peticin 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 automticamente 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. Adems, si ya tiene algn 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 aplicacin escrita en el mismo lenguaje. Esto los convierte en multiplataforma por defecto por lo que pueden ser ejecutados en cualquier sistema operativo. Adems cuentan con un API estndar. La API Servlet no incluye nada acerca de cmo 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 direccin 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 reasignacin dinmica de la carga de proceso entre diversas mquinas. Es decir, un servlet podra pasarle trabajo a otro servlet residente en otra mquina 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 propsito general. Por ello, el programador de CGI debe tener cuidado de filtrar caracteres como las comillas tipogrficas y los puntos y comas pues tienen un tratamiento especial por el entorno. Esto es ms complejo de lo que podra pensarse, y los problemas derivados de esta situacin 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 automticamente los lmites 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 nmero 999, el cual puede ser un lugar aleatorio de la memoria del programa. Por ello, los programadores que olvidan realizar esta verificacin, abren sus propios sistemas a posibles ataques de desbordamiento en el bfer 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 verificacin de los lmites de las matrices y otras caractersticas para la proteccin de la memoria es una parte central del lenguaje de programacin 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 cdigo de un Servlet. Por supuesto que una de las mayores preocupaciones de las personas que trabajamos con tecnologa es la compatibilidad. Este es uno de los grandes retos de las compaas desarrolladoras de software reutilizable como los frameworks o APIs. Muchas veces no se nos permite migrar a la versin mas reciente por falta de compatibilidad de esta con la que estamos desarrollando. Los Servlet contienen las variables mas utilizadas en los CGI. En la tabla 1.0 se muestra la relacin de equivalencia que existe entre ellas. CGI AUTH_TYPE Servlet request.getAuthType() Significado Si se suministr una cabecera Authorization, este es el esquema especificado (basic o digest) request.getContentLength() Slo para peticiones POST, el nmero de bytes enviados. request.getContentType() El tipo MIME de los datos adjuntos, si se especfica. getServletContext().getRealPath(/) Camino al directorio que corresponde con http://host/ request.getHeader(Xxx-Yyy) Acceso a cabeceras arbitrarias HTTP
PATH_INFO
request.getPathInfo()
PATH_TRANSLATED
request.getPathTranslated()
QUERY_STRING
request.getQueryString()
REMOTE_ADDR REMOTE_HOST
request.getRemoteAddr() request.getRemoteHost()
REMOTE_USER REQUEST_METHOD
request.getRemoteUser() request.getMethod()
Informacin del camino adjunto a la URL. Como los servlets, al contrario que los programas estndares CGI, pueden hablar con el servidor, no necesitan tratar esto de forma separada. La informacin del path podra ser enviada como parte normal de los datos de formulario La informacin del camino relativo al camino real en el servidor. De nuevo, los Servlets no necesitan tener un caso especial para esto. Para peticiones GET, son los datos adjuntos como un gran string, con los valores codificados. Raramente querremos una fila de datos en los servlets; en su lugar, usaremos request.getParameter para acceder a parmetros individuales. La direccin IP del cliente que hizo la peticin, por ejemplo 192.9.48.9. El nombre de dominio totalmente cualificado (por ejemplo java.sun.com) del cliente que hizo la peticin. Se devuelve la direccin IP si no se puede determinar. Si se suministr una cabecera Authorization, la parte del usuario. El tipo de peticin, GET, POST, HEAD, PUT, DELETE, OPTIONS, o TRACE Path del servlet. Nombre del Servidor Web. Puerto por el que escucha el servidor. Nombre y versin usada en la lnea de peticin
SERVER_SOFTWARE
(por ejemplo HTTP/1.0 o HTTP/1.1). getServletContext().getServerInfo() Informacin identificativa del servidor Web.