Você está na página 1de 37

Servlets ADR Infor SL

Servlets

Indice
2 - Servlets............................................................................................................................................................1 Servlets .....................................................................................................................................................1 Servidores J2EE compatibles ..................................................................................................................6 Programacin de servlets........................................................................................................................7 Esquema de funcionamiento....................................................................................................................9 Primer servlet.........................................................................................................................................12 Gestin peticiones get-post....................................................................................................................17 Segundo servlet......................................................................................................................................19 Funcionalidad servlets...........................................................................................................................21 Diferencias servlet-applet......................................................................................................................21 Ejecucin de un servlet realizando la peticin a travs de un formulario html.....................................23 Informacin enviada al servidor............................................................................................................27 Interfaces importantes............................................................................................................................29 Servlets empaquetados...........................................................................................................................31 Ejercicios............................................................................................................................................................33 Ejercicio 1..............................................................................................................................................33

2 - Servlets
Servlets
NOTA PREVIA: para poder realizar el curso es necesario conocer los fundamentos del lenguaje Java y tener instalado y configurado el J2SE SDK, que permite la compilacin y ejecucin de cdigo Java. Si no se cumplen estos requisitos, se recomienda realizar antes de ste, el curso de Java.

Un servlet es un programa Java que se guarda y ejecuta en un servidor J2EE compatible. Su funcin primordial es interaccionar dinmica y personalizadamente con el cliente que solicita sus servicios. La interaccin entre cliente y servlet se traduce, en la mayora de los casos, en la generacin y posterior envo de una respuesta codificada en html al cliente, pero no tiene por qu ser as: la respuesta podra realizarse en otro tipo de formatos tales como pdf, xml, wml, zip, jar, gif, doc, xls, etc. Ejemplo: Visitar http://www.myjavaserver.com/~trilcejf/EncuestaPrivada.html Se accede a un formulario que solicita una serie de datos que se emplearn en una encuesta on-line. Todos los datos, excepto los asociados a las casillas de verificacin, sern capturados por un servlet, que generar una respuesta html personalizada. La respuesta variar en funcin de la eleccin de sexo realizada por el usuario: Si elige hombre, el color de fondo ser cyan y aparecer un enlace cuya pulsacin provocar la visualizacin de la imagen tomcat.gif Si escoge mujer, el color de fondo ser rosa y la pulsacin del enlace provocar la visualizacin de la imagen taza.gif Adems, se enviar un saludo personalizado y se mostrarn en una tabla todos los datos capturados excepto los de las casillas, que se mostrarn en otra tabla indicando las actividades de ocio seleccionadas por el cliente. Un servlet suele formar parte de una aplicacin web. Una aplicacin web consiste en un conjunto de servlets, pginas jsp, ficheros html, clases Java de apoyo empaquetadas o no en ficheros jar y otro tipo de recursos tales como ficheros de imgenes, de sonidos, de texto, etc. Se estudiarn con ms detalle, ms adelante en este tema. Un servlet debe codificarse, compilarse, desplegarse y ejecutarse. A continuacin, se explica lo fundamental de estas operaciones. Conforme avance el tema, se irn analizando con ms detalle cada una de ellas. Ahora se trata de tener una idea general del proceso de creacin y ejecucin de un servlet. Codificacin: implica escritura del cdigo del servlet mediante un editor de texto cualquiera o un IDE (Integrated Development Environment). En el curso, JCreatorPro.

Servlets Compilacin: un servlet utiliza clases e interfaces que no forman parte de la API estndar. Dichas clases e interfaces se incluyen en un fichero jar de nombre servlet-api.jar que, habitualmente, se encuentra disponible en la estructura de directorios del servidor J2EE compatible, en el que se hospeda y ejecuta. En el curso, se emplear Tomcat. Tomcat surgi del proyecto Jakarta que desarrollaron juntos Sun www.sun.com y la fundacin Apache www.apache.org. Sun abandon el desarrollo y la optimizacin de su propio servidor J2EE compatible, Java Web Server, usado hasta entonces y se decant por el apoyo a Apache, dando como resultado el servidor hecho ntegramente en Java y con soporte para ejecutar servlets y jsps, Tomcat. Volviendo al fichero servlet-api.jar, hay que decir que se encuentra en tomcat_home\common\lib, siendo tomcat_home el directorio donde se ha instalado Tomcat. Para instalar Tomcat, ir a http://jakarta.apache.org/tomcat/index.html, seccin Download y enlace Tomcat 5.X. Luego localizar la seccin Binary Distributions/Core/Windows Service Installer (es un link que apunta al .exe del server)

Descargado el fichero ejecutable, la instalacin es sencilla: doble clic y a seguir los pasos del asistente, seleccionando las opciones por defecto, salvo en la ubicacin del directorio de instalacin (por comodidad, colgar del disco duro). Durante el proceso se muestra el puerto por el que el servidor se mantiene a la escucha (8080) y se pide un password para actuar como administrador. Para realizar el curso, se sugiere dejar el puerto por defecto y no poner password.

Servlets

En la ltima pantalla del asistente de instalacin se ofrece lanzar el servidor y leer el Readme.txt asociado. Aceptado el ofrecimiento, se observar un icono como ste en la parte derecha de la barra de tareas. Picando sobre l con el derecho se seleccionar "Start service" para lanzar el servidor. El icono se convertir en una vez levantado. Picando con el derecho sobre el icono se seleccionar "Stop service" para tumbarlo. Tumbado el servidor, volver a mostrarse el icono Picando con el derecho y seleccionando "Configure ..." se muestra un cuadro de dilogo con propiedades de Tomcat. La ms interesante es la que se muestra en la pestaa "Logging"

Servlets

