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或数据5. ViewResolver解析视图- 若返回逻辑视图名,DispatcherServlet遍历ViewResolver(如InternalResourceViewResolver、ThymeleafViewResolver),根据配置的前缀/后缀解析出具体视图对象。
- 示例:逻辑视图名"userList"可能被解析为/WEB-INF/views/userList.jsp。
6. 视图渲染与响应生成7. 核心组件的协同作用- DispatcherServlet:协调全局,统一入口,支持集中处理安全、日志等横切关注点。
- HandlerMapping:动态匹配URL与方法,支持灵活的路由配置。
- HandlerAdapter:屏蔽方法签名差异,简化调用逻辑。
- ViewResolver:解耦视图技术与业务逻辑,支持多视图技术无缝切换(如JSP换为Thymeleaf仅需更换ViewResolver)。
8. 设计优势与灵活性- 解耦与可扩展性:各组件职责单一,可独立替换或定制(如更换ViewResolver或HandlerMapping)。
- 开发效率:开发者聚焦业务逻辑,无需处理底层细节(如参数绑定、视图解析)。
- RESTful支持:通过@ResponseBody和HttpMessageConverter高效构建API。
总结:Spring MVC通过DispatcherServlet为核心的管道式操作,将请求处理分解为多个独立阶段,各组件协同完成从路由匹配到响应生成的全流程。这种设计确保了框架的高灵活性、可维护性及开发效率。