Servlet 的 service() 方法

在 Servlet 中默认情况下,无论你是使用 Get 还是 Post 方式提交过来的 Http 请求都会经过 Servlet 的 service() 方法来处理,然后转向到 doGet() 或是 doPost() 方法。
这里是 HttpServlet 类的 service() 方法:

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{  
    String method = req.getMethod();  
    if(method.equals("GET")){
        long lastModified = getLastModified(req);  
        if(lastModified == -1L){  
            doGet(req, resp);  
        }else{  
            long ifModifiedSince = req.getDateHeader("If-Modified-Since");  
            if(ifModifiedSince < (lastModified / 1000L) * 1000L){
                maybeSetLastModified(resp, lastModified);  
                    doGet(req, resp);  
            }else{  
                resp.setStatus(304);  
            }  
        }  
    } else if(method.equals("HEAD")){
        long lastModified = getLastModified(req);  
        maybeSetLastModified(resp, lastModified);  
        doHead(req, resp);  
    } else if(method.equals("POST"))  
        doPost(req, resp);  
    else  if(method.equals("PUT"))  
        doPut(req, resp);  
    else  if(method.equals("DELETE"))  
        doDelete(req, resp);  
    else  if(method.equals("OPTIONS"))  
        doOptions(req, resp);  
    else  if(method.equals("TRACE")){  
        doTrace(req, resp);  
    }else{  
        String errMsg = lStrings.getString("http.method_not_implemented");  
        Object errArgs[] = new Object[1];  
        errArgs[0] = method;  
        errMsg = MessageFormat.format(errMsg, errArgs);  
        resp.sendError(501, errMsg);  
    }  
}

从上面可以看出,这里的 Service() 是用来转向的,但是如果你在自己的 servlet 类中覆盖了 service() 方法,比如说你写的 service() 是这样的:

public void service(ServletRequest req, ServletResponse res)
                throws ServletException, IOException {
    res.getOutputStream().print("x");
}

那么这时 service() 就不会用来转向的,而是用来处理你写的业务,现在不论客户端是用 Post 还是 Get 来请求此 servlet 都会执行 service() 方法也只能执行servlet方法,不会去执行 doPost 或是 doGet 方法。
很多时候我们只需要重写doGet()和doPost()方法就好。