ya que se indica el directorio donde se ubican los ficheros log que permiten conocer todo lo que est ocurriendo en Tomcat. El ms interesante es el sealado ya que acta como consola, es decir, un System.out.println("cucu"); se traduce en que aparece escrito cucu en este fichero. Adems tambin informa de cuando se han actualizado los class resultantes de la recompilacin de un servlet. Durante la instalacin, se crea un grupo de accesos directos colgando de Inicio/Programas/Apache Tomcat 5.X que permiten acceder a la configuracin, a la ayuda, etc. Para verificar que Tomcat funciona bien, una vez levantado, abrir una sesin del navegador y teclear http://localhost:8080. Debe aparecer esto Volviendo a la compilacin de un servlet, hay que decir que para que se realice con xito es necesario agregar a la variable de entorno CLASSPATH, la ruta del fichero servlet-api.jar (recordar que se encuentra en tomcat_home\common\lib). Dos posibilidades: Si no se utiliza IDE (el profesor no lo aconseja), en funcin del s.o. instalado se seguirn los siguentes pasos: En W98, se acceder al autoexec.bat y se agregar la ruta tomcat_home\common\lib\servlet-api.jar. A continuacin se reinicia la mquina. En WMillenium, W2000, WNT, WXP, se acceder a las variables de entorno desde Panel de control/Rendimiento y mantenimiento/Sistema/Opciones avanzadas, botn Variables de entorno y se agregar la ruta a la variable CLASSPATH. En este caso no ser preciso reiniciar, tan solo abrir una nueva sesin del DOS. Si se utiliza JCreator como IDE (es lo que el profesor aconseja), se agregar a la variable CLASSPATH propia del IDE, la ruta de servlet-api.jar.

Servlets

NOTA: antes de continuar, se va a aconsejar un IDE para escribir, compilar y ejecutar cdigo Java. Conviene no olvid software que permite trabajar con cdigo Java de un modo ms o menos automtico. No obstante, es una opinin basta perder menos tiempo al programador en cuestiones no directamente relacionadas con la creacin de cdigo, como tecle se quiere ejecutar, consultar la API porque no se recuerda el nombre de un mtodo, etc. IDE de trabajo recomendado: JCreator. Hay dos versiones:

JCreator LE version: versin limitada. Es gratuita y descargable desde www.jcreator.com, seccin Download

JCreator PRO versin: versin profesional. Es de pago. Dispone de herramientas que permite la autocomplet Se pone a disposicin de los alumnos unos apuntes bsicos sobre la descarga, instalacin y manejo del IDE en http://teleformacion.fer.es/general/prt/c/java/2/NotasJCreatorV3.XX.doc para versiones 3.XX http://teleformacion.fer.es/general/prt/c/java/2/NotasJCreatorV4.XX.doc para versiones 4.XX

Cmo se hace esto? Menu Configure/Options/JDK Profiles, se selecciona el profile instalado y se observa la CLASSPATH en uso. En ella no aparecer la ruta de servlet-api.jar. Cmo se sigue para que aparezca? Botn Edit, pestaa Classes, botn Add/Add Archive y se selecciona el fichero servlet-api.jar. Hecho esto, se acepta y se observar la nueva ruta en la CLASSPATH. Ahora ya pueden compilarse servlets con JCreator Para comprobarlo se escribir el cdigo de abajo. Si se trabaja con JCreatorPro, cerrar el Workspace actual y crear un nuevo fichero java en el Workspace por defecto, sin que forme parte de ningn proyecto.

Cdigo fuente Despliegue (deployment): implica ubicacin del class del servlet en el directorio adecuado de Tomcat y escritura en el fichero descriptor de despliegue de la aplicacin que incluye al servlet, del elemento xml <servlet> correspondiente, junto con su cierre. Todo esto, se estudiar a lo largo del tema. Ejecucin: implica levantar Tomcat o el servidor J2EE compatible que se utilice y teclear el url adecuado en la barra de direcciones del cliente.

Servlets

Servidores J2EE compatibles


Un servidor J2EE compatible tiene que incluir un contenedor web.

contenedor web = contenedor servlet + contenedor jsp


Jsp es la abreviatura de JavaServer Pages. Se estudiarn en el ltimo tema del curso. Adems, debe soportar la API Servlet. Mediante sus mtodos e interfaces se permite la comunicacin e interaccin entre servlet y contenedor web. NOTA: la API J2EE que incluye a API Servlet puede descargarse desde http://java.sun.com/products/servlet/download.html, seccin IMPLEMENTATIONS, enlace J2EE 1.4 SDK y pulsar sobre el botn Download asociado a la fila Platform API docs Si se quiere hacer ms rpido, http://teleformacion.fer.es/general/prt/c/javaser/2/j2eeri-1_4-doc-api.zip Se descargar un fichero zip que se descomprimir aglutinado en una carpeta de nombre apidocs, por ejemplo, a partir de jdk_home o directorio de instalacin del JDK. Dentro de apidocs se encontrar index.html, que es el fichero que lanza la API J2EE

Actualmente, un contenedor web puede estar integrado en Servidores web escritos en Java que TIENEN QUE cumplir las especificaciones de los servlets y las pginas jsp, definidas por Sun. Estas especificaciones pueden descargarse en formato pdf accediendo al enlace siguiente: http://java.sun.com/products/servlet/download.html, seccin SPECIFICATIONS, 2.4-Final Release, fila Specification, enlace Download. En el curso, como se ha comentado previamente, se trabajar con Tomcat. Cumple las especificaciones y, por tanto, tiene capacidad para ejecutar servlets y pginas jsp, es gratuito, estable, open-source o de cdigo abierto, funciona correctamente y est ampliamente extendido (qu ms se puede pedir!!). En el curso se utilizar la ltima versin estable, es decir, Tomcat 5.X. Ms manejable, menos consumo de memoria, ms rendimiento y mejor monitorizacin que las versiones 4.X. Adems soporta las ltimas especificaciones 2.4 y 2.0 de los servlets y las JSPs respectivamente. Una cosa ms, jeje: que sea la implementacin de referencia oficial seleccionada por Sun para ejecutar servlets y jsps. Lo es. De hecho viene integrado en Sun One Studio Community http://wwws.sun.com/software/sundev/jde/buy/index.html. Un servidor de aplicacin J2EE como WebLogic de Bea Systems, WebSphere de IBM, JBoss de JBoss, Sun ONE Application Server de Sun, Oracle Application Server de Oracle, Resin de Caucho Tecnology, JRun de Macromedia, etc.

Servlets Un servidor de aplicacin, aparte de contenedor web, incorpora un contenedor EJB (Enterprise Java Beans), que permite la ejecucin de todo tipo de aplicaciones J2EE, en particular de aplicaciones web. NOTA: un EJB es un componente software residente en un servidor de aplicacin, destinado al desarrollo y despliegue de aplicaciones empresariales bajo la especificacin EJB definida dentro de la plataforma J2EE. Las EJBs son el core o ncleo duro de J2EE

