5.2.2 获得HTTP请求行信息的各个方法的演示

优质
小牛编辑
129浏览
2023-12-01

在本节给出一个实例来演示获得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所示。

07

图5.7 输出HTTP请求行信息

5. 程序总结

如果有多个重名的请求参数,如本例中的name,需要使用getParameterValues方法获得同名参数的多个不同的值。使用getParameter方法只能获得同名请求参数的第一个值。

还要提一下的就是getPathInfo、getServletPath和getPathTranslated方法。如果<url-pattern>元素的值使用通配符,那么getPathInfo方法获得的值就是那个通配符所匹配的值(包括“/”),在本例中是“/RequestInfo.jsp”,而getServletPath方法获得的值就是通配符前面的路径,在本例中是“/request/line/info”。getPathTranslated方法获得了getPathInfo方法返回的Web资源在服务器的本地目录。