|
|
Servlets (II):
La cara oculta de la web.
Para empezar con este tema
utilizamos un ejemplo sencillo que nos va a servir para entender la
forma básica de trabajar. El ejemplo va a consistir en una página
HTML en la que aparecerá un campo de entrada con los
correspondientes botones Submit y Reset típicos de cualquier
formulario de entrada de datos. Al pulsar sobre el primero de
ellos se producirá la ejecución del servlet en el
servidor, que procesará la información recibida, y
mostrará como resultado una página HTML con el texto
introducido con anterioridad.
CÓDIGO HTML En el
listado 1 se muestra el código HTML necesario para implementar
el ejemplo que nos hemos propuesto. Dentro del mismo destacan dos
partes: en primer lugar la cabecera del formulario, que indica la acción
a desencadenar en el servidor al pulsar el botón Submit, y en
segundo lugar la parte en que se define el propio formulario. El
fichero que contiene la página en formato de documento HTML se
llamará MiPrimerServlet.html, y lo guardaremos en el
subdirectorio /public_html dentro del directorio donde hayamos
instalado el JWS.
CÓDIGO DEL SERVLET. Para este
primer ejemplo, el código necesario va a ser mínimo,
como se puede observar en el Listado 2, lo que significa que es una
prueba de la enorme potencia y simplicidad derivada del uso de
servlets. En el programa destaca principalmente la utilización
de los paquetes javax.servlet.* y javax.servlet.http.*, y la cláusula
extends que define el programa de tipo HttpServlet. El fichero que
contiene el servlet lo llamaremos MiPrimerServlet.java y tras
compilarlo con el compilador del JDK (javac), almacenaremos el fichero
.class resultante en el directorio /servlets dentro del directorio
donde hayamos instalado el JWS.
CONFIGURACIÓN DEL
SERVLET EN EL JWS. Para que el servlet funcione sin problemas en
el JWS es necesario darlo de alta. En primer lugar hay que activar el
JWS ejecutando el programa httpd.exe que se encuentra en el directorio
/bin. Una vez activado, con el navegador que deseemos accederemos a la
parte de administración. Para acceder a la página
principal habría que introducir una dirección como
http://[nombre_servidor_DNS]:8080/, y desde aquí podremos
acceder al applet de Administración. Tras introducir nombre y
contraseña del Administrador (por defecto admin/admin),
aparecerá una página donde se podrá escoger el
servicio que deseamos configurar. En nuestro caso seleccionaremos
Web Service, tras lo cual aparecerá una ventana donde deberemos
pulsar sobre el botón Servlets. El programa mostrará una
estructura de tipo árbol, donde seleccionaremos Add. A
continuación introduciremos los datos, tal y como indica la
figura 4 y pulsaremos de nuevo sobre Add. Además será
necesario introducir una serie de datos adicionales, tras lo cual
pincharemos sobre Save. Tras efectuar los pasos indicados, podremos
salir y realizar la ejecución del ejemplo.
EJECUCIÓN
DEL SERVLET DE EJEMPLO. Para ejecutar y comprobar el correcto
funcionamiento de nuestro servlet, solamente tendríamos que
introducir en nuestro navegador una dirección como
http://[nombre_servidor_DNS]:8080/ MiPrimerServlet.html.
El método
service. El servlet más simple posible es aquél que
sólo implementa el método service, el cual se encarga de
procesar la petición del cliente. Utiliza dos parámetros,
uno de petición y otro de respuesta. En el caso particular del
protocolo http se utilizan instancias de las clases (o interfaces)
HttpServletRequest y HttpServletResponse respectivamente. Estos parámetros
encapsulan los datos que son enviados tanto desde el cliente, como
desde el servidor. De hecho, normalmente se utilizan input streams
para recuperar datos desde el cliente, y output streams para
responder. En nuestro caso utilizamos PrintStream para responder al
cliente. Para recuperar los datos que manda el cliente, utilizamos
el método getParameter, que es heredado por HttpServletRequest
de la interfaz ServletRequest. Finalmente, utilizando el stream de
salida se envía la respuesta al cliente. Como puede verse, el
programa es muy sencillo, pero la funcionalidad muy alta.
Ejercicio. Cómo
ejercicio para el lector se propone la implementación de un
servlet similar al anterior. Deberá aparecer un formulario
HTML, con dos campos de entrada. Un primer campo para introducir el
nombre, y otro para introducir la dirección e-mail. El servlet
deberá responder con los datos introducidos, incluyendo además
la dirección IP desde donde está conectado el cliente.
Para obtener esta dirección IP se debe utilizar el método
getRemoteAddr de la interfaz HttpServletRequest (en la tabla 1 se
encuentra toda la información necesaria sobre este método).
UNA
DEFINICIÓN MÁS FORMAL Podríamos definir un
Servlet como un programa JAVA que se ejecuta en el marco de un
servicio de red, como por ejemplo un servidor web, y que recibe y
responde a las peticiones de un cliente.
El Ciclo de Vida Los
servlets al igual que los applets poseen un Ciclo de Vida
perfectamente definido controlado por el entorno (una vez más
se podría poner como ejemplo un servidor web). La interfaz que
se utiliza para implementarlos define una serie de métodos para
cada una de sus etapas, y como ya se ha comentado, es el entorno el
que se encarga de invocarlos. El orden seguido es el siguiente:
1).
Cuando el servidor carga el servlet (solo lo carga ante la primera
petición, después ya no hace falta), invoca el método
init. Todas las peticiones que lleguen antes de que este método
finalice su ejecución habrán de esperar para ser
atendidas.
2) Una vez finalizada la ejecución de dicho
método, todas las peticiones son atendidas por el método
service. Normalmente el servidor puede manejar varias peticiones
simultáneamente y asigna un hilo propio (thread) a cada petición.
3)
Cuando el servidor quiere descargar el servlet invoca el método
destroy.
En un próximo capítulo se estudiarán
con mayor detalle estos métodos.
El API de los
servlets El API utilizado para la programación de Servlets
incluye dos paquetes: El paquete javax.servlet, que es la base, y
que define la interfaz Servlet y su implementación
GenericServlet. Es esta la interfaz que define los métodos del
Ciclo de Vida. También destacan las interfaces ServletRequest y
ServletResponse, que definen la mecánica de las peticiones y
las respuestas. El paquete javax.servlet.http, que es una
especialización del paquete anterior, se utiliza con el
protocolo http. Este paquete define la clase HttpServlet que es una
extensión de GenericServlet. Asimismo incluye las interfaces
HttpServletRequest y HttpServletResponse, que son extensiones de
ServletRequest y ServletResponse respectivamente.
En un próximo
capítulo también se estudiarán en profundidad
estos dos paquetes, cuya aportación para el trabajo con
servlets es fundamental.
|