El problema de los servidores de aplicacin es que cuestan dinero. La mayora de las empresas fabricantes proporcionan versiones de evaluacin. Por ejemplo, el WebLogic de Bea System www.bea.com puede descargarse desde http://commerce.bea.com/downloads/weblogic_platform.jsp y utilizar durante un tiempo limitado (90 das). Es preciso estar registrado y contar con unos mnimos requerimientos de mquina: 256 MB de RAM, disponiblidad en el disco duro de unos 600 MB, frecuencia de micro superior a 800 MHz y paciencia: el proceso total de la instalacin suele durar varias horas, del orden de dos o tres. Primero se descarga un .exe de nombre net_platform700_win32.exe, luego se ejecuta, se siguen los pasos indicados por el asistente y a esperar. Para descargarse el WebSphere de IBM: http://www-3.ibm.com/software/info1/websphere/index.jsp, leer un poquito y luego lanzarse a http://www-3.ibm.com/software/webservers/appserv/efix-archive.html para descargarlo. Para descargar de forma gratuita y sin limitacin temporal el Jboss se va a www.jboss.org, enlace "Download" de la fila JBoss AS. Las versiones 3.X integran como contenedor web a Jetty (es software desarrollado por la gente de Jboss); las 4.X, integran Tomcat como contenedor web. Se descarga, se descomprime y ya est instalado. Si no se cuenta con un servidor web que integre un contenedor web ni con un servidor de aplicacin J2EE, pero s con un servidor web "puro" como Apache o Internet Information Server de Microsoft, puede agregarse el contenedor web como un mdulo independiente del periodo de ejecucin del servidor, que permita la ejecucin de servlets y JSPs. En este caso, slo sern gestionadas por el mdulo, las peticiones a servlets y jsps, mientras que el resto sern gestionadas por el servidor web puro.

Programacin de servlets
Todo servlet implementa la interface Servlet del paquete javax.servlet, no directamente, sino heredando de la clase GenericServlet que la implementa por construccin, o heredando de la clase HttpServlet, que es subclase de GenericServlet. Los servlets que se van a estudiar en el curso son los que admiten peticiones basadas en el protocolo http. UN SERVLET HTTP SE CONSTRUIR HEREDANDO DE LA CLASE HttpServlet y seguir un modelo de ejecucin basado en un ciclo de vida similar al de los applets y ejecutado por el servidor J2EE donde se hospede. Como esta clase implementa la interface citada anteriormente, todo servlet va a 7

Servlets poder usar directamente los mtodos de esta interface, los de la propia clase y los de su superclase GenericServlet. La interface Servlet declara los mtodos del ciclo de vida de un servlet, que son: void init(ServletConfig config): es invocado, una sola vez, por el contenedor del servidor J2EE compatible donde se hospeda el servlet y se emplea para inicializarlo. Se ejecuta cuando se realiza la primera peticin. Este mtodo y el resto del ciclo de vida se tratarn con ms detalle en el siguiente apartado. void destroy(): es invocado por el contenedor antes de que el servlet se descargue de memoria y deje de prestar servicio. void service(ServletRequest request, ServletResponse reponse): es invocado por el contenedor para procesar las peticiones, una vez que el servlet se ha inicializado (equivale a ejecutar el init). Es el llamado mtodo de servicio. Sus argumentos son instancias de las interfaces javax.servlet.ServletRequest y javax.servlet.ServletResponse que modelan, respectivamente, la peticin del cliente y la respuesta del servlet. En un servlet http, este mtodo suele sustituirse por los mtodos de javax.servlet.http.HttpServlet. void doPost(HttpServletRequest request, HttpServletResponse response) para gestionar peticiones post y/o void doGet(HttpServletRequest request, HttpServletResponse response) para gestionar peticiones get Se realiza una peticin get a un recurso (un servlet, en nuestro caso) cuando se lleva a cabo una de las siguientes acciones: Teclear en la barra de direcciones del cliente el URL del recurso. Pulsar un enlace html que apunte al recurso. Enviar al recurso un formulario html cuyo atributo method de la etiqueta <form> tenga el valor de get. Es decir, <form action="/servlets-examples/PrimerServlet" method="get" Tambin es vlido <form action="/servlets-examples/PrimerServlet"> ya que, si no se especifica method, este atributo asume el valor get. En cambio, se realiza una peticin post si se enva al recurso un formulario html cuyo atributo method de la etiqueta <form> es post. Es decir, <form action=" " method="post"> Consultar la API para verificar todo lo dicho hasta ahora. Por tanto, un servlet se crea heredando de GenericServlet si admite peticiones no basadas en ningn protocolo especial. Empleado cuando se programan servlets que se ejecutan en servidores de correo, noticias, ficheros, etc. Poco habitual. o de 8

Servlets HttpServlet (es subclase de la anterior) si admite peticiones de clientes basadas en el protocolo http. ES EL MODO DE CREAR SERVLETS QUE SE VA A ESTUDIAR. La declaracin de la clase asociada a un servlet http genrico sera:

Esquema de funcionamiento
No importa si no se entiende muy bien ahora. Lo importante es tener una idea global de lo que ocurre. Conforme se vaya avanzando se comprender mejor.

Servlets NOTA SOBRE INSTANCIACIN Y CARGA EN MEMORIA DE UN SERVLET: Instanciacin y carga en memoria: se produce tras levantar Tomcat y leer el descriptor de despliegue web.xml de la aplicacin a la que pertenece. Implica la creacin, por parte del contenedor, de un objeto servlet mediante el mtodo esttico de java.lang.Class forName(String s) y el mtodo newInstance() de Class. Como argumento del mtodo forName(..) se utiliza el nombre del class obtenido tras compilar el servlet. Esta informacin se obtiene del valor especificado en la etiqueta xml <servlet> del descriptor de despliegue. Por cada elemento <servlet> se instancia un objeto servlet diferente. Ejemplo: se muestra una parte del descriptor de despliegue web.xml de una aplicacin que contiene un servlet.

