以下是 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
)。
-
示例 :
java@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)。
-
配置示例 :
propertiesspring.mvc.view.prefix=/WEB-INF/views/ spring.mvc.view.suffix=.jsp
2.5 Model(模型)
- 作用 :
存储数据,供视图渲染使用。 - 功能 :
-
通过
Model
、ModelAndView
或@ModelAttribute
注入数据。 -
示例:
java@Controller public class UserController { @GetMapping("/user/{id}") public String getUser(@PathVariable Long id, Model model) { User user = userService.findById(id); model.addAttribute("user", user); // 存入 Model return "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
系列注解定义请求映射。 -
示例:
java@RestController public class UserController { @GetMapping("/api/user/{id}") public User getUser(@PathVariable Long id) { return userService.findById(id); } }
-
2.8 拦截器(HandlerInterceptor)
- 作用 :
在请求处理前后执行自定义逻辑(如权限校验、日志记录)。 - 功能 :
-
实现
HandlerInterceptor
接口。 -
通过
WebMvcConfigurer
注册拦截器。 -
示例:
javapublic class AuthInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { // 权限校验 return true; // 继续处理请求 } }
-
3. 核心组件关系图
plaintext
用户请求 → 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. 关键概念关系图
plaintext
用户请求 → DispatcherServlet → HandlerMapping(找到 Controller) → HandlerAdapter(调用 Controller 方法)
↓
Model(存储数据) → ViewResolver(解析视图) → View(渲染响应)
7. 注意事项
- 注解驱动 :通过
@EnableWebMvc
或@SpringBootApplication
启用注解支持。 - 异步处理 :通过
@Async
或DeferredResult
实现异步请求。 - 异常处理 :通过
@ControllerAdvice
统一处理全局异常。
通过以上组件和流程,Spring MVC 实现了请求的解耦和高效处理,是构建现代化 Web 应用的首选框架。

一、Spring MVC 请求处理全流程详解
1. 请求参数接收
-
实现方式 :通过方法参数注解(如
@RequestParam
,@PathVariable
,@RequestBody
)直接绑定请求参数。java@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
。
java// 示例:匹配到 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
。
java// 配置视图解析器 @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 |
四、关键代码注释示例
java
// 1. Controller 方法参数绑定示例
@GetMapping("/search")
public String search(@RequestParam String keyword,
@RequestBody User user) {
// @RequestParam 绑定查询参数,@RequestBody 绑定 JSON 请求体
}
// 2. 自定义视图解析器(实现 ViewResolver 接口)
public class CustomViewResolver implements ViewResolver {
@Override
public View resolveViewName(String viewName, Locale locale) {
// 自定义逻辑:根据 viewName 返回自定义 View 实现
return new CustomView();
}
}
// 3. @ResponseBody 省略视图流程
@GetMapping("/api/user")
@ResponseBody
public User getUserAsJson() {
// 直接返回对象,由 Jackson 转换为 JSON,跳过视图解析
}