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 的设计强调模块化和灵活性,开发者可以通过配置或扩展组件适应不同需求。