NOTA SOBRE INICIALIZACIN DE UN SERVLET: Tras la instanciacin y carga en memoria del servlet, viene su inicializacin. Comienza cuando se realiza la primera peticin al servlet. El proceso est regido por su ciclo de vida, que se basa en los mtodos de la interface javax.servlet.Servlet: init(ServletConfig config) service(ServletRequest request, ServletResponse response) destroy() Inicializacin: implica la ejecucin NICA, por parte del contenedor, del mtodo init(ServletConfig config). Se produce cuando se realiza la primera peticin. El objeto javax.servlet.ServletConfig es creado por el contenedor durante la carga en memoria y absorbe multitud de informacin sobre el servlet, previa

10

Servlets lectura del descriptor de despliegue. Usando mtodos adecuados (consultar la API) de dicho objeto se pueden capturar los parmetros de inicializacin del servlet especificados en las etiquetas <init-param>, as como obtener el nombre del servlet. En el ejemplo mostrado en la nota anterior hay dos parmetros: un nombre de usuario y una contrasea. Tpicas tareas de inicializacin son obtencin de conexiones a bases de datos, carga de drivers previa obtencin del nombre de su class en el descriptor, captura de nombres de usuario y passwords, etc. Este mtodo no es necesario escribirlo (mejor dicho, redefinirlo) en el cdigo del servlet. Lo habitual, si se opta por hacerlo, es redefinir el mtodo init() de la clase GenericServlet. El contenedor garantiza que, despus de invocar al init(ServletConfig config), invocar al init(). MODO DE TRABAJO HABITUAL. Para obtener el objeto ServletConfig, se utilizar el mtodo getServletConfig() de GenericServlet. Si se redefine el init(ServletConfig config), el config est directamente disponible en el cuerpo del mtodo pero, si se desea utilizar algn mtodo de la clase GenericServlet, debe incluirse como primera lnea super.init(config), con el fin de pasarle a GenericServlet la interface ServletConfig (recordar que la implementa por construccin). Si no se hace esto, se produce un error de ejecucin, lanzndose una NullPointerException en la lnea donde se intenta emplear el mtodo de GenericServlet. Se ver en el ejemplo SegundoServlet. Tras la inicializacin, el servlet ya est en disposicin de recibir peticiones, gestionarlas y generar una respuesta, con el mtodo de su ciclo de vida service(ServletRequest request, ServletResponse response). Los objetos asociados a los argumentos del service son creados tambin por el contenedor. Cuando se realiza una peticin a un servlet, el contenedor invoca al mtodo service(ServletRequest req, ServletResponse res) de javax.servlet.http.HttpServlet, que invoca al service(HttpServletRequest req, HttpServletResponse res) de la misma clase (est sobrecargado). Este service, en funcin del tipo de peticin, delega automticamente su procesamiento al doXXX(..) correspondiente. Si la peticin es POST, al doPost(..), si es GET al doGET(..), etc. Si se redefine en el cdigo del servlet cualquiera de los mtodos service(..) anteriores, debe invocarse explcitamente al doXXX(..) correspondiente, o procesar la peticin usando slo el service redefinido. Lo habitual es no redefinir el service(..) y trabajar con los mtodos doXXX(..). MODO DE TRABAJO HABITUAL.

Explicacin resumida del proceso: una vez levantado Tomcat, se carga la clase asociada al servlet, se instancia invocando a su constructor sin argumentos por defecto y se carga en memoria. Cuando se realiza la primera peticin se inicializa: esta inicializacin es nica e implica la ejecucin, por parte del contenedor, del mtodo init(ServletConfig config) del ciclo de vida del servlet. Este mtodo no suele aparecer en el cdigo del servlet. Lo habitual es redefinir el mtodo init() y emplear el mtodo getServletConfig() de GenericServlet para obtener un objeto ServletConfig. Finalizada la inicializacin, el servlet ya est en disposicin de procesar las peticiones y generar una respuesta a las mismas, con el mtodo service(ServletRequest request, ServletResponse response).

11

Servlets Una vez procesada la primera peticin, el resto se gestiona mediante diferentes hilos de ejecucin, tantos como peticiones, y sin que se ejecute ms el mtodo init(..). CONCLUSIN: un objeto servlet en memoria procesando mltiples peticiones simultneamente mediante hilos.

Respecto al mtodo destroy() del ciclo de vida, conviene decir lo siguiente: si se tumba el servidor, o se sobrepasa un tiempo lmite de inactividad del servlet, o si el servidor est trabajando con insuficiente memoria, el contenedor podra eliminar el objeto servlet de la memoria. Su ejecucin es competencia del contenedor. Antes de que suceda, se garantiza la ejecucin del mtodo destroy(). No es muy habitual redefinirlo en el cdigo del servlet, pero si se hace, su cdigo tpicamente se compondr de lneas que permitan liberar los recursos empleados por el servlet. Ejemplo: cierre de conexiones a bases de datos, vaciado y cierre de flujos de lectura y escritura, etc.

Primer servlet
Se va programar un servlet http muy sencillo para que el alumno se familiarice con su estructura de cdigo tpica. Antes de empezar es conveniente comentar lo siguiente: En los ejemplos iniciales del curso se trabajar almacenando todos los recursos asociados a ficheros html, ficheros jsp, imgenes, sonidos, ficheros de texto, etc. en tomcat_home\webapps\servlets-examples o en subdirectorios. El directorio servlets-examples es el document root o directorio raz de una aplicacin web de ejemplo desarrollada por el equipo de Tomcat. Engloba varios ejemplos sobre servlets. El directorio webapps es el directorio raz de Tomcat y de l colgarn todos los directorios raz de todas las aplicaciones web desplegadas en el mismo. En el curso, durante los primeros das del mismo, los ejemplos iniciales no constituirn una aplicacin web independiente, sino que formarn parte de la aplicacin proporcionada por el equipo de Tomcat y asociada al directorio raz servlets-examples

12

