You are on page 1of 6

http://www.apl.jhu.

edu/~hall/java/Servlet-Tutorial/
1. Introduction to CGI Variables
If you come to Java servlets from traditional CGI, you are probably used to the idea of "CGI
Variables". These are a somewhat eclectic collection of information about the request. Some are
derived from the HTTP request line and headers (e.g. the part of the URI that came after the
question mark and typically contains the form data, or the Content-Length header), some
are derived from the socket itself (e.g. the name and IP address of the requesting host), and some
are derived from server installation parameters (e.g. the mapping of URLs to actual paths).

2. Servlet Equivalent of Standard CGI Variables


Although it probably makes more sense to think of different sources of data (request data, server
data, etc.) as distinct, experienced CGI programmers may find the following table useful.
Assume that request is the HttpServletRequest supplied to the doGet and doPost
methods.
CGI Variable Meaning Accessing it from doGet or doPost
If an
Authorization
AUTH_TYPE header was supplied, this request.getAuthType()
is the scheme specified
(basic or digest)
Technically, the equivalent is
For POST requests only, String.valueOf(request.getContentL
CONTENT_LENG
TH the number of bytes of ength()) (a String) but you'll probably want to
data sent. just call request.getContentLength(),
which returns an int.

CONTENT_TYPE MIME type of attached request.getContentType()


data, if specified.
getServletContext().getRealPath("/
DOCUMENT_ROO Path to directory ") Note that this was
corresponding to
T request.getRealPath("/") in older servlet
http://host/
specifications.
HTTP_XXX_YYY Access to arbitrary request.getHeader("Xxx-Yyy")
HTTP headers
Path information
attached to the URL.
Since servlets, unlike
standard CGI programs,
PATH_INFO can talk to the server, request.getPathInfo()
they don't need to treat
this separately. Path info
could be sent as part of
the regular form data.
PATH_TRANSLA The path information request.getPathTranslated()
TED mapped to a real path on
the server. Again, with
servlets there is no need
to have a special case for
this.
For GET requests, this is
the attached data as one
big string, with values
still URL-encoded. You
QUERY_STRING rarely want the raw data request.getQueryString()
in servlets; instead use
request.getParam
eter to access
individual parameters.
The IP address of the
client that made the
REMOTE_ADDR request.getRemoteAddr()
request, as a String. E.g.
"192.9.48.9".
The fully qualified
domain name (e.g.
"java.sun.com") of
REMOTE_HOST the client that made the request.getRemoteHost()
request. The IP address
is returned if this cannot
be determined.
If an
Authorization
REMOTE_USER request.getRemoteUser()
header was supplied, the
user part.
The request type, which
is usually GET or POST,
REQUEST_METH
but is occasionally request.getMethod()
OD
HEAD, PUT, DELETE,
OPTIONS, or TRACE.
SCRIPT_NAME Path to servlet. request.getServletPath()
SERVER_NAME Web server's name request.getServerName()
Technically, the equivalent is
String.valueOf(request.getServerPo
SERVER_PORT Port server is listening rt()), which returns a String. You'll usually
on.
just want request.getServerPort(), which
returns an int.
Name and version used
SERVER_PROTO in the request line (e.g.
request.getProtocol()
COL HTTP/1.0 or
HTTP/1.1).
SERVER_SOFTW Identifying information getServletContext().getServerInfo(
ARE about the Web server )
3. Example: Reading the CGI Variables
Here's a servlet that creates a table showing the values of all the CGI variables other than
HTTP_XXX_YYY, which are just the HTTP request headers shown in the previous section.

3.1 ShowCGIVariables.java

You can also download the source or try it on-line. Note: also uses ServletUtilities.java, shown
earlier.
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 ShowCGIVariables Output