Spring MVC 核心原理
Spring MVC 是基于 Servlet API 构建的 Web 框架,采用前端控制器模式 (Front Controller Pattern),核心组件是 DispatcherServlet
,负责协调各组件处理请求。
请求处理流程
-
DispatcherServlet 接收请求
用户请求首先到达
DispatcherServlet
(核心控制器),它是整个流程的入口点,负责请求的分发和响应处理。 -
HandlerMapping 解析请求
HandlerMapping
根据请求的 URL 路径,找到对应的处理器(Controller 中的方法),并生成一个处理器执行链(HandlerExecutionChain
),可能包含拦截器(Interceptor)。 -
HandlerAdapter 执行处理器
HandlerAdapter
负责调用具体的处理器方法(如@RequestMapping
注解的方法),处理请求参数绑定、方法调用等逻辑。 -
Controller 处理业务逻辑
控制器方法执行业务逻辑,返回一个
ModelAndView
对象(包含模型数据和视图名称)或直接返回数据(如@ResponseBody
注解的方法)。 -
ViewResolver 解析视图
如果返回的是视图名称,
ViewResolver
将视图名称解析为具体的视图对象(如 JSP、Thymeleaf 模板等)。 -
View 渲染响应
视图对象根据模型数据渲染最终的响应内容(HTML、JSON 等),并通过
DispatcherServlet
返回给客户端。
关键组件说明
-
DispatcherServlet
前端控制器,统一处理所有请求,协调其他组件工作。
-
HandlerMapping
映射请求到处理器,支持注解(如
@RequestMapping
)和配置文件方式。 -
HandlerAdapter
适配不同处理器(如
Controller
接口、注解方式等),调用处理器方法。 -
ViewResolver
视图解析器,将逻辑视图名解析为实际视图(如
/WEB-INF/views/home.jsp
)。 -
HandlerInterceptor
拦截器,可以在请求处理前后执行自定义逻辑(如权限检查、日志记录)。
注解驱动开发
Spring MVC 支持基于注解的配置,简化开发:
@Controller
:标记类为控制器。@RequestMapping
:映射请求路径到方法。@RequestParam
:绑定请求参数到方法参数。@ResponseBody
:直接返回数据(如 JSON/XML)。@RestController
:组合@Controller
和@ResponseBody
。
示例代码片段
@Controller
@RequestMapping("/user")
public class UserController {
@GetMapping("/info")
public String getUserInfo(Model model) {
model.addAttribute("name", "Spring MVC");
return "userInfo"; // 视图名称
}
@PostMapping("/save")
@ResponseBody
public ResponseEntity<String> saveUser(@RequestBody User user) {
// 处理业务逻辑
return ResponseEntity.ok("Success");
}
}
扩展机制
-
数据绑定与验证
支持通过
@InitBinder
自定义数据绑定,结合@Valid
实现参数校验。 -
异常处理
通过
@ControllerAdvice
和@ExceptionHandler
全局处理异常。 -
静态资源处理
通过
<mvc:resources>
或WebMvcConfigurer
配置静态资源路径。
Spring MVC 的设计强调模块化和灵活性,开发者可以通过配置或扩展组件适应不同需求。