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