service()和doGet()和doPost()

从前看李刚的书,书中许多都是直接用service()的。但其实这样是不好的。因为虽然一般情况下我们的doGet和doPost方法是一样的,但其实http能提交的方法有许多,不一定只有这两个,可以看tomcat中实现的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);
    }
}
可以看到这里通过反射机制识别的提交方式有许多,还有put、head很多方法。如果你重写了service方法,那么就不会调用其他的doGet和doPost以及PUT方法。这里的service是种代理模式,我们最好还是只写doGet和doPost方法。


posted @ 2014-07-18 16:12  leejuen  阅读(306)  评论(0编辑  收藏  举报