我正在学习Spring MVC,我已经看过有关FrameworkServlet
的代码。 FrameworkServlet
扩展HttpServletBean
。 HttpServletBean
扩展HttpServlet
。 FrameworkServlet
覆盖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块是必需的。