4.3.2 doXxx方法

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

在Servlet类中除了可以使用service方法来处理HTTP请求外,也可以使用doXxx方法来处理某一个指定的HTTP方法的请求,如doGet方法可以处理HTTP GET请求,doPost方法可以处理HTTP POST请求。这些doXxx方法都是在HttpServlet类中定义的,在HttpServlet类中定义的doXxx方法如下:

l doGet:用于处理HTTP GET请求。

2  doPost:用于处理HTTP POST请求。

3  doHead:用于处理HTTP HEAD请求。

4  doPut:用于处理HTTP PUT请求。

5  doDelete:用于处理HTTP DELETE请求。

6  doTrace:用于处理HTTP TRACE请求。

7  doOptions:用于处理HTTP OPTIONS请求。

doXxx方法的使用方法和service方法完全一样,所不同的是service方法可以处理所有的HTTP请求,而doXxx方法只能处理特定的HTTP请求。对于只需要处理某些HTTP方法的请求的Servlet类,可以使用相应的doXxx方法,代码如下:

//  处理HTTP POST请求

public void doPost(HttpServletRequest request, HttpServletResponse response)
     throws ServletException, IOException
{
    response.getWriter().println("test");
    ... ...
}

在一般情况下,Servlet只需要处理HTTP GET和HTTP POST请求,因此,只需要覆盖doGet和doPost方法即可。

实际上,doXxx方法是由HttpServlet类的service方法的第二种重载形式调用的,调用的代码如下:

protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String method = request.getMethod();       //  获得HTTP方法名
if (method.equals(METHOD_GET))
   {
        doGet(request, response);
    }
else if (method.equals(METHOD_POST))
{
        doPost(request, response);
}
else if (method.equals(METHOD_HEAD))
{
        doHead(request, response);
}
else if (method.equals(METHOD_PUT))
{
        doPut(request, response);   
}
else if (method.equals(METHOD_DELETE))
{
        doDelete(request, response);
}
else if (method.equals(METHOD_OPTIONS))
{
        doOptions(request,response);
}
else if (method.equals(METHOD_TRACE))
{
        doTrace(request,response);
}
else
{
    //  抛出不支持该HTTP方法的异常
}
}

上面的代码演示了在service方法中如何调用doXxx方法。要注意的是,上面的代码只演示了service方法调用doXxx方法的部分,而实际的调用过程更为复杂,但因其他内容和本节所介绍的内容无关,因此,在这里将其忽略了。

由service方法的实现可以看出,在Servlet类中如果覆盖了service方法,doXxx方法就不会被调用了,除非在覆盖的service方法中使用super.service()语句来调用父类的service方法。但在一般情况下,如果在Servlet类中覆盖了doXxx方法,就不需要再覆盖service方法了。

如果在Servlet类中未覆盖service方法,而覆盖的doXxx方法并没有和当前HTTP请求方法相对应的doXxx方法,这时会抛出不支持该HTTP请求方法的异常,输出的异常信息与图4.3所示的异常信息类似。