Servlets y JSP

Aqu� tenemos un servlet b�sico que maneja peticiones GET. Las peticiones GET, para aquellos que no estemos familiarizados con HTTP, son peticiones hechas por el navegador cuando el usuario teclea una URL en la l�nea de direcciones, sigue un enlace desde una p�gina Web, o rellena un formulario que no especifica un METHOD. Los Servlets tambi�n pueden manejar peticiones POST muy f�cilmente, que son generadas cuando alguien crea un formulario HTML que especifica METHOD="POST". Los discutiremos en una secci�n posterior.

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

public class SomeServlet extends HttpServlet {
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
      throws ServletException, IOException {
      
    // Use "request" to read incoming HTTP headers (e.g. cookies)
    // and HTML form data (e.g. data the user entered and submitted)
    
    // Use "response" to specify the HTTP response line and headers
    // (e.g. specifying the content type, setting cookies).
    
    PrintWriter out = response.getWriter();
    // Use "out" to send content to browser
  }
}

(Descarga la plantilla de c�digo fuente -- pulsa con el bot�n derecho del rat�n sobre el enlace o mant�n pulsada la tecla SHIFT mientras pulsas sobre el enlace).

Para ser un servlet, una clase deber�a extender HttpServlet y sobreescribir doGet o doPost (o ambos), dependiendo de si los datos est�n siendo enviados mediante GET o POST. Estos m�todos toman dos argumentos: un HttpServletRequest y un HttpServletResponse.

El HttpServletRequest tiene m�todos que nos permiten encontrar informaci�n entrante como datos de un FORM, cabeceras de petici�n HTTP, etc. El HttpServletResponse tiene m�todos que nos permiten especificar l�neas de respuesta HTTP (200, 404, etc.), cabeceras de respuesta (Content-Type, Set-Cookie, etc.), y, todav�a m�s importante, nos permiten obtener un PrintWriter usado para env�ar la salida de vuelta al cliente. Para servlets sencillos, la mayor�a del esfuerzo se gasta en sentencias println que generan la p�gina deseada. Observamos que doGet y doPost lanzan dos excepciones, por eso es necesario incluirlas en la declaraci�n. Tambi�n observamos que tenemos que importar las clases de los paquetes java.io (para PrintWriter, etc.), javax.servlet (para HttpServlet, etc.), y javax.servlet.http (para HttpServletRequest y HttpServletResponse). Finalmente, observamos que doGet y doPost son llamados por el m�todo service, y algunas veces queremos sobreescribir directamente el m�todo service, por ejemplo, para un servlet que maneje tanto peticiones GET como POST.

.�Un Sencillo Servlet que Genera Texto Normal

Aqu� tenemos un servlet que s�lo genera texto normal. La siguiente secci�n mostrar� el caso m�s usual donde se generar� HTML.

.�HelloWorld.java

Tambi�n puedes descargar el c�digo fuente

package hall;

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

public class HelloWorld extends HttpServlet {
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
      throws ServletException, IOException {
    PrintWriter out = response.getWriter();
    out.println("Hello World");
  }
}

.�Compilar e Instalar el Servlet

Debemos observar que los detalles espec�ficos para instalar servlets varian de servidor en servidor. Los ejemplos se han probado sobre Java Web Server (JWS) 2.0, donde se espera que los servlets est�n en un directorio llamado servlets en el �rbol de instalaci�n del JWS. Sin embargo, hemos situado este servlet en un paquete separado (hall) para evitar conflictos con otros servlets del servidor; querr�s hacer lo mismo si usas un servidor Web que es usado por otras personas y no tiene buena estructura para "servlets virtuales" para evitar autom�ticamente estos conflictos. As�, HelloWorld.java realmente va en un sudirectorio llamado hall en el directorio servlets. Observa que la configuraci�n de la mayor�a de los servidores, y los ejemplos de este turtorial tambi�n se han probado usando BEA WebLogic e IBM WebSphere 3.0. WebSphere tiene un excelente mecanismo para servlets virtuales, y no es necesario usar paquetes, s�lo para evitar conflictos de nombres con otros usuarios.

Una forma de configurar nuestro CLASSPATH es apuntar al directorio superior al que contiene realmente nuestros servlets. Entonces podemos compilar normalmente desde dentro del directorio. Por ejemplo, si nuestro directorio base es C:\JavaWebServer\servlets y el nombre de nuestro paquete es (y por lo tanto el del subdirectorio) es hall, y trabajamos bajo Windows, deberiamos hacer:

DOS> set CLASSPATH=C:\JavaWebServer\servlets;%CLASSPATH%
DOS> cd C:\JavaWebServer\servlets\hall
DOS> javac YourServlet.java

La primea parte, configura el CLASSPATH, probablemente querremos hacerlo permanentemente, en vez de hacerlo cada que arrancamos una nueva ventana del DOS. En Windows 95/98 pondremos la sentencia "set CLASSPATH=..." en alg�n lugar de nuestro fichero autoexec.bat despu�s de la l�nea que selecciona nuestro CLASSPATH para apuntar a servlet.jar y jsp.jar.

