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 necesaria 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 querremos sobreescribir directamente el método service, por ejemplo, para un servlet que maneje tanto peticiones GET como POST.
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");
}
}
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:
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.DOS> set CLASSPATH=C:\JavaWebServer\servlets;%CLASSPATH% DOS> cd C:\JavaWebServer\servlets\hall DOS> javac YourServlet.java
Una segunda forma de compilar las clases que están en paquetes es ir al directorio superior del que contiene los servelts, 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 sigueinte:
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.DOS> cd C:\JavaWebServer\servlets DOS> javac hall\YourServlet.java
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>");
}
}
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íntasis 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:
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...
}
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>");
}
}