我正在学习Spring MVC,我已经看过有关FrameworkServlet的代码。 FrameworkServlet扩展HttpServletBeanHttpServletBean扩展HttpServletFrameworkServlet覆盖service()中的HttpServlet方法。令我感到困惑的是为什么processRequest()方法没有直接在service()方法中调用。因为我看到例如doPost(),所以doGet()是使用processRequest()

我感谢任何答案。

   /**
     * Override the parent class implementation in order to intercept PATCH requests.
     */
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        HttpMethod httpMethod =
                HttpMethod.resolve(request.getMethod());
        if (HttpMethod.PATCH == httpMethod || httpMethod == null) {
            processRequest(request, response);
        }
        else {
            super.service(request, response);
        }
    }


为什么不

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            processRequest(request, response);

    }


如果不使用HttpServlet的委托来处理请求,而仅使用processRequest()中的FrameworkSevlet,会发生什么不好的事情?

最佳答案

因为HttpServlet是用HTTP 1.1实现的,而HTTP 1.1不支持HTTP PATCH,所以Spring通过简单地扩展PATCH来实现处理FrameworkServlet中的HttpServlet请求的逻辑。

对于非PATCH请求,只需委托给HttpServlet即可处理。对于PATCH请求,由FrameworkServlet本身处理。因此,在FrameworkServlet中用于检查请求是否为PATCH的if-then-else块是必需的。

10-01 09:05