Servlets Cuando se trabaja con servlets-examples como directorio raz, los class de los servlets se guardan en tomcat_home\webapps\servlets-examples\WEB-INF\classes o en los subdirectorios que correspondan si los servlets se empaquetan. Esta forma de trabajo no es la habitualmente utilizada para el desarrollo de aplicaciones web. Cul es el modo de trabajo habitual a nivel empresarial? Un directorio raz o document root por cada aplicacin web. Ese directorio raz debe tener una estructura de subdirectorios determinada que se utiliza para guardar todos los recursos de la aplicacin, incluidos los class de los servlets. Esta forma de desarrollar aplicaciones web se ver ms adelante. Por el momento vamos a insertar algunos servlets en la aplicacin web suministrada por el equipo de Tomcat y asociada al directorio raz servlets-examples. Sin ms dilacin, empezamos con nuestro primer servlet. Pasos: 1) Escritura del servlet en JCreator NOTA PARA TRABAJAR EN JCREATORPRO: se indican los pasos que se seguirn para trabajar con servlets en este segundo tema. A partir del tercer tema se aprender a trabajar con servlets contenidos en aplicaciones web propias, que es el modo habitual de trabajo. Ahora, lo primordial es familiarizarse con el cdigo tpico de un servlet. Crear un espacio de trabajo o workspace, de nombre JavaServidor Crear un proyecto de nombre EjemplosTomcat que forme parte del espacio de trabajo JavaServidor con los valores de Location, Source Path y Output Path mostrados en la imagen. Luego botn Finish.

13

Servlets

Location = tomcat_home\webapps\servlets-examples\ Source Path = tomcat_home\webapps\servlets-examples\ Output Path = tomcat_home\webapps\servlets-examples\WEB-INF\classes\ Agregar al proyecto un fichero java de nombre PrimerServlet, pero antes de aceptar, pulsar el botn de los puntitos de Location e indicarle tomcat_home\webapps\servlets-examples\WEB-INF\classes. Su cdigo se muestra a continuacin. Lo que se va a hacer en este tema es utilizar una aplicacin que proporciona el equipo de Tomcat como ejemplo, cuyo directorio raz asociado es servlets-examples. De momento, le vamos a agregar unos cuantos servlets para familiarizarnos con el modo de programar empleado en los mismos. Ms adelante crearemos nuestras propias aplicaciones web y el modo de trabajo ser diferente.

14

Servlets

Cdigo fuente 2) Compilacin y obtencin del class en tomcat_home\webapps\servlets-examples\WEB-INF\classes (es lo indicado en la Output Path del proyecto), para verificarlo, ir al men Project/Project Properties y observar dicha ruta en el cuadro Output Path. Si no aparece, seleccionarla mediante el botn de los puntitos. 15

Servlets 3) Agregacin al fichero tomcat_home\webapps\servlets-examples\WEB-INF\web.xml de las lneas

justo despus del comentario <!-- Define servlets that are included in the example application --> y de las lneas

despus del ltimo elemento xml <servlet> ... </servlet>. 4) Ejecucin del servlet tecleando en la barra de direcciones del cliente cualquiera de estos dos URLs http://localhost:8080/servlets-examples/PrimerServlet La respuesta ser

http://localhost:8080/servlets-examples/PrimerServlet?nombre=Jesus En este caso, se le pasa un parmetro y la respuesta ser

NOTA IMPORTANTE SOBRE ACTUALIZACIN AUTOMTICA DE SERVLETS:

16

Servlets Si se modifica el cdigo del servlet y se recompila, se observa que no se actualiza automticamente. Es necesario tumbar al servidor y volverlo a levantar. Para que esto no sea necesario, debe agregarse al fichero de configuracin tomcat_home\conf\server.xml la lnea <DefaultContext reloadable="true"/> justo antes de la etiqueta </Host> Tomcat debe reiniciarse para que los cambios se manifiesten. Comprobarlo haciendo que el color de fondo de la respuesta generada por PrimerServlet sea cyan. La lnea de la etiqueta body debe quedar as: out.println("<body bgcolor=\"cyan\">"); Por qu no est definida esta lnea por defecto? La gente de Tomcat ha comprobado que disminuye el rendimiento del servidor durante el despliegue

Gestin peticiones get-post


A veces es interesante trabajar con servlets que admiten peticiones get y post en un mismo cdigo. Qu debe hacerse? Escribir la respuesta en uno cualquiera de los dos, y definir el otro con una llamada al que contiene la respuesta. Ver el ejemplo de abajo. Ejemplo:

17

Servlets

Si fuera al revs

Por otra parte, al programador le puede interesar definir un cdigo como el de abajo para generar dos respuestas distintas en funcin del tipo de peticin: si al servlet le llega una peticin get har una cosa y si le llega una post, hara otra diferente.

18

Servlets

NOTA: adems de las peticiones de tipo GET o POST se pueden tener peticiones de tipo PUT, DELETE, etc. que se gestionaran mediante mtodos del tipo doPut(..) y doDelete(..). Apenas se utilizan.

Segundo servlet
A continuacin se muestra el cdigo de un servlet que, durante su inicializacin, captura dos parmetros mediante el objeto ServletConfig. Los parmetros se definen en el descriptor de despliegue mediante la etiqueta <init-parameter>. La ventaja de definirlos aqu es que no se precisa recompilar el servlet cuando se realizan cambios en los mismos. En este caso, son el nombre de usuario y el password de una base de datos a la que se conecta el servlet. Dicha conexin se realiza en el mtodo de servicio doPost(..) y exige la utilizacin los parmetros capturados. Para ejecutarlo, seguir los pasos realizados con PrimerServlet, pero modificando la etiqueta <servlet> por esta:

Los parmetros son accesibles nicamente desde SegundoServlet. Al final del tema se ver qu debe hacerse si se necesita acceso desde todos los servlets y jsps de la aplicacin.

19

Servlets Ejemplo:

20

Servlets Cdigo fuente

