5.2.2 获得HTTP请求行信息的各个方法的演示
在本节给出一个实例来演示获得HTTP请求行信息的各个方法的功能,读者从这个例子中可以更清楚地了解这些方法的作用。
例子 : 获得HTTP请求行信息的各个方法的演示
1. 实例说明
本程序将使用在5.1.2节介绍的方法来输出HTTP请求行的信息。为了演示URL中额外的路径部分,在配置本例中的Servlet时使用了“*”通配符。所有和“*”匹配的部分都会被系统认为是URL中额外的路径部分。
2. 编写RequestLineInfo类
RequestLineInfo类负责向客户端输出HTTP请求行的各种信息,该类的实现代码如下:
package chapter5;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class RequestLineInfo extends HttpServlet
{
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<b>获得请求行信息</b><br/>");
out.println("getMethod:" + request.getMethod() + "<br/>");
out.println("getRequestURI:" + request.getRequestURI() + "<br/>");
out.println("getQueryString:" + request.getQueryString() + "<br/>");=
out.println("-----------请求参数列表----------</br>");
java.util.Enumeration params = request.getParameterNames();
while(params.hasMoreElements())
{
String param = params.nextElement().toString();
out.println(param + "=" + request.getParameter(param) + "<br/>");
}
out.println("-------------------------------<br/>");
// 获得name请注参数的值(有多个同名的name请求参数)
String[] values = request.getParameterValues("name");
if(values != null)
{
out.println("--------name参数的两个值---------<br/>");
// 输出name请求参数的所有值
for(String value: values)
out.println(value + "<br/>");
}
out.println("-------------------------------</br>");
out.println("getProtocol:" + request.getProtocol() + "<br/>");
out.println("getContextPath:" + request.getContextPath() + "<br/>");
out.println("getPathInfo:" + request.getPathInfo() + "<br/>");
out.println("getPathTranslated:" + request.getPathTranslated() + "<br/>");
out.println("getServletPath:" + request.getServletPath() + "<br/>");
}
}
3. 配置RequestLineInfo类
RequestLineInfo类的配置代码如下:
<servlet>
<servlet-name>RequestLineInfo</servlet-name>
<servlet-class>chapter5.RequestLineInfo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RequestLineInfo</servlet-name>
<!-- 使用通配符配置Servlet映射URL -->
<url-pattern>/request/line/info/*</url-pattern>
</servlet-mapping>
从上面的配置代码可以看出,配置RequestLineInfo类的映射URL时使用了“/request/line/info/*”,访问路径中所有匹配“*”的部分都会被认为是URL的额外路径部分。例如,对于如下的URL:
http://localhost:8080/demo/request/line/info/RequestInfo.jsp?name=bill
其中“RequestInfo.jsp”匹配“*”,而路径的额外部分要包括“/”,因此,上面URL的路径额外部分就是“/RequestInfo.jsp”。
4. 查看输出的HTTP请求行信息
在浏览器地址栏中输入如下的URL:
http://localhost:8080/demo/request/line/info/RequestInfo.jsp?name=bill&name=mike&age=22
浏览器中显示的结果如图5.7所示。
图5.7 输出HTTP请求行信息
5. 程序总结
如果有多个重名的请求参数,如本例中的name,需要使用getParameterValues方法获得同名参数的多个不同的值。使用getParameter方法只能获得同名请求参数的第一个值。
还要提一下的就是getPathInfo、getServletPath和getPathTranslated方法。如果<url-pattern>元素的值使用通配符,那么getPathInfo方法获得的值就是那个通配符所匹配的值(包括“/”),在本例中是“/RequestInfo.jsp”,而getServletPath方法获得的值就是通配符前面的路径,在本例中是“/request/line/info”。getPathTranslated方法获得了getPathInfo方法返回的Web资源在服务器的本地目录。