以下是 Spring MVC 框架 的核心概念、组件关系及流程的详细说明,并附表格总结:
1. 核心理念
Spring MVC 是基于 MVC(Model-View-Controller)设计模式 的 Web 框架,其核心思想是 解耦:
- Model:数据模型,负责业务逻辑和数据处理。
- View:视图层,负责数据展示(如 HTML、JSON)。
- Controller:控制器,负责接收请求、调用 Model、选择 View。
2. 核心组件详解
2.1 DispatcherServlet(前端控制器)
- 作用:
Spring MVC 的核心,处理所有请求的入口点。 - 功能:
- 接收 HTTP 请求。
- 分发请求到合适的 Handler(处理器)。
- 组合 Model 和 View,返回最终响应。
- 配置:
在web.xml
中配置为Servlet
,或通过@SpringBootApplication
自动配置。
2.2 HandlerMapping(处理器映射器)
- 作用:
根据请求 URL 找到对应的 Handler(处理器)。 - 功能:
- 将请求 URL 映射到具体的 Controller 方法。
- 支持多种映射方式(如
@RequestMapping
、@GetMapping
)。
- 示例:
@Controller @RequestMapping("/user") public class UserController {@GetMapping("/list")public String list() { ... } }
2.3 HandlerAdapter(处理器适配器)
- 作用:
调用 Handler(处理器)并获取处理结果(ModelAndView
)。 - 功能:
- 将请求参数绑定到方法参数(如
@RequestParam
、@PathVariable
)。 - 调用 Controller 方法,处理业务逻辑。
- 将返回值(如
String
、ModelAndView
)转换为ModelAndView
对象。
- 将请求参数绑定到方法参数(如
- 适用场景:
适配不同类型的处理器(如@Controller
、@RestController
)。
2.4 ViewResolver(视图解析器)
- 作用:
将逻辑视图名(如"user/list"
)转换为具体的 View 对象。 - 功能:
- 根据配置规则(如前缀、后缀)查找视图资源。
- 支持多种视图技术(如 Thymeleaf、JSP、FreeMarker)。
- 配置示例:
spring.mvc.view.prefix=/WEB-INF/views/ spring.mvc.view.suffix=.jsp
2.5 Model(模型)
- 作用:
存储数据,供视图渲染使用。 - 功能:
- 通过
Model
、ModelAndView
或@ModelAttribute
注入数据。 - 示例:
@Controller public class UserController {@GetMapping("/user/{id}")public String getUser(@PathVariable Long id, Model model) {User user = userService.findById(id);model.addAttribute("user", user); // 存入 Modelreturn "user/detail";} }
- 通过
2.6 View(视图)
- 作用:
将 Model 中的数据渲染为最终的响应(如 HTML 页面、JSON 数据)。 - 实现方式:
- Thymeleaf:
<div th:text="${user.name}"></div>
。 - JSP:
<%= user.getName() %>
。 - JSON:通过
@ResponseBody
或@RestController
直接返回对象。
- Thymeleaf:
2.7 Controller(控制器)
- 作用:
处理 HTTP 请求,调用 Model 并选择 View。 - 功能:
- 通过
@Controller
或@RestController
标记。 - 使用
@RequestMapping
系列注解定义请求映射。 - 示例:
@RestController public class UserController {@GetMapping("/api/user/{id}")public User getUser(@PathVariable Long id) {return userService.findById(id);} }
- 通过
2.8 拦截器(HandlerInterceptor)
- 作用:
在请求处理前后执行自定义逻辑(如权限校验、日志记录)。 - 功能:
- 实现
HandlerInterceptor
接口。 - 通过
WebMvcConfigurer
注册拦截器。 - 示例:
public class AuthInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {// 权限校验return true; // 继续处理请求} }
- 实现
3. 核心组件关系图
用户请求 → DispatcherServlet → HandlerMapping → Handler(Controller)↓HandlerAdapter → 处理请求 → Model + View名称↓ViewResolver → 解析View → 渲染响应 → 返回客户端
4. 请求处理流程
- 请求到达 DispatcherServlet:
客户端发送 HTTP 请求到DispatcherServlet
。 - 映射处理器:
HandlerMapping
根据 URL 找到对应的Handler
(如UserController
的list()
方法)。 - 调用处理器:
HandlerAdapter
调用Handler
方法,获取ModelAndView
(包含数据和逻辑视图名)。 - 解析视图:
ViewResolver
将逻辑视图名(如"user/list"
)转换为具体的View
(如/WEB-INF/views/user/list.jsp
)。 - 渲染响应:
View
使用 Model 数据生成最终响应(HTML、JSON 等),返回给客户端。
5. 表格总结
组件 | 作用 | 角色 | 示例/配置 |
---|---|---|---|
DispatcherServlet | 接收请求,分发到 Handler,组合 Model 和 View。 | 中央调度器,核心组件。 | @SpringBootApplication 自动配置。 |
HandlerMapping | 映射请求 URL 到对应的 Handler(Controller)。 | 请求路由的桥梁。 | @RequestMapping 、@GetMapping 。 |
HandlerAdapter | 调用 Handler 方法,处理参数绑定和返回值转换。 | 调用处理器的适配器。 | 支持 @RequestParam 、@PathVariable 。 |
ViewResolver | 将逻辑视图名转换为具体的 View 对象。 | 视图解析器,支持多种模板引擎。 | spring.mvc.view.prefix=/views/ 、spring.mvc.view.suffix=.jsp 。 |
Model | 存储数据,供视图渲染。 | 数据容器。 | Model 、@ModelAttribute 。 |
View | 渲染最终的响应(HTML、JSON 等)。 | 响应生成器。 | Thymeleaf、JSP、FreeMarker。 |
Controller | 处理请求,调用 Model,选择 View。 | 业务逻辑处理器。 | @Controller 、@RestController 。 |
HandlerInterceptor | 在请求处理前后执行拦截逻辑(如权限校验)。 | 请求拦截器。 | 实现 HandlerInterceptor 接口,通过 WebMvcConfigurer 注册。 |
6. 关键概念关系图
用户请求 → DispatcherServlet → HandlerMapping(找到 Controller) → HandlerAdapter(调用 Controller 方法)↓Model(存储数据) → ViewResolver(解析视图) → View(渲染响应)
7. 注意事项
- 注解驱动:通过
@EnableWebMvc
或@SpringBootApplication
启用注解支持。 - 异步处理:通过
@Async
或DeferredResult
实现异步请求。 - 异常处理:通过
@ControllerAdvice
统一处理全局异常。
通过以上组件和流程,Spring MVC 实现了请求的解耦和高效处理,是构建现代化 Web 应用的首选框架。
一、Spring MVC 请求处理全流程详解
1. 请求参数接收
-
实现方式:通过方法参数注解(如
@RequestParam
,@PathVariable
,@RequestBody
)直接绑定请求参数。@GetMapping("/user/{id}") public String getUser(@PathVariable String id, @RequestParam String name) {// 参数绑定到方法参数 }
-
核心类:
ServletInvocableHandlerMethod
负责参数解析,通过HandlerMethodArgumentResolver
解析不同注解的参数。
2. 请求分发到控制器方法
- 流程:
DispatcherServlet
通过HandlerMapping
定位处理器(Controller方法)。- 关键类:
RequestMappingHandlerMapping
根据@RequestMapping
注解匹配 URL 和 HTTP 方法。 - 匹配逻辑:解析
@RequestMapping
的path
、method
等属性,生成HandlerExecutionChain
。
// 示例:匹配到 UserController 的 getUser 方法 @Controller @RequestMapping("/user") public class UserController {@GetMapping("/{id}")public String getUser(@PathVariable String id) { ... } }
- 关键类:
3. 视图定位与渲染
-
视图解析:
ViewResolver
根据逻辑视图名(如user/list
)解析为实际视图(如 JSP 文件)。- 核心类:
InternalResourceViewResolver
将视图名转换为/WEB-INF/views/user/list.jsp
。
// 配置视图解析器 @Bean public ViewResolver viewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");return resolver; }
- 核心类:
-
视图类型:JSP、Thymeleaf、FreeMarker 等,通过
View
接口实现。
二、流程可省略与可自定义部分
1. 可省略的流程
流程阶段 | 省略条件 | 替代处理方式 |
---|---|---|
视图解析 | 返回值添加 @ResponseBody | 由 HttpMessageConverter 直接序列化返回 |
视图渲染 | 返回 JSON/XML 等数据格式 | 无需渲染,直接写入响应体 |
Session管理 | 无会话需求(如 REST API) | 关闭 Session 支持(@Controller 不继承 @SessionAttributes ) |
2. 可自定义的流程
流程阶段 | 自定义方式 | 实现类/注解 |
---|---|---|
参数绑定 | 自定义参数解析器 | HandlerMethodArgumentResolver |
处理器映射 | 自定义请求到方法的匹配规则 | HandlerMapping |
视图解析 | 自定义视图解析逻辑 | ViewResolver |
异常处理 | 自定义全局异常处理器 | @ControllerAdvice + @ExceptionHandler |
三、DispatcherServlet.properties
定义的类及作用
1. 核心类列表
类名 | 作用 |
---|---|
RequestMappingHandlerMapping | 根据 @RequestMapping 注解匹配 Controller 方法 |
RequestMappingHandlerAdapter | 调用 Controller 方法并处理方法参数和返回值 |
BeanNameUrlHandlerMapping | 根据 Bean 名称直接映射 URL(如 loginController 对应 /loginController ) |
SimpleUrlHandlerMapping | 简单的 URL 映射配置(通过 XML 配置 URL 和 Controller 关联) |
DefaultAnnotationHandlerMapping | 旧版注解处理器映射(Spring 3.0 后逐步被 RequestMappingHandlerMapping 替代) |
InternalResourceViewResolver | 解析 JSP 视图,将逻辑视图名转换为实际资源路径 |
ContentNegotiatingViewResolver | 根据请求的 Accept 头选择合适视图(如 JSON 或 HTML) |
HandlerExceptionResolver | 全局异常处理,将异常转换为视图或 HTTP 状态码 |
2. 流程总结表格
流程阶段 | 是否可省略 | 是否可自定义 | 默认实现类 |
---|---|---|---|
参数绑定 | 否 | 是 | ServletModelAttributeMethodProcessor |
请求分发 | 否 | 是 | RequestMappingHandlerMapping |
视图解析 | 是 | 是 | InternalResourceViewResolver |
视图渲染 | 是 | 是 | JstlView (JSP) |
异常处理 | 否 | 是 | DefaultHandlerExceptionResolver |
四、关键代码注释示例
// 1. Controller 方法参数绑定示例
@GetMapping("/search")
public String search(@RequestParam String keyword, @RequestBody User user) { // @RequestParam 绑定查询参数,@RequestBody 绑定 JSON 请求体
}// 2. 自定义视图解析器(实现 ViewResolver 接口)
public class CustomViewResolver implements ViewResolver {@Overridepublic View resolveViewName(String viewName, Locale locale) {// 自定义逻辑:根据 viewName 返回自定义 View 实现return new CustomView();}
}// 3. @ResponseBody 省略视图流程
@GetMapping("/api/user")
@ResponseBody
public User getUserAsJson() {// 直接返回对象,由 Jackson 转换为 JSON,跳过视图解析
}