Funcionalidad servlets
La fundamental es interaccionar dinmica y personalizadamente con el cliente que solicita sus servicios. Buscadores de pginas web o de secciones que forman parte de una pgina: el cliente rellena un cuadro de texto con la palabra o palabras que van a formar parte de su bsqueda y al pulsar el botn de buscar, enva dicha informacin al servlet a la escucha. Dicho servlet responder a la peticin del cliente accediendo a una base de datos que puede encontrarse en el mismo servidor que el servlet o en otro. A travs de este ejemplo se observa claramente el carcter dinmico de los servlets. En funcin de la informacin que se complete en el cuadro de bsqueda del cliente se obtendrn diferentes respuestas. Muy tpicos son los ejemplos de pginas de bsqueda de empleo. http://www.tecnoempleo.com Captura de datos introducidos mediante un formulario html y almacenamiento de los mismos en una base de datos. Por ejemplo, en pginas en las que se ofrece servicio de envo gratuito de curriculums, el usuario rellena un formulario html, pulsa un botn y se transfieren los datos a un servlet que se encargar de incluirlos en una base de datos. http://www.myjavaserver.com/~trilcejf/EncuestaPrivada.html Procesos de identificacin y autenticacin de usuarios mediante sesiones y cookies Creacin de aplicaciones de comercio electrnico como servicios de venta de productos on-line, reservas de entradas para cines, teatros y eventos deportivos, reservas de billetes de avin, de autobs o de tren, etc. www.fnac.es Visualizacin de pginas web personalizadas en base a informacin introducida por el usuario durante el registro o a la eleccin de preferencias ofrecidas por la pgina. La siguiente vez que se acceda a la misma se mostrar con el aspecto elegido por el usuario teniendo en cuenta los criterios de compra seleccionados en su anterior visita. www.amazon.com, www.nextel.com

Diferencias servlet-applet
Un applet es una aplicacin Java que se almacena en un servidor web, pero que se ejecuta en el cliente previa descarga, desde el servidor, de todos los ficheros implicados. Un applet, a no ser que se firme, no puede acceder a un servidor distinto del que se ha descargado (se lanza el SecurityManager) Un servlet es una aplicacin Java que se almacena y se ejecuta en un servidor J2EE compatible que puede conectarse a un servidor distinto del que se encuentra almacenado.

21

Servlets

Los servlets sustituyen a las CGI (Common Gateway Interface = Programas de interface comn de pasarela). Hasta no hace mucho, los programas cgi eran los nicos que permitan ejecutar cdigo en servidores web y capturar informacin enviada desde clientes web. Ocurre que su modo de trabajo es menos eficaz y ofrece menos posibilidades que los servlets; no obstante, se siguen utilizando, aunque cada vez menos. Algunas de las ventajas de los servlets frente a las CGIs son: Se programan en Java y siguiendo la especificacin de los servlets definida por Sun, cuyo punto de apoyo es la API Servlet que forma parte de J2EE (Java 2 Enterprise Edition). Adems de la API Servlet, se puede utilizar sin ninguna restriccin la API estndar de Java. En cambio, los programas CGI pueden programarse en varios lenguajes de programacin como Perl, C++, etc. y no siguen ningn tipo de especificacin. Consumen menos recursos del servidor que las CGI ya que no se cargan en memoria tantas veces como peticiones desde clientes se realicen sino que slo se carga en memoria una instancia del servlet la primera vez que se realiza una peticin desde el cliente; el resto, se gestionan mediante hilos. En cambio, las CGI no admiten multithreading y cada peticin implica carga en memoria de una CGI con la consiguiente lentitud y pesadez en su gestin. El cliente que realiza peticiones no necesita tener instalado el J2SE ni el JRE ya que la respuesta suele codificarse en html. Basta con que disponga de un navegador web. Se ejecutan del mismo modo y sin retocar ninguna lnea de su cdigo cuando se cambian de servidor con soporte J2EE. Los servlets, al estar programados en Java, son multiplataforma (cross-platform), es decir, se ejecutan del mismo modo independientemente del sistema operativo instalado en la mquina donde est corriendo el servidor. Adems, pueden comunicarse entre s de forma sencilla y se complementan bien con los applets

22

Servlets

Ejecucin de un servlet realizando la peticin a travs de un formulario html


Se trata de realizar una sencilla aplicacin compuesta de un formulario html de nombre Formulario1, que invocar al servlet ServletFormulario1 cuando se pulse el botn Enviar y al servlet ServletEnlace cuando se pulse el enlace html Plsame. Los servlets contarn slo con un mtodo de servicio del tipo doXXX(..), no se realizar ninguna operacin durante su inicializacin y, por tanto, no se redefinir el init() de su ciclo de vida. Tampoco el destroy(). En el caso de que el cliente invoque a ServletFormulario1, el cdigo del servlet capturar los datos introducidos en el formulario por el cliente y devolver una respuesta html consistente en una tabla con los datos capturados. En el caso de que se pulse el enlace, se mostrar el mensaje Vienes del enlace Plsame y la imagen asociada a tomcat.gif Esquema del formulario:

MODO DE TRABAJAR EN JCREATORPRO: Agregar el fichero html Formulario1 al proyecto EjemplosTomcat, pero antes de aceptar, pulsar el botn de los puntitos de Location e indicarle tomcat_home\webapps\servlets-examples. Para que al pulsar el botn del formulario o el enlace html, se ejecuten los servlets a los que apuntan es preciso que el valor de action del formulario y el href del enlace sean /servlets-examples/ServletFormulario1 y /servlets-examples/ServletEnlace, respectivamente. Agregar dos ficheros java de nombres ServletFormulario1 y ServletEnlace al proyecto anterior. Para ello, actuar como antes, pero seleccionado Java File y en Location tomcat_home\webapps\servlets-examples\WEB-INF\classes

23

Servlets Verificar que los class resultantes de la compilacin de los servlets aparecen en tomcat_home\webapps\servlets-examples\WEB-INF\classes, yendo a Menu Project/Project Properties y comprobando que el cuadro Output Path contiene la ruta anterior Despus de escribir los cdigos, recordar que debe agregarse al fichero tomcat_home\webapps\servlets-examples\WEB-INF\web.xml las lneas

justo despus del comentario <!-- Define servlets that are included in the example application --> y las lneas

despus del ltimo elemento xml <servlet> ... </servlet>.

Cdigo del formulario a travs del que se realiza la peticin del cliente (Formulario1.html):

24

Servlets

Cdigo fuente NOTA: este cdigo debe estar en tomcat_home\webapps\servlets-examples. Se acceder al formulario desde el cliente tecleando en la barra de direcciones http://localhost:8080/servlets-examples/Formulario1.html

Tambin suele hacerse lo siguiente: se teclea http://localhost:8080/servlets-examples y se va accediendo al directorio y el recurso que interese con el ratn. Deber modificarse el nombre del fichero index.html para que no se acceda automticamente al mismo. Hecho esto, es interesante aadir a Favoritos del cliente web (el navegador) una entrada que apunte a la ruta anterior de nombre "servlets-examples (Tomcat)". Cdigo del servlet que recibe los datos del formulario y que genera la respuesta (ServletFormulario1.java):

