Spring MVC 的处理请求流程是怎样的?

兄弟打扰一下,Spring MVC 的处理请求流程是怎样的?
最新回答
豆芽没营养

2026-10-28 00:17:42

Spring MVC处理请求的核心流程为:DispatcherServlet统一接收请求,通过HandlerMapping查找映射、HandlerAdapter执行处理器、ViewResolver解析视图,最终生成响应返回客户端。 以下是详细步骤:

1. 请求接收与DispatcherServlet的启动
  • 当HTTP请求抵达Web服务器(如Tomcat)时,配置好的DispatcherServlet(前端控制器)拦截请求,成为处理流程的起点。
  • DispatcherServlet作为核心协调者,不直接处理业务逻辑,而是通过委派机制将任务分发给其他组件,确保职责分离与解耦。
2. HandlerMapping查找处理器
  • DispatcherServlet遍历所有注册的HandlerMapping实例(如RequestMappingHandlerMapping),根据请求的URL、HTTP方法、参数类型等信息,从映射表中匹配对应的Controller方法。
  • 匹配结果封装为HandlerExecutionChain,包含目标方法及预处理/后处理的拦截器(Interceptor)。
  • 示例:若请求URL为/user/list,HandlerMapping会找到标注@RequestMapping("/user/list")的Controller方法。
3. HandlerAdapter执行处理器
  • DispatcherServlet将HandlerExecutionChain交给HandlerAdapter(如RequestMappingHandlerAdapter),由其统一调用Controller方法。
  • HandlerAdapter处理参数绑定(如URL变量、请求参数、JSON请求体)和返回值转换(如String转为视图名、POJO转为JSON)。
  • 优势:Controller方法签名灵活(可接受HttpServletRequest、绑定Model对象等),无需关心底层Servlet API,提升开发效率。
4. 返回ModelAndView或数据
  • Controller方法执行后,通常返回:

    ModelAndView:包含逻辑视图名(如"userList")和模型数据(如用户列表)。

    String/POJO:String可能表示视图名,POJO(标注@ResponseBody)会通过HttpMessageConverter转为JSON/XML,直接写入响应体(用于RESTful API)。

5. ViewResolver解析视图
  • 若返回逻辑视图名,DispatcherServlet遍历ViewResolver(如InternalResourceViewResolver、ThymeleafViewResolver),根据配置的前缀/后缀解析出具体视图对象。
  • 示例:逻辑视图名"userList"可能被解析为/WEB-INF/views/userList.jsp。
6. 视图渲染与响应生成
  • DispatcherServlet调用View对象的render()方法,传入模型数据,生成最终内容(如HTML、JSON)。
  • 渲染方式:

    模板引擎:JSP/Thymeleaf/Freemarker结合模型数据生成HTML。

    直接响应:POJO经HttpMessageConverter转为JSON/XML,写入响应体。

  • 最终内容通过HttpServletResponse返回客户端浏览器。
7. 核心组件的协同作用
  • DispatcherServlet:协调全局,统一入口,支持集中处理安全、日志等横切关注点。
  • HandlerMapping:动态匹配URL与方法,支持灵活的路由配置。
  • HandlerAdapter:屏蔽方法签名差异,简化调用逻辑。
  • ViewResolver:解耦视图技术与业务逻辑,支持多视图技术无缝切换(如JSP换为Thymeleaf仅需更换ViewResolver)。
8. 设计优势与灵活性
  • 解耦与可扩展性:各组件职责单一,可独立替换或定制(如更换ViewResolver或HandlerMapping)。
  • 开发效率:开发者聚焦业务逻辑,无需处理底层细节(如参数绑定、视图解析)。
  • RESTful支持:通过@ResponseBody和HttpMessageConverter高效构建API。

总结:Spring MVC通过DispatcherServlet为核心的管道式操作,将请求处理分解为多个独立阶段,各组件协同完成从路由匹配到响应生成的全流程。这种设计确保了框架的高灵活性、可维护性及开发效率。