Una segunda forma de compilar las clases que est�n en paquetes es ir al directorio superior del que contiene los Servlets, y luego hacer "javac directory\YourServlet.java". Por ejemplo, supongamos de nuevo que nuestro directorio base es C:\JavaWebServer\servlets y que el nombre de nuestro paquete (y del directorio) es hall, y que estamos trabajando en Windows. En este caso, haremos los siguiente:

DOS> cd C:\JavaWebServer\servlets
DOS> javac hall\YourServlet.java

Finalmente otra opci�n avanzada es mantener el c�digo fuente en una localizaci�n distinta de los ficheros .class. y usar la opci�n "-d" de javac para instalarlos en la localizaci�n que espera el servidor Web.

.�Ejecutar el Servlet

Con el Java Web Server, los servlets se sit�an en el directorio servlets dentro del directorio principal de la instalaci�n del JWS, y son invocados mediante http://host/servlet/ServletName. Observa que el directorio es servlets, plural, mientras que la referencia URL es servlet, singular. Como este ejemplo se situ� en el paquete hall, ser�a invocado mediante http://host/servlet/hall.HelloWorld. Otros servidores podr�an tener convenciones diferentes sobre donde instalar los servlets y como invocarlos. La mayor�a de los servidores nos permiten definir alias para nuestros servlets, para que un servlet pueda ser invocado mediante http://host/any-path/any-file.html.

Resultado del servlet

.�Un Servlet que Genera HTML

La mayor�a de los Servlets generan HTML, no texto normal como el ejemplo anterior. Para hacer esto, necesitamos dos pasos adicionales, decirle al navegador que est�mos devolviendo HTML. y modificar la sentencia println para construir una p�gina Web legal. El primer paso se hace configurando la cabecera de respuesta Content-Type. En general, las cabeceras de respuesta se configuran mendiante el m�todo setHeader de HttpServletResponse, pero seleccionar el tipo de contenido es una tarea muy com�n y por eso tiene un m�todo especial setContentType s�lo para este prop�sito. Observa que necesitamos configurar las cabeceras de respuesta antes, de devolver alg�n contenido mediante PrintWriter. Aqu� hay un ejemplo:

.�HelloWWW.java

Tambi�n puedes descargar El C�digo fuente.

package hall;

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

public class HelloWWW extends HttpServlet {
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
      throws ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " +
                                        "Transitional//EN\">\n" +
                "<HTML>\n" +
                "<HEAD><TITLE>Hello WWW</TITLE></HEAD>\n" +
                "<BODY>\n" +
                "<H1>Hello WWW</H1>\n" +
                "</BODY></HTML>");
  }
}

.�Resultado de HelloWWW

.�Utilidades de Construcci�n de HTML Sencillo

Es un poco aburrido generar HTML con sentencias println. La soluci�n real es usar Java Server Pages (JSP), que se describen m�s adelante. Sin embargo, para Servlets est�ndards, hay dos partes de la p�gina Web que no cambian (DOCTYPE y HEAD) y que podr�a beneficiarnos el incluirlas en un fichero de utilidades.

La l�nea DOCTYPE es t�cnicamente requerida por la especificaci�n HTML, y aunque la mayor�a de los navegadores Web la ignoran, es muy �til cuando se env�an p�ginas a validadores de formato HTML. Estos validadores comparan la s�ntaxis HMTL de las p�ginas compar�ndolas con la especificaci�n formal del HTML, y usan la l�nea DOCTYPE para determinar la versi�n de HTML con la que comparar.

En muchas p�ginas web, la l�nea HEAD no contiene nada m�s que el TITLE, aunque los desarrolladores avanzados podr�an querer incluir etiquetas META y hojas de estilo. Pero para el caso sencillo, crearemos un m�todo que crea un t�tulo y devuelve las entradas DOCTYPE, HEAD, y TITLE como salida. Aqu� est� el c�digo:

.�ServletUtilities.java

Tambi�n puedes descargar El C�digo fuente.

package hall;

public class ServletUtilities {
  public static final String DOCTYPE =
    "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">";

  public static String headWithTitle(String title) {
    return(DOCTYPE + "\n" +
           "<HTML>\n" +
           "<HEAD><TITLE>" + title + "</TITLE></HEAD>\n");
  }
  
  // Other utilities will be shown later...
}

.�HelloWWW2.java

Tambi�n puedes descargar El C�digo fuente.

Aqu� tenemos una nueva versi�n de la clase HelloWWW que usa esto

package hall;

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

public class HelloWWW2 extends HttpServlet {
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
      throws ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println(ServletUtilities.headWithTitle("Hello WWW") +
                "<BODY>\n" +
                "<H1>Hello WWW</H1>\n" +
                "</BODY></HTML>");
  }
}

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR