为什么同时重写了service和doGet和doPost方法服务器只会执行service方法

为什么同时重写了service和doGet和doPost方法服务器只会执行service方法
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();
        long lastModified;
        if (method.equals("GET")) {
            lastModified = this.getLastModified(req);
            if (lastModified == -1L) {
                this.doGet(req, resp);
            } else {
                long ifModifiedSince;
                try {
                    ifModifiedSince = req.getDateHeader("If-Modified-Since");
                } catch (IllegalArgumentException var9) {
                    ifModifiedSince = -1L;
                }

                if (ifModifiedSince < lastModified / 1000L * 1000L) {
                    this.maybeSetLastModified(resp, lastModified);
                    this.doGet(req, resp);
                } else {
                    resp.setStatus(304);
                }
            }
        } else if (method.equals("HEAD")) {
            lastModified = this.getLastModified(req);
            this.maybeSetLastModified(resp, lastModified);
            this.doHead(req, resp);
        } else if (method.equals("POST")) {
            this.doPost(req, resp);
        } else if (method.equals("PUT")) {
            this.doPut(req, resp);
        } else if (method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if (method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if (method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[]{method};
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(501, errMsg);
        }

    }

这是HttpServlet中的service方法的源码,不难发现该方法对接收到的请求进行解析后调用相应的方法进行处理,其中就包括了doGet,和doPost方法。在来回忆一下Servlet的生命周期,在被第一次请求时实例化调用init方法初始化,之后每次接收到请求都会调用service方法,最后在关闭服务器时销毁。大家注意到了吗?是调用service方法。当我们没有重写service方法时,每一次接受到请求就会调用上面的service方法对请求进行解析来选取相应的方法来处理请求。当我们同时重写了service,doGet,doPost方法如果在service方法中不调用doGet,doPost方法,那么就只会调用service方法相应请求。

你可能感兴趣的:(为什么同时重写了service和doGet和doPost方法服务器只会执行service方法)