在 Spring MVC 中,处理一次 HTTP 请求的过程涉及多个关键组件,它们按特定顺序依次执行。每个组件都有其特定的职责,包括拦截、路由、请求处理、视图解析等。以下是处理一次 HTTP 请求的流程,涉及的主要组件包括 DispatcherServlet、HandlerMapping、HandlerAdapter、Interceptor、ViewResolver 等。
1. 请求到达 DispatcherServlet
- 当一个 HTTP 请求到达 Spring Boot 应用时,首先会由 DispatcherServlet 处理。
- DispatcherServlet 是整个 Spring MVC 请求处理流程的前端控制器,负责将请求转发到正确的处理器(即控制器)并返回响应。
2. 拦截器(Interceptor)
- 在 DispatcherServlet 处理请求之前,会经过 拦截器(Interceptor)链。
- 拦截器 可以在请求进入控制器之前进行处理,或者在请求响应之后做处理。
- 你可以在拦截器中执行日志记录、权限校验等操作。拦截器与过滤器(Filter)不同,拦截器是基于 Spring 的,而过滤器是基于 Servlet 的。
- 拦截器执行顺序:
preHandle
(请求到达控制器前) →postHandle
(控制器处理后,视图渲染前) →afterCompletion
(请求完成后,视图渲染后)。
示例代码:
java@Component public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { // 在控制器方法执行前 return true; // 返回true表示请求继续往下执行,false表示请求终止 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { // 在控制器方法执行后,视图渲染前 } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { // 在请求完成后执行,通常用于清理资源 } }
3. 处理器映射器(HandlerMapping)
- HandlerMapping 是负责根据请求的 URL 查找合适的处理器(通常是控制器方法)并将请求分发给相应的处理器。
- Spring MVC 提供了多种 HandlerMapping,例如
RequestMappingHandlerMapping
,它用于根据请求的 URL、请求方法(如 GET 或 POST)等规则查找对应的处理器方法。
4. 处理器适配器(HandlerAdapter)
- HandlerAdapter 是用来适配具体的处理器(控制器方法)与 Spring MVC 中的请求处理机制的。
- 它的作用是执行具体的控制器方法,并返回执行结果。Spring MVC 中的 RequestMappingHandlerAdapter 主要用于支持基于注解的控制器方法。
5. 控制器(Controller)
- 控制器是处理请求的核心组件。在控制器中定义了 URL 请求的处理方法。
- 控制器的方法会被 HandlerAdapter 调用来执行业务逻辑。
示例代码:
java@RestController public class MyController { @GetMapping("/hello") public String hello() { return "Hello, World!"; } }
6. 视图解析器(ViewResolver)
- 控制器方法返回的是模型数据(通常是一个对象),而视图解析器则负责根据返回值确定显示页面的视图。
- 如果返回的是一个字符串,视图解析器会根据该字符串查找对应的视图页面(如 JSP、Thymeleaf 模板等)。
- 视图解析器也负责将模型数据与视图进行绑定。
示例配置:
java@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureViewResolvers(ViewResolverRegistry registry) { registry.jsp("/WEB-INF/views/", ".jsp"); } }
7. 视图渲染(View Rendering)
- 视图解析器根据控制器返回的视图名,选择合适的视图进行渲染。
- 例如,如果使用 JSP,视图渲染过程就是将返回的 JSP 页面与模型数据绑定,并生成最终的 HTML 页面响应。
- 最终,HTTP 响应会返回给客户端。
8. 返回响应
- 最终,响应会被 DispatcherServlet 返回到客户端。
- 如果是 RESTful API,返回的是 JSON 或其他数据格式;如果是 Web 应用,返回的是 HTML 页面。