25

Servlets

Cdigo fuente NOTA: se capturan los parmetros mediante String getParameter(String name) pasndole, el name del componente del formulario que interesa capturar (en este caso el contenido de tres cuadros de texto). Si no se rellena algn cuadro, devuelve ( equivale a una cadena de longitud cero). Si no existe el name que se le pasa, devuelve null.

NOTA: el class debe estar en tomcat_home\webapps\servlets-examples\WEB-INF\classes El servlet se ejecutar cuando se pulse el botn Enviar del formulario

Cdigo del servlet al que apunta el enlace html (ServletEnlace.java):

26

Servlets

Cdigo fuente NOTA: el class debe estar en tomcat_home\webapps\servlets-examples\WEB-INF\classes El servlet se ejecutar cuando se pulse el enlace Plsame

Respuesta al cliente cuando se pulsa el botn Enviar del formulario:

Respuesta al cliente cuando se pulsa el enlace:

Informacin enviada al servidor

27

Servlets Cuando un cliente web invoca a un servlet ubicado en un servidor J2EE compatible, se le enva la siguiente informacin: Primero, una lnea principal de encabezamiento de peticin que consta de tres partes: Comando del protocolo http//Ruta URI del recurso solicitado al servidor//Versin del protocolo

Ejemplo: GET || /servlet/ServletPrueba || 1.0 A continuacin, los encabezados de peticin. Almacenan informacin sobre el cliente desde el que se ha realizado la peticin. El servlet accede a la misma mediante mtodos adecuados. Se estudiarn ms adelante. Por ahora se muestran algunos de ellos Ejemplos: accept: indica los tipos MIME soportados por el cliente. referer: indica el URL del recurso web del que proviene la peticin actual. accept-lenguage: indica los idiomas preferidos del cliente. content-type: indica el tipo MIME asociado al envo de la peticin del cliente. En este caso es el asociado a un formulario html. content-length: indica el tamao en bytes de los datos enviados en la peticin. Slo disponible en peticiones basadas en post. user-agent: indica el tipo de cliente que ha realizado la peticin al servlet. En este caso un navegador web. Puede ser utilizado para enviar diferentes respuestas en funcin de tipo de cliente. El Mozilla que aparece est asociado a una versin de Netscape que se necesita soportar por cuestiones de compatibilidad con JavaScript. cookie: utilizado para devolver las cookies que el servidor envi con anterioridad al cliente. Por ltimo, el cuerpo de la peticin, que contendr, en este caso, los datos en forma de pares name/value que procesar el servlet. Recordar que para peticiones GET no existe cuerpo y los datos se agregan al final del URL.

28

Servlets

Interfaces importantes
Las propiedades de las interfaces a las que pertenecen las instancias que se les pasan a los mtodos de servicio doXXX(..) de gestin de peticin y generacin de respuesta se resumen as: HttpServletRequest y su superinterface inmediata ServletRequest: declaran mtodos que permiten la comunicacin en el sentido cliente-servidor y la obtencin de datos del cliente que realiza la peticin tales como parmetros pasados, protocolo empleado, nombre del host desde el que se hace la peticin, etc. Ir a la API para ampliar informacin. Algunos de los ms usados son: String getParameter(String name): devuelve el value asociado al name que se le pasa al argumento. Recordar que el servlet recibe datos de los clientes mediante pares name/value. Devuelve null si no se encuentra el name que se le pasa. Este mtodo es el mismo que se emple en los applets cuando se queran capturar parmetros desde el cdigo html del applet. MUY USADO. String[] getParameterValues(String name): devuelve un array de String que contiene todos los values asociados al name que se le pasa al mtodo. Si el name no existe, devuelve null. Suele emplearse en las casillas de verificacin, los botones de opcin o radio-button, en las listas desplazables y en las listas desplegables con el fin de conocer las opciones seleccionadas por el usuario. Todas las opciones de eleccin comparten un name comn. Enumeration getParameterNames(): devuelve una Enumeration que contiene todos los names asociados a la peticin del cliente. Esta Enumeration se recorrer mediante los mtodos conocidos boolean hasMoreElements() y Object nextElement() Suele emplearse cuando se desconocen los nombres de los names de la peticin o son muchos y se necesitan capturar todos. String getProtocol(): devuelve el protocolo empleado en la comunicacin cliente-servidor y viceversa. String getRemoteAddr(): devuelve la direccin ip del cliente que realiza la peticin. String getRemoteHost(): devuelve el nombre del cliente que realiza la peticin. El contenedor web puede devolver la direccin ip en vez del nombre de dominio, si no puede resolverlo o si elige no hacerlo con el fin de mejorar su rendimiento. int getRemotePort(): devuelve el nmero de puerto por el que el cliente realiza la peticin. String getRemoteUser(): devuelve la contrasea del usuario que realiza la peticin si el acceso al servlet precisa de autentificacin. Si no, devuelve null. String getContentType(): devuelve el tipo MIME empleado en el cuerpo de la peticin. Si es desconocido por el cliente, devuelve null. String getMethod(): devuelve el tipo de peticin. Habitualmente get o post. Para explicar los siguientes mtodos, considerar que se invoca a PrimerServlet tecleando en la barra de direcciones del cliente http://localhost:8080/servlets-examples/PrimerServlet?nombre=Jesus. Antes de explicarlos, conviene tener clara la diferencia entre URI y URL.

29

Servlets URI (Uniform Resource Identifier): identifica a cualquier recurso. No indica cmo acceder al mismo. Ejemplo: para identificar a PrimerServlet, se emplea el contenido de la etiqueta <url-pattern> (/PrimerServlet) en el descriptor de despliegue

Podra haberse empleado otro URI para el servlet, como /cursofer/javaprofe/PrimerServlet. Verificarlo agregando al descriptor

