Ejemplo sencillo de Servlet

De ChuWiki



Introducción[editar]


Un Servlet es una clase Java usada para extender la capacidad de aplicaciones basadas en el modelo cliente-servidor y que utilizan el protocolo HTTP basado en la interacción de ambos extremos por medio de una petición y una respuesta.

Los Servlets son una potente herramienta para la generación de contenido dinámico en la Web.

El Contenedor de Servlets (a veces llamado servidor) es el componente encargado de la gestión de los Servlets (instanciar, acceso, destrucción...), y el que controla su ciclo de vida. Dicho contenedor de Servlets, será un programa adicional que hay que instalar para dar soporte a este tipo de aplicaciones Java en entornos J2EE. Algunos de estos "contenedores" disponibles son MacroMedia JRun, Bea WebLogic, Sun One y uno de los más populares: Apache Tomcat.

Por lo tanto es requisito indispensable tener instalado un JDK actualizado previamente a la instalación del Tomcat, ambos necesarios para escribir y probar tanto servlets como páginas JSP, elementos habituales de las aplicaciones J2EE. La instalación de Tomcat no plantea serios problemas y ya está comentada en otro artículo de la ChuWiki, en Instalación de Tomcat en Windows.

Preparación[editar]


Para este primer ejemplo, realizaremos una página HTML (Param.html) que incluirá un formulario a rellenar por el usuario (cliente). Cuando éste pulse el botón de "Enviar", se llamará a un servlet (ParamServlet.java) que recogerá los datos tecleados y generará una "página dinámica" como respuesta, con los datos y que será mostrada de nuevo al cliente que desencadenó el proceso. Para que exista un servlet atento a las peticiones que le vayan llegando, tendremos instalado e iniciado el contenedor de servlets (Tomcat) al que configuraremos un archivo (web.xml) donde deben figurar todos los servlets disponibles para su ejecución.

Antes de escribir ninguno de los tres ficheros, es importante señalar unos cuantos requisitos que hay que cumplir para escribir servlets. Una vez instalado el contenedor, existirá un directorio llamado "webapps". Es en él donde colocaremos todas las aplicaciones web que hagamos (servlets, jsp, ejb, etc). Lo ideal es que nos creemos otro directorio dentro del mismo y allí dentro, otra estructura de directorios que incluirán uno llamado "WEB-INF" y dentro de ese, otro con el nombre "classes" (exactamente, incluyendo las mayúsculas, guiones, etc. Para la práctica, yo hice el directorio "misServlets", quedando la estructura siguiente:

+---Tomcat 5.5
   |
   +---webapps
      |
      +---misServlets
         | Param.html
         |
         +---WEB-INF
            | web.xml
            |
            +---classes
                 ParamServlet.class


Pues listamos en primer lugar la página "Param.html".

La página html[editar]


<!--Param.html	Lectura de parámetros con formularios + servlets -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
  <HEAD><TITLE>Param.html</TITLE></HEAD>
  <BODY BGCOLOR="#CCCCFF">
  <P></P>
  <H2>Introduce tus datos:</H2><BR>
    <HR></HR>
    <CENTER>
	 <FORM NAME="FORM1" METHOD="POST"
		ACTION="http://localhost:8080/misServlets/ParamServlet">
	   <TABLE BORDER>
		<TR>
		  <TD><B>Nombre:</TD>
		  <TD><INPUT ENGINE=TEXTBOX NAME="NOM" SIZE="25" VALUE=""></TD>
		</TR>
		<TR>
		  <TD><B>Edad:</TD>
		  <TD><INPUT ENGINE=TEXTBOX NAME="EDA" SIZE="20" VALUE=""></TD>
		</TR>
	   </TABLE>
	   <P></P>
	   <INPUT ENGINE=SUBMIT VALUE="Enviar">
	   <HR></HR>
	   Formulario HTML que invocará a un servlet
         </FORM>
      </CENTER>
  </BODY>
</HTML>

Observemos unos cuantos puntos importantes. En la página incluimos un formulario rellenable. Comienza con <FORM...> y termina con </FORM>. En él se indica que los datos se enviarán mediante el "Método POST" al servlet, cuyo nombre es "ParamServlet" y está en un directorio llamado "misServlets", en el contenedor Tomcat. Dicho contenedor está en el mismo ordenador ya que el nombre del servidor que lo alberga es "localhost". Esa llamada al servlet se producirá en cuando el usuario pulse el botón "Enviar" (<INPUT ENGINE=SUBMIT>). La página la colocamos en la carpeta "misServlets" (o el nombre decidido para este fin).


El servlet[editar]


Pongamos ahora el código del servlet, no sin antes indicar que hay que incluirle la librería servlet-api.jar, que se encuentra en la carpeta de Tomcat ..\common\lib. Se puede establecer el classpath, copiarla, o adjuntarla al proyecto. En Eclipse es con las opciones Project->Properties->Java Build Path->Libraries y botón "Add external jar" para, navegando, incluir el fichero mencionado.

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ParamServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		// Obtenemos un objeto Print Writer para enviar respuesta
		res.setContentType("text/html");
		PrintWriter pw = res.getWriter();
		pw.println("<HTML><HEAD><TITLE>Leyendo parámetros</TITLE></HEAD>");
		pw.println("<BODY BGCOLOR=\"#CCBBAA\">");
		pw.println("<H2>Leyendo parámetros desde un formulario html</H2><P>");
		pw.println("<UL>\n");
		pw.println("Te llamas " + req.getParameter("NOM") + "<BR>");
		pw.println("y tienes "  + req.getParameter("EDA") + " años<BR>");
		pw.println("</BODY></HTML>");
		pw.close();
	}
} 

