Spring MVC 是一个基于 MVC 设计模式的框架,其核心组件协同工作以处理 HTTP 请求并生成响应。以下是各组件的详细说明及其协作流程:
一、核心组件
-
DispatcherServlet(前端控制器)
- 作用:接收所有请求并协调其他组件处理。
- 流程:作为中央调度器,将请求分发给合适的处理器,并管理视图渲染和异常处理。
-
HandlerMapping(处理器映射器)
- 作用:根据请求的 URL 和配置,确定处理请求的 Controller 及其方法。
- 示例:
@RequestMapping
注解将 URL 映射到具体方法。
-
HandlerAdapter(处理器适配器)
- 作用:调用具体的处理器方法,处理参数绑定、数据转换和返回值处理。
- 示例:适配
@Controller
注解的类或Controller
接口的实现。
-
ViewResolver(视图解析器)
- 作用:将逻辑视图名(如
"home"
)解析为物理视图(如 JSP、Thymeleaf 模板)。 - 配置示例:添加前缀
/WEB-INF/views/
和后缀.jsp
。
- 作用:将逻辑视图名(如
-
ModelAndView
- 作用:封装模型数据(业务结果)和视图信息(渲染目标)。
- 使用:Controller 方法返回该对象,传递数据到视图层。
-
HandlerExceptionResolver(异常解析器)
- 作用:统一处理请求处理过程中的异常,返回自定义错误视图或状态码。
- 工具:结合
@ControllerAdvice
实现全局异常处理。
-
MultipartResolver(文件上传解析器)
- 作用:解析
multipart/form-data
请求,处理文件上传。 - 示例:
CommonsMultipartResolver
处理文件流。
- 作用:解析
-
LocaleResolver & ThemeResolver(区域与主题解析器)
- 作用:支持国际化(i18n)和主题切换,根据请求确定用户区域或主题。
-
参数解析器与消息转换器
- Parameter Resolvers:处理
@RequestParam
、@PathVariable
等参数绑定。 - HttpMessageConverter:转换请求/响应体数据(如 JSON ↔ Java 对象),支持
@RequestBody
和@ResponseBody
。
- Parameter Resolvers:处理
二、请求处理流程
-
请求接收
-
DispatcherServlet 接收 HTTP 请求。
-
-
处理器匹配
-
HandlerMapping 根据 URL 找到对应的 Controller 方法。
-
-
方法执行
-
HandlerAdapter 调用目标方法,处理参数绑定(如解析路径变量、请求体等),执行业务逻辑。
-
-
返回处理结果
-
方法返回
ModelAndView
或通过@ResponseBody
返回数据。若返回视图名,由 ViewResolver 解析为具体视图。
-
-
视图渲染
-
视图技术(如 JSP、Thymeleaf)使用模型数据渲染页面,生成响应内容。
-
-
异常处理
-
若过程中抛出异常,HandlerExceptionResolver 捕获并处理,返回错误页面或 JSON 错误信息。
-
-
响应返回
-
DispatcherServlet 将最终响应发送给客户端。
-
三、配置示例
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {// 配置视图解析器@Beanpublic ViewResolver viewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");return resolver;}// 启用JSON转换@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {converters.add(new MappingJackson2HttpMessageConverter());}// 文件上传支持@Beanpublic MultipartResolver multipartResolver() {return new CommonsMultipartResolver();}
}
四、总结
Spring MVC 的组件化设计实现了职责分离,提升了灵活性和扩展性。开发者可通过配置或注解定制各组件(如替换视图技术、增加消息转换器等),适应不同项目需求。理解组件协作流程有助于调试和优化应用,例如自定义异常处理或优化参数绑定逻辑。
(望各位潘安、各位子健/各位彦祖、于晏不吝赐教!多多指正!🙏)