e invocando a PrimerServlet mediante el siguiente URL http://localhost:8080/servlets-examples/cursofer/javaprofe/PrimerServlet?nombre=Jesus URL (Uniform Resource Locator): URIs que trabajan con tpicos protocolos de Internet como http, ftp, etc. y que indican cmo acceder al recurso. Ejemplo: http://localhost:8080/servlets-examples/PrimerServlet?nombre=Jesus String getQueryString(): devuelve la cadena de parmetros de la peticin siempre y cuando la peticin sea get. Si no, null. En el ejemplo, nombre=Jesus String getRequestURI(): devuelve la ruta URI de la peticin, es decir, la cadena situada entre el host y el puerto, y los parmetros. En el ejemplo, /servlets-examples/PrimerServlet StringBuffer getRequestURL(): devuelve el URL de la peticin. En el ejemplo, http://localhost:8080/servlets-examples/PrimerServlet?nombre=Jesus String getServletPath(): devuelve la ruta URI del servlet relativa al directorio raz de la aplicacin. No tiene en cuenta la cadena de parmetros. En el ejemplo, /PrimerServlet Enumeration getHeaderNames(): devuelve una Enumeration que contiene los names de los encabezados de peticin enviados por el cliente. String getHeader(String encabezadoPeticion): devuelve el valor del encabezado de peticin que se le pasa al mtodo. Se analizar con ms detenimiento en temas posteriores. Estos tres ltimos mtodos pertenecen a HttpServletRequest, el resto a su superinterface inmediata ServletRequest. Se aconseja al lector que consulte la API para conocer ms mtodos de estas interfaces. HttpServletResponse y su superinterface inmediata ServletResponse: declara mtodos que permiten la comunicacin en el sentido servidor-cliente y la generacin de las respuestas a las peticiones de los clientes. Ir a la API para ampliar informacin. Por el momento se explican los mtodos bsicos: PrintWriter getWriter(): devuelve un objeto de la clase java.io.PrintWriter que representa el flujo de salida que permite la escritura de caracteres. Se utiliza para generar la respuesta que se enva al cliente.

30

Servlets PrintWriter cuenta con mtodos adecuados para escribir dicha respuesta. Habitualmente se emplea println(String s). El uso de este mtodo provoca que deba importarse el paquete java.io, adems de los dos propios de los servlets. MUY USADO. void setContentType(String tipoMIME): especifica el tipo MIME de la respuesta y el cdigo de caracteres empleado para definirla. Por defecto, su valor es text/plain;ISO-8859-1 ServletOutputStream getOutputStream(): devuelve un objeto de la clase ServletOutputStream que modela un flujo de salida que permite la escritura de datos a nivel de bytes. Lanza una IOException que debe capturarse. Se har un ejercicio al final del tema. void addCookie(Cookie cookie): agrega un objeto de la clase Cookie en el cdigo de la respuesta que permite obtener informacin del cliente que ha realizado la peticin. Se ver ms adelante. void encodeURL(String s): se estudiar ms adelante en el tema de sesiones. void sentRedirect(String s): dem anterior. void sendError(int n): dem anterior. Estos tres ltimos mtodos pertenecen a HttpServletResponse Ahora se aconseja encarecidamente realizar el ejercicio 1 de la leccin, siguiendo los dos recordatorios indicados en su enunciado.

Servlets empaquetados
Habitualmente se trabaja con servlets empaquetados. Ejemplo: desde un formulario se invoca a un servlet empaquetado. El formulario no cambia. El cdigo del servlet s, pero slo su primera lnea, que ser package nombrePaquete; Cdigo del formulario Formulario1ConPaquete.html: el mismo que Formulario1Informacion.html del ejercicio 1, pero cambiando el action por <form method="post" action="/servlets-examples/ServletFormulario1ConPaquete"> NOTA: debe estar en tomcat_home\webapps\servlets-examples Se acceder al formulario desde el navegador tecleando en la barra de direcciones: http://localhost:8080/servlets-examples/Formulario1ConPaquete.html

Cdigo del servlet usando el package trilcejf: El mismo que el anterior, pero agregando como primera lnea "package nombrepaquete;" En este caso, package trilcejf;

31

Servlets NOTA: se crear un directorio de nombre trilcejf, colgando de tomcat_home\webapps\servlets-examples\WEB-INF\classes. Cuando se agregue el servlet al proyecto EjemplosTomcat, el valor de Location ser tomcat_home\webapps\servlets-examples\WEB-INF\classes\trilcejf

NOTA: no olvidar agregar al fichero tomcat_home\webapps\servlets-examples\WEB-INF\web.xml las lneas

y las lneas

32

Ejercicios
Ejercicio 1
Agregar al proyecto EjemplosTomcat, un servlet de nombre ServletFormulario1InformacionCliente y el formulario Formulario1Informacion. NOTA: El servlet se basar en ServletFormulario1, ya realizado en la leccin, y se le agregarn las lneas que correspondan en funcin de la informacin que debe capturar. El formulario ser casi igual que Formulario1del mismo ejemplo anterior, pero sin el enlace que apuntaba a ServletEnlace. Slo debe modificarse la lnea de la etiqueta form de este modo: <form method="post" action="/servlets-examples/ServletFormulario1InformacionCliente">

El servlet capturar la informacin enviada por el usuario desde el formulario y obtendr la siguiente informacin: Tipo de protocolo empleado para la comunicacin cliente-servidor Nombre y direccin ip del cliente Tipo de peticin Tipo MIME de la peticin Cadena de parmetros de la peticin Ruta URI de la peticin URL de la peticin Ruta URI del servlet Nombre del servidor y puerto a la escucha Encabezados de la peticin RECORDATORIO PARA TRABAJAR EN JCREATORPRO: Agregar el fichero Formulario1Informacion.html al proyecto EjemplosTomcat, pero antes de aceptar, pulsar el botn de los puntitos de Location e indicarle tomcat_home\webapps\servlets-examples

33

Servlets Agregar el servlet ServletFormulario1InformacionCliente. Para ello, actuar como antes, pero seleccionado Java File y en Location tomcat_home\webapps\servlets-examples\WEB-INF\classes Para verificar que los class resultantes de la compilacin de los servlets aparezcan en tomcat_home\webapps\servlets-examples\WEB-INF\classes (es lo indicado en la Output Path del proyecto), ir al men Project/Project Settings/Output Path y observar dicha ruta en el cuadro Output Path. Si no aparece, seleccionarla mediante el botn de los puntitos

OTRO RECORDATORIO: No olvidar agregar al fichero tomcat_home\webapps\servlets-examples\WEB-INF\web.xml las lneas

y las lneas

Respuesta al cliente:

34

Servlets

35

Você também pode gostar