4.3.2 doXxx方法
在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所示的异常信息类似。