| 
| 技术资料  > PHP技术 > 入门教程 : 访问标准CGI变量 |  
访问标准CGI变量 March 25,2004 |  
来源:LoveJSP.site 
1. CGI变量简介 
如果你在以前使用过传统的CGI,你应该对“CGI变量”的概念很熟悉。 由这些变量可以取得一些和请求(Request)有关的信息。其中一些来自于 HTTP 请求命令行(request line) 和headers (例如:在URI中问号后面的部分或者Content-Length header),一些来自于 Socket本身(例如:被请求主机的IP和名称),还有一些来自于服务器的配置信息(例如:被映射为URL目录的实际 路径)。  
 
2. Servlet和标准CGI变量之间的对应关系 
下面的表格中给出了Servlet和标准CGI变量之间的对应关系,对以前使用CGI变量进行编程的朋友会有很大的帮助。 在下表中我们假设request是HttpServletRequest类型的对象。  
CGI变量  含义  在 doGet 或 doPost 访问的办法   
AUTH_TYPE  如果在请求中有 Authorization header ,则这个变量将会被赋值 (basic 或 digest)  request.getAuthType()   
CONTENT_LENGTH  只有当请求的方法是 POST 时这个变量才会有意义,它表示传送的数据的字节数。  String.valueOf(request.getContentLength()) (返回String) 或者 request.getContentLength(),返回一个整数(int)。   
CONTENT_TYPE  如果被赋值,就表示数据的MIME类型。  request.getContentType()   
DOCUMENT_ROOT  和网站根目录对应的实际路径  getServletContext().getRealPath("/") 注意:在以前的Servlet标准中,这条语句是这样写的request.getRealPath("/") 。   
HTTP_XXX_YYY  访问任意的HTTP headers  request.getHeader("Xxx-Yyy")   
PATH_INFO  URL 指向的路径的信息。由于Servlet可以和服务器直接通讯,所以这个变量对Servlet没什么作用。  request.getPathInfo()   
PATH_TRANSLATED  在Server上被映射为web目录的目录的真实路径的信息。和上一个变量一样,对Servlet用处不大。  request.getPathTranslated()   
QUERY_STRING  如果用 GET 方法发出请求(requests),这个变量中将会存放请求的数据,其 形式为经过URL编码的一个大字符串。在servlet中,你很少会用到这个原始的字符串。而是 用 request.getParameter 方法来访问某个特定的请求数据。  request.getQueryString()   
REMOTE_ADDR  客户端的IP地址,是String类型的。其形式类似于 "192.9.48.9"。  request.getRemoteAddr()   
REMOTE_HOST  发出请求的客户端的域名(例如. "java.sun.com") 如果不能检测到域名,就用客户端的IP地址代替。  request.getRemoteHost()   
REMOTE_USER  如果 Authorization header 被赋值,则这个变量中放有用户名。  request.getRemoteUser()   
REQUEST_METHOD  请求的类型。通常为 GET 或 POST,但也可能是 HEAD, PUT, DELETE, OPTIONS, 或者 TRACE。  request.getMethod()   
SCRIPT_NAME  srvlet的路径  request.getServletPath()   
SERVER_NAME  服务器的名称  request.getServerName()   
SERVER_PORT  服务器的端口  String.valueOf(request.getServerPort())(返回String类型) request.getServerPort()(返回int类型)   
SERVER_PROTOCOL  在请求命令行中用的协议的版本号。(例如. HTTP/1.0 或 HTTP/1.1)。  request.getProtocol()   
SERVER_SOFTWARE  所用 Web Server 软件的名称  getServletContext().getServerInfo()   
 
 
3. 例子:读取CGI变量。 
下面是一个显示除去 HTTP_XXX_YYY 外所有CGI变量的的servlet。他显示了在上面的表格中列出的所有CGI变量的值。  
3.1 ShowCGIVariables.java 
Download Here 
 
//! ####### Start ShowCGIVariables.java   
import java.io.*; 
import javax.servlet.*; 
import javax.servlet.http.*; 
import java.util.*; 
 
 
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: 显示CGI变量"; 
    out.println("<HTML><HEAD><TITLE>"+title +"</TITLE></HEAD>"+ 
                "<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[0]; 
      String varValue = variables[1]; 
      if (varValue == null) 
        varValue = "<I>没有被赋值</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); 
  } 
} 
 
//! ####### End ShowCGIVariables.java   
 
         |  
 
 |