Cuando un servidor Web responde a una petici�n de un navegador u otro cliente Web, la respuesta consiste t�picamente en una l�nea de estado, algunas cabeceras de respuesta, una l�nea en blanco, y el documento. Aqu� tenemos un ejemplo m�nimo:
HTTP/1.1 200 OK Content-Type: text/plain Hello World
La l�nea de estado consiste en la versi�n HTTP, y un entero que se interpreta como c�digo de estado, y un mensaje muy corto que corresponde con el c�digo de estado. En la mayor�a de los casos, todas las cabeceras son opcionales excepto Content-Type, que especifica el tipo MIME del documento que sigue. Aunque muchas respuestas contienen un documento, algunas no lo tienen. Por ejemplo, las respuestas a peticiones HEAD nunca deber�an incluir un documento, y hay una gran variedad de c�digos de estado que esencialmente indican fallos, y o no incluyen un documento o s�lo incluyen un peque�o "mensaje de error de documento".
Los servlets pueden realizar una variedad de tareas manipulando la l�nea de estado y las cabeceras de respuesta. Por ejemplo, reenviar al usuario a otros sites; indicar que el documento adjunto es una imagen, un fichero Acrobat, o (m�s comunmente) un fichero HTML; decirle al usuario que se requiere una password para acceder al documento; etc. Esta secci�n explica varios c�digos de estados diferentes y como se pueden conseguir, mientras que la p�gina siguiente describe la cabeceras de respuesta.
�Especificar C�digos de Estado
Como se describe arriba, la l�nea de estado de respuesta HTPP consiste en una versi�n HTTP, un c�digo de estado, y un mensaje asociado. Como el mensaje est� asociado directamente con el c�digo de estado y la versi�n HTTP est� determinada por el servidor, todo lo que servidor tiene que hacer es seleccionar el c�digo de estado. La forma de hacer esto es mediante el m�todo setStatus de HttpServletResponse. El m�todo setStatus toma un int (el c�digo de estado) como argumento, pero en vez de usar los n�mero expl�citamente, es m�s claro y legible usar las constantes definidas en HttpServletResponse. El nombre de cada constante est� derivado del mensaje est�ndard HTTP 1.1 para cada constante, todo en may�sculas con un prefijo SC (por Status Code) y los espacios se cambian por subrayados. As�, como el mensaje para 404 es Not Found, la constante equivalente en HttpServletResponse es SC_NOT_FOUND. Sin embargo, hay dos excepciones. Por alguna raz�n oculta la constante para el c�digo 302 se deriva del mensaje HTTP 1.0, no de HTTP 1.1, y la constante para el c�digo 307 no existe tampoco.
Seleccionar el c�digo de estado no siempre signifia que no necesitemos devolver un documento. Por ejemplo, aunque la mayor�a de los servidores generar�n un peque�o mensaje "File Not Found" para respuestas 404, un servlet podr�a querer personalizar esta respuesta. Sin embargo, si hacemos esto, necesitamos estar seguros de llamar a response.setStatus antes de enviar el contenido mediante PrintWriter.
Aunque el m�todo general de selecci�n del c�digo de estado es simplemente llamar a response.setStatus(int), hay dos casos comunes para los que se proporciona un m�todo atajo en HttpServletResponse. El m�todo sendError genera un respuesta 404 junto con un mensaje corto formateado dentro de un documento HTML. Y el m�todo sendRedirect genera una respuesta 302 junto con una cabecera Location indicando la URL del nuevo documento.
�C�digos de Estado HTTP 1.1 y sus Significados
Aqu� hay una lista de todas los c�digos de estado disponibles en HTTP 1.1 junto con sus mensajes asociados y su interpretaci�n. Deber�amos ser cuidadosos al utilizar los c�digos de estado que est�n disponibles s�lo en HTTP 1.1, ya que muchos navegadores s�lo soportan HTTP 1.0. Si tenemos que usar c�digos de estado espec�ficos para HTTP 1.1, en la mayor�a de los casos querremos chequear expl�citamente la versi�n HTTP de la petici�n (mediante el m�todo getProtocol de HttpServletRequest) o reservarlo para situaciones donde no importe el significado de la cabecera HTTP 1.0.
| C�digo de Estado | Mensaje Asociado | Significado |
|---|---|---|
| 100 | Continue | Contin�a con petici�n parcial (nuevo en HTTP 1.1) |
| 101 | Switching Protocols | El servidor cumplir� con la cabecera Upgrade y cambiar� a un protocolo diferente. (Nuevo en HTTP 1.1) |
| 200 | OK | Todo est� bien; los documentos seguidos por peticiones GET y POST. Esto es por defecto para los Servlets, si no usamos setStatus, obtendremos esto. |
| 201 | Created | El servidor creo un documento; la cabecera Location indica la URL. |
| 202 | Accepted | La petici�n se est� realizando, el proceso no se ha completado. |
| 203 | Non-Authoritative Information | El documento est� siendo devuelto normalmente, pero algunas cabeceras de respuesta podr�an ser incorrectas porque se est� usando una copia del documento (Nuevo en HTTP 1.1) |
| 204 | No Content | No hay un documento nuevo; el navegador cont�nua mostrando el documento anterior. Esto es �til si el usuario recarga peri�dicamente una p�gina y podemos determinar que la p�gina anterior ya est� actualizada. Sin embargo, esto no funciona para p�ginas que se recargan autom�ticamente mediante cabeceras de respuesta Refresh o su equivalente <META HTTP-EQUIV="Refresh" ...>,ya que al devolver este c�digo de estado se parar�n futuras recargas. |
| 205 | Reset Content | No hay documento nuevo, pero el navegador deber�a resetear el documento. Usado para forzar al navegador a borrar los contenidos de los campos de un formulario CGI (Nuevo en HTTP 1.1) |
| 206 | Partial Content | El cliente env�a una petici�n parcial con una cabecera Range, y el servidor la ha completado. (Nuevo en HTTP 1.1) |
| 300 | Multiple Choices | El documento pedido se puede encontrar en varios sitios; ser�n listados en el documento devuelto. Si el servidor tiene una opci�n preferida, deber�a listarse en la cabecera de respuesta Location . |
| 301 | Moved Permanently | El documento pedido est� en alg�n lugar, y la URL se da en la cabecera de respuesta Location. Los navegadores deber�an seguir autom�ticamente el enlace a la nueva URL. |
| 302 | Found | Similar a 301, excepto que la nueva URL deber�a ser interpretada como reemplazada temporalmente, no permanentemente. Observa: el mensaje era "Moved Temporarily" en HTTP 1.0, y la constante en HttpServletResponse es SC_MOVED_TEMPORARILY, no SC_FOUND. Cabecera muy �til, ya que los navegadores siguen autom�ticamente el enlace a la nueva URL. Este c�digo de estado es tan �til que hay un m�todo especial para ella, sendRedirect. Usar response.sendRedirect(url) tiene un par de ventajas sobre hacer response.setStatus(response.SC_MOVED_TEMPORARILY) y response.setHeader("Location", url). Primero, es m�s f�cil. Segundo, con sendRedirect, el servlet autom�ticamente construye una p�gina que contiene el enlace (para mostrar a los viejos navegadores que no siguen las redirecciones autom�ticamente). Finalmente, sendRedirect puede manejar URLs relativas, autom�ticamentes las traducen a absolutas.
Observa que este c�digo de estado es usado algunas veces de forma intercambiada con 301. Por ejemplo, si err�neamente pedimos http://host/~user (olvidando la �ltima barra), algunos servidores enviar�n 301 y otros 302. T�cnicamente, se supone que los navegadores siguen autom�ticamente la redirecci�n su la petici�n original era GET. Puedes ver la cabecera 307 para m�s detalles. |
| 303 | See Other | Igual que 301/302, excepto que si la petici�n original era POST, el documento redirigido (dado en la cabecera Location) deber�a ser recuperado mediante GET. (Nuevo en HTTP 1.1) |
| 304 | Not Modified | El cliente tiene un documento en el cach� y realiza una petici�n condicional (normalmente suministrando una cabecera If-Modified-Since indicando que s�lo quiere documentos m�s nuevos que la fecha especificada). El servidor quiere decirle al cliente que el viejo documento del cach� todav�a est� en uso. |
| 305 | Use Proxy | El documento pedido deber�a recuperarse mediante el proxy listado en la cabecera Location. (Nuevo en HTTP 1.1) |
| 307 | Temporary Redirect | Es id�ntica a 302 ("Found" o "Temporarily Moved"). Fue a��dido a HTTP 1.1 ya que muchos navegadores siguen err�neamente la redirecci�n de una respuesta 302 incluso si el mensaje original fue un POST, y s�lo se debe seguir la redirecci�n de una petici�n POST en respuestas 303. Esta respuesta es algo amb�gua: sigue el redireccionamiento para peticiones GET y POST en el caso de respuestas 303, y en el caso de respuesta 307 s�lo sigue la redirecci�n de peticiones GET. Nota: por alguna raz�n no existe una constante en HttpServletResponse que corresponda con este c�digo de estado. (Nuevo en HTTP 1.1) |
| 400 | Bad Request | Mala S�ntaxis de la petici�n. |
| 401 | Unauthorized | El cliente intenta acceder a una p�gina protegida por password sin las autorizaci�n apropiada. La respuesta deber�a incluir una cabecera WWW-Authenticate que el navegador deber�a usar para mostrar la caja de di�logo usuario/password, que viene de vuelta con la cabecera Authorization. |
| 403 | Forbidden | El recurso no est� disponible, si importar la autorizaci�n. Normalmente indica la falta permisos de fichero o directorios en el servidor. |
| 404 | Not Found | No se pudo encontrar el recurso en esa direcci�n. Esta la respuesta est�ndard "no such page". Es tan c�m�n y �til esta respuesta que hay un m�todo especial para ella en HttpServletResponse: sendError(message). La ventaja de sendError sobre setStatus es que, con sendErr, el servidor genera autom�ticamente una p�gina que muestra un mensaje de error. |
| 405 | Method Not Allowed | El m�todo de la petici�n (GET, POST, HEAD, DELETE, PUT, TRACE, etc.) no estaba permitido para este recurso particular. (Nuevo en HTTP 1.1) |
| 406 | Not Acceptable | El recurso indicado genera un tipo MIME incompatible con el especificado por el cliente mediante su cabecera Accept. (Nuevo en HTTP 1.1) |
| 407 | Proxy Authentication Required | Similar a 401, pero el servidor proxy deber�a devolver una cabecera Proxy-Authenticate. (Nuevo en HTTP 1.1) |
| 408 | Request Timeout | El cliente tarda demasiado en env�ar la petici�n. (Nuevo en HTTP 1.1) |
| 409 | Conflict | Usualmente asociado con peticiones PUT; usado para situaciones como la carga de una versi�n incorrecta de un fichero. (Nuevo en HTTP 1.1) |
| 410 | Gone | El documento se ha ido; no se conoce la direcci�n de reenvio. Difiere de la 404 en que se sabe que el documento se ha ido permanentemente, no s�lo est� indisponible por alguna raz�n desconocida como con 404. (Nuevo en HTTP 1.1) |
| 411 | Length Required | El servidor no puede procesar la petici�n a menos que el cliente env�e una cabecera Content-Length. (Nuevo en HTTP 1.1) |
| 412 | Precondition Failed | Alguna condici�n pr�via especificada en la petici�n era falsa (Nuevo en HTTP 1.1) |
| 413 | Request Entity Too Large | El documento pedido es mayor que lo que el servidor quiere manejar ahora. Si el servidor cree que puede manejarlo m�s tarde, deber�a incluir una cabecera Retry-After. (Nuevo en HTTP 1.1) |
| 414 | Request URI Too Long | La URI es demsiado larga. (Nuevo en HTTP 1.1) |
| 415 | Unsupported Media Type | La petici�n est� en un formato desconocido. (Nuevo en HTTP 1.1) |
| 416 | Requested Range Not Satisfiable | El cliente incluy� una cabecera Range no satisfactoria en la petici�n. (Nuevo en HTTP 1.1) |
| 417 | Expectation Failed | No se puede conseguir el valor de la cabecera Expect. (Nuevo en HTTP 1.1) |
| 500 | Internal Server Error | Mensaje gen�rico "server is confused". Normalmente es el resultado de programas CGI o servlets que se quedan colgados o retornan cabeceras mal formateadas. |
| 501 | Not Implemented | El servidor no soporta la funcionalidad de rellenar peticiones. Usado, por ejemplo, cuando el cliente env�a comandos como PUT que el cliente no soporta. |
| 502 | Bad Gateway | Usado por servidores que act�an como proxies o gateways; indica que el servidor inicial obtuvo una mala respuesta desde el servidor remoto. |
| 503 | Service Unavailable | El servidor no puede responder debido a mentenimiento o sobrecarga. Por ejemplo, un servlet podr�a devolver esta cabecera si alg�n almacen de threads o de conexiones con bases de datos est�n llenos. El servidor puede suministrar una cabecera Retry-After. |
| 504 | Gateway Timeout | Usado por servidores que act�an como proxies o gateways; indica que el servidor inicial no obtuvo una respuesta a tiempo del servidor remoto. (Nuevo en HTTP 1.1) |
| 505 | HTTP Version Not Supported | El servidor no soporta la versi�n de HTTP indicada en la l�nea de petici�n. (Nuevo en HTTP 1.1) |
�Ejemplo: Motor de B�squeda
Aqu� tenemos un ejemplo que hace uso de los dos c�digos de estado m�s comunes distintos de 200: 302 y 404. El c�digo 302 se selecciona mediante el m�todo sendRedirect, y 404 se selecciona mediante sendError.
En esta aplicaci�n, primero un formulario HTML muestra una p�gina que permite al usuario elegir una cadena de b�squeda, el n�mero de los resultados por p�gina, y el motor de b�squeda a utilizar. Cuando se env�a el formulario, el servlet extrae estos tres par�metros, construye una URL con los par�metros embebidos en una forma apropiada para el motor de b�squeda seleccionado, y redirige al usuario a esa direcci�n. Si el usuario falla al elegir el motor de b�squeda o env�a un nombre de motor de b�squeda no conocido, se devuelve una p�gina de error 404 diciendo que no hay motor de b�squeda o que no se conoce.
�SearchEngines.java
Puedes descargar el
c�digo fuente.
Nota: hace uso de la clase SearchSpec, mostrada abajo, que incorpora informaci�n sobre como construir URLs para realizar b�squedas en varios buscadores.
package hall;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.net.*;
public class SearchEngines extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// The URLEncoder changes spaces to "+" signs and other
// non-alphanumeric characters to "%XY", where XY is the
// hex value of the ASCII (or ISO Latin-1) character.
// The getParameter method decodes automatically, but since
// we're just passing this on to another server, we need to
// re-encode it.
String searchString =
URLEncoder.encode(request.getParameter("searchString"));
String numResults =
request.getParameter("numResults");
String searchEngine =
request.getParameter("searchEngine");
SearchSpec[] commonSpecs = SearchSpec.getCommonSpecs();
for(int i=0; i<commonSpecs.length; i++) {
SearchSpec searchSpec = commonSpecs[i];
if (searchSpec.getName().equals(searchEngine)) {
// encodeURL is just planning ahead in case this servlet
// is ever used in an application that does session tracking.
// If cookies are turned off, session tracking is usually
// accomplished by URL rewriting, so all URLs returned
// by servlets should be sent through encodeURL.
String url =
response.encodeURL(searchSpec.makeURL(searchString,
numResults));
response.sendRedirect(url);
return;
}
}
response.sendError(response.SC_NOT_FOUND,
"No recognized search engine specified.");
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
�SearchSpec.java
package hall;
class SearchSpec {
private String name, baseURL, numResultsSuffix;
private static SearchSpec[] commonSpecs =
{ new SearchSpec("google",
"http://www.google.com/search?q=",
"&num="),
new SearchSpec("infoseek",
"http://infoseek.go.com/Titles?qt=",
"&nh="),
new SearchSpec("lycos",
"http://lycospro.lycos.com/cgi-bin/pursuit?query=",
"&maxhits="),
new SearchSpec("hotbot",
"http://www.hotbot.com/?MT=",
"&DC=")
};
public SearchSpec(String name,
String baseURL,
String numResultsSuffix) {
this.name = name;
this.baseURL = baseURL;
this.numResultsSuffix = numResultsSuffix;
}
public String makeURL(String searchString, String numResults) {
return(baseURL + searchString + numResultsSuffix + numResults);
}
public String getName() {
return(name);
}
public static SearchSpec[] getCommonSpecs() {
return(commonSpecs);
}
}
�SearchSpec.java
Pulsa con el bot�n derecho sobre el enlace al
c�digo fuente para descargar el fichero fuente.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Searching the Web</TITLE>
</HEAD>
<BODY BGCOLOR="#FDF5E6">
<H1 ALIGN="CENTER">Searching the Web</H1>
<FORM ACTION="/servlet/hall.SearchEngines">
<CENTER>
Search String:
<INPUT TYPE="TEXT" NAME="searchString"><BR>
Results to Show Per Page:
<INPUT TYPE="TEXT" NAME="numResults"
VALUE=10 SIZE=3><BR>
<INPUT TYPE="RADIO" NAME="searchEngine"
VALUE="google">
Google |
<INPUT TYPE="RADIO" NAME="searchEngine"
VALUE="infoseek">
Infoseek |
<INPUT TYPE="RADIO" NAME="searchEngine"
VALUE="lycos">
Lycos |
<INPUT TYPE="RADIO" NAME="searchEngine"
VALUE="hotbot">
HotBot
<BR>
<INPUT TYPE="SUBMIT" VALUE="Search">
</CENTER>
</FORM>
</BODY>
</HTML>
�Pantalla inicial

�Resultados de la Busqueda