Una vez compilado este programa, se coloca en la carpeta classes de la estructura que hicimos.


El descriptor[editar]


Por último nos queda escribir el "descriptor de despliegue", elemento necesario antes de que pueda invocarse cualquier servlet y que describe cada uno de ellos. Este fichero se llama siempre web.xml, por lo que podemos copiarnos otro cualquiera de carpetas similares (yo tomé el de la carpeta ROOT, que también cuelga de webapps). Luego lo editamos a nuestro gusto y lo dejamos más o menos así:

<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">

  <display-name>Servlets ejemplo</display-name>
  <description>
     Servlets de ejemplo para practicar
  </description>

<!-- Publicamos nuestro servlet aqui -->

    <servlet>
        <servlet-name>ParamServlet</servlet-name>
        <servlet-class>ParamServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>ParamServlet</servlet-name>
        <url-pattern>/ParamServlet</url-pattern>
    </servlet-mapping>

<!-- Fin de la publicacion de servlets -->

</web-app>

Es importante ser cuidadoso con la sintaxis, ya que los errores por fallos en este archivo a veces son difíciles de detectar. Obsérvese cómo incluimos dos etiquetas <servlet> y <servlet-mapping> que dan a conocer este servlet al contenedor. Una vez que lo iniciemos, estará disponible para ser invocado.

Para ejecutar esta aplicación, nos iríamos a la carpeta bin de Tomcat a ejecutar el programa Tomcat5.exe, que abrirá una consola que observaremos detenidamente para comprobar que no hay errores. Si todo va bien, quedará así:

Ejecución y resultados[editar]


Si todo lo anterior ha funcionado, ya podemos abrir nuestro navegador favorito y teclear en la barra de navegación

http://localhost:8080/misServlets/Param.html

Si pusimos la página donde se indicó (misServlets), no debería haber problemas. Las dificultades pueden venir al pulsar el botón Enviar del formulario, momento en el cual se envía la "petición" del usuario a Tomcat. El contenedor recibe la petición y buscará el servlet en la lista de los posibles en nuestro descriptor web.xml. Si todo está bien, será encontrado e invocado, ejecutando el método POST (que es como el main), ya que así se indicaba en la etiqueta <FORM> de la página HTML. El método Post() tiene dos argumentos. El primero representa la "petición" del cliente (usuario remoto) y con el nombre de HttpServletRequest; el segundo es la "respuesta" que generará el servlet hacia el cliente en la forma del objeto HttpServletResponse. El servlet, lo primero, ha de indicar el tipo de información que se va a emitir (html) y luego forma un objeto asociado con el navegador web del cliente para imprimir allí los resultados, por medio del método getWriter(). Extraerá los datos de los cuadro de texto (el nombre y la edad) mediante los métodos getParameter() y se dedicará a formar la página HTML dinámica. Una vez terminada, se cierra (close) y es enviada automáticamente.

Bueno, pues hasta aquí hemos llegado por hoy.

--Pete 17:37 25 ene 2007 (EST)