12_访问CGI变量

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第12章访问CGI变量
对于在Web服务器上处理数据,最常见的技术是CGI(通用网关接口),CGI是外部网关程序同服务器进行联系的标准。

有CGI编程经验的程序员可能熟悉CGI变量。

本章将详细介绍在servlet中访问CGI变量的方法。

12.1 CGI变量概述
CGI变量汇集了各种有关请求的信息:部分来自HTTP请求命令和请求头,例如Content-Length头;部分来自Socket本身,例如主机的名字和IP地址;也有部分与服务器安装配置有关的信息,例如URL到实际路径的映射。

12.2 标准CGI变量的Servlet等价表示
假定req对象是提供给doGet和doPost方法的HttpServletRequest类型对象,标准CGI变量的Servlet等价表示如表12-1所示。

表12-1 标准CGI变量
CGI变量含义 Servlet中等价的方法
AUTH_TYPE 如果提供了Authorization头,这里指定
了具体的模式(Basic或Digest)
req.getAuthType()
CONTENT_LENGTH 只用于POST请求,表示所发送数据的
字节数
req.getContentLength()
CONTENT_TYPE 表示后面所跟数据的类型req.getContentType()
DOCUMENT_ROOT 与http://host/对应的路径getServletContext().getReal Path("/")
HTTP_XXX_YYY 访问任意HTTP头req.getHeader(“Xxx-Yyy”)
PATH_INFO URL中的附加路径信息,即URL中
Servlet路径之后、查询字符之前的那部

req.getPathInfo()
PATH_TRANSLATE
D
映射到服务器实际路径之后的路径信息req.getPathTranslated()
QUERY_STRING 这是以字符串形式附加到URL后面的查
询字符串,数据仍是URL编码
req.getQueryString()
REMOTE_ADDR 发出请求的客户机的IP地址req.getRemoteAddr()
REMOTE_HOST 发出请求的客户机的完整域名,如。

如果不能确定该域名,则
返回IP地址
req.getRemoteHost()
REMOTE_USER 如果提供了Authorization头,则代表其
用户部分。

它代表发出请求的用户的名

req.getRemoteUser()
JSP&Servlet开发详解• 2 •
续表12-1 标准CGI变量(续表) CGI变量含义 Servlet中等价的方法
REQUEST_METHOD 请求类型,通常是GET或者POST。


有时也会是HEAD、PUT、DELETE、
OPTIONS或TRACE
req.getMethod()
SCRIPT_NAME Servlet的路径req.getServletPath() SERVER_NAME Web服务器名req.getServerName() SERVER_PORT 服务器监听的端口req.getServerPort() SERVER_PROTOCO
L
请求命令中的协议名字和版本req.getProtocol()
SERVER_SOFTWAR E Servlet引擎的名字和版本
getServletContext().getServ
erInfo()
12.3 实例
[例12-1] 在Servlet中读取CGI变量中请求字符串:QUERY_STRING,且利用Servlet特有的方法方便地获取各参数。

源代码如下:
//ShowParameters.java
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ShowParameters extends HttpServlet{
public void service(HttpServletRequest req,HttpServletResponse res)
throws IOException,ServletException{
res.setContentType("text/html;charset=\"gb2312\"");
PrintWriter out=new PrintWriter(res.getOutputStream());
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet 实例:读取参数</title>");
out.println("</head>");
out.println("<body>");
out.println("<strong>读取CGI变量QUERY_STRING的值为:</strong><br>");
//利用Servlet中的getQueryString方法读取CGI变量QUERY_STRING
String QueryString=req.getQueryString();
//编码转换,使中文能正常显示,下同
QueryString=new String(QueryString.getBytes("8859_1"),"GB2312");
out.println(QueryString);
out.println("<hr><br><br>");
out.println("<strong>将各参数从QUERY_STRING中解析出来:</strong>");
//获取所有参数名
JSP&Servlet开发详解• 3 •
Enumeration params=req.getParameterNames();
out.println("<table border=0>");
while(params.hasMoreElements()){
String
paramName=(String)params.nextElement();
//获取参数值
paramValues=req.getParameter(paramName);
String
if(paramValues.length()!=0)
String(paramValues.getBytes("8859_1"),"GB2312");
paramValues=new
else
paramValues="未指定值";
bgcolor=\"#CCCCCC\">");
out.println("<tr><td
String(paramName.getBytes("8859_1"),"GB2312");
paramName=new
out.println(paramName);
out.println("</td><td>");
out.println(paramValues);
out.println("</td></tr>");
}
out.println("</table></body></html>");
out.flush();
out.close();
}
}
这个程序用CGI变量QUERY_STRING在Servlet中的等价方法getQueryString来获取请求字符串。

为了作比较,这个程序还使用了getParameterNames和getParamter 方法来获取请求字符串中的各参数名和参数值,然后以表格形式输出到客户端。

打开浏览器,在地址栏中输入:
http://localhost:8080/ShowParameters?BookID=2&BookName=JSP/Servlet开发详解也可使用表单向此Servlet发送GET请求的方式来运行该Servlet。

ShowParameters执行结果如图12-1所示。

• 4 •
JSP&Servlet开发详解
图12-1 ShowParameters的执行结果
本章小结
通过本章的学习,可以发现标准CGI变量在Servlet中有其对应的等价方法,而且在Servlet中读取标准CGI变量显得更加方便、灵活、有较。

这也表明了Servlet是优于CGI的。

相关文档
最新文档