# Servelts y JSP

# Acceder a Variables Estándards CGI

1. Introducción a las Variables CGI
2. Equivalentes Servlet a Variables Estándards CGI
3. Ejemplo: Leer las Variables CGI

## 1. Introducción a las Variables CGI

Si llegamos a los servlets Java desde CGI tradicional, probablemente usaremos la idea de "Variables CGI". Estas son una forma ecléctica de colección de información sobre la petición. Algunas se derivan de la línea de petición HTTP y las cabeceras, otras están derivadas desde el propio socket (como el nombre y la dirección IP del host peticionario), y otras derivadas de los parámetros de instalación del servidor (como el mapeo de URLs a los paths actuales).

## 2. Equivalentes Servlet a la Variables Estándards CGI

Aunque probablemente tiene más sentido pensar en diferentes fuentes de datos (datos de petición, datos de servidor, etc.) como distintas, los programadores experimentados en CGI podrían encontrar muy útil la siguiente tabla. Asumimos que request es el HttpServletRequest suministrado a los métodos doGet y doPost.

Variable CGI | Significado | Acceso desde doGet o doPost
--- | --- | ---
AUTH_TYPE | Si se suministró una cabecera Authorization, este es el esquema especificado (basic o digest) | request.getAuthType()
CONTENT_LENGTH | Sólo para peticiones POST, el número de bytes envíados. | Tecnicamente, el equivalente es String.valueOf(request.getContentLength()) un String) pero probablemente querremos sólo llamar a request.getContentLength(), que devuelve un int.
CONTENT_TYPE | El tipo MIME de los datos adjuntos, si se específica. | request.getContentType()
DOCUMENT_ROOT | Path al directorio que corresponde con http://host/ | getServletContext().getRealPath("/") Observa que era request.getRealPath("/") en especificaciones servlet anteriores.
HTTP_XXX_YYY | Acceso a cabeceras arbitrarias HTTP | request.getHeader("Xxx-Yyy")
PATH_INFO | Información de Path adjunto a la URL. Como los servlets, al contrario que los programas estándards CGI, pueden hablar con el servidor, no necesitan tratar esto de forma separada. La información del path podría ser enviada como parte normal de los datos de formulario. | request.getPathInfo()
PATH_TRANSLATED | La información del path mapeado al path real en el servidor. De nuevo, los servelts no necesitan tener un caso especial para esto. | request.getPathTranslated()
QUERY_STRING | Para peticiones GET, son los datos adjuntos como un gran string, con los valores codificados. Raramente querremos una fila de datos en los servlets; en su lugar, usaremos request.getParameter para acceder a parámetros individuales. | request.getQueryString()
REMOTE_ADDR | La dirección IP del cliente que hizo la petición, por ejemplo "192.9.48.9". | request.getRemoteAddr()
REMOTE_HOST | El nombre de dominio totalmente cualificado (por ejemplo "java.sun.com") del cliente que hizo la petición. Se devuelve la dirección IP si no se puede determinar. | request.getRemoteHost()
REMOTE_USER | Si se suministró una cabecera Authorization, la parte del usuario. | request.getRemoteUser()
REQUEST_METHOD | El tipo de petición, que normalmente es GET o POST, pero ocasionalmente puede ser HEAD, PUT, DELETE, OPTIONS, o TRACE. | request.getMethod()
SCRIPT_NAME | Path del servlet. | request.getServletPath()
SERVER_NAME | Nombre del Servidor Web. | request.getServerName()
SERVER_PORT | Puerto por el que escucha el servidor. | Tecnicamente, el equivalente es String.valueOf(request.getServerPort()), que devuelve un String. Normalmente sólo querremos llamar a request.getServerPort(), que devuelve un int.
SERVER_PROTOCOL | Nombre y versión usada en la línea de petición (por ejemplo HTTP/1.0 o HTTP/1.1). | request.getProtocol()
SERVER_SOFTWARE | Información identificativa del servidor Web. | getServletContext().getServerInfo()

## 3. Ejemplo: Leer las Variables CGI

Aquí tenemos un servelt que crea una tabla que muestra los valores de todas las variables CGI distintas a HTTP_XXX_YYY, que son sólo cabeceras de petición HTTP que se mostraron en la página anterior.

### 3.1 ShowCGIVariables.java

También puedes descargar el código fuente.

>     package hall;

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

>     /** Creates a table showing the values of all the CGI variables.
>      *
>      *  Part of tutorial on servlets and JSP that appears at
>      *  http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/
>      *  1999 Marty Hall; may be freely used or adapted.
>      */

>     public class ShowCGIVariables extends HttpServlet {
>       public void doGet(HttpServletRequest request,
>                         HttpServletResponse response)
>           throws ServletException, IOException {
>         response.setContentType("text/html");
>         PrintWriter out = response.getWriter();
>         String[][] variables =
>           { { "AUTH_TYPE", request.getAuthType() },
>             { "CONTENT_LENGTH", String.valueOf(request.getContentLength()) },
>             { "CONTENT_TYPE", request.getContentType() },
>             { "DOCUMENT_ROOT", getServletContext().getRealPath("/") },
>             { "PATH_INFO", request.getPathInfo() },
>             { "PATH_TRANSLATED", request.getPathTranslated() },
>             { "QUERY_STRING", request.getQueryString() },
>             { "REMOTE_ADDR", request.getRemoteAddr() },
>             { "REMOTE_HOST", request.getRemoteHost() },
>             { "REMOTE_USER", request.getRemoteUser() },
>             { "REQUEST_METHOD", request.getMethod() },
>             { "SCRIPT_NAME", request.getServletPath() },
>             { "SERVER_NAME", request.getServerName() },
>             { "SERVER_PORT", String.valueOf(request.getServerPort()) },
>             { "SERVER_PROTOCOL", request.getProtocol() },
>             { "SERVER_SOFTWARE", getServletContext().getServerInfo() }
>           };
>         String title = "Servlet Example: Showing CGI Variables";
>         out.println(ServletUtilities.headWithTitle(title) +
>                     "<BODY BGCOLOR=\"#FDF5E6\">\n" +
>                     "<H1 ALIGN=CENTER>" + title + "</H1>\n" +
>                     "<TABLE BORDER=1 ALIGN=CENTER>\n" +
>                     "<TR BGCOLOR=\"#FFAD00\">\n" +
>                     "<TH>CGI Variable Name<TH>Value");
>         for(int i=0; i<variables.length; i++) {
>           String varName = variables[i][0];
>           String varValue = variables[i][1];
>           if (varValue == null)
>             varValue = "<I>Not specified</I>";
>           out.println("<TR><TD>" + varName + "<TD>" + varValue);
>         }
>         out.println("</TABLE></BODY></HTML>");
>       }

>       public void doPost(HttpServletRequest request,
>                          HttpServletResponse response)
>           throws ServletException, IOException {
>         doGet(request, response);
>       }
>     }

### 3.2 Salida de ShowCGIVariables

Ozito