service()和doGet()和doPost()

来源:互联网 发布:java检测内存泄露 编辑:程序博客网 时间:2024/04/29 17:53
从前看李刚的书,书中许多都是直接用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方法。

0 0
原创粉丝点击