以下是 SpringMVC 框架基础的核心知识点总结,结合了多个教程和源码解析,帮助你快速掌握其核心原理和开发流程:
一、SpringMVC 概述
-
定义
SpringMVC 是 Spring 框架的 Web 模块,基于 MVC 设计模式 ,通过解耦请求处理、业务逻辑和视图渲染,简化 Web 开发。其核心是 DispatcherServlet(前端控制器),负责请求分发和流程控制。
-
核心特点
-
注解驱动 :通过
@Controller
、@RequestMapping
等注解简化配置。 -
灵活扩展:支持自定义拦截器、视图解析器、数据绑定等。
-
RESTful 支持:通过 HTTP 方法(GET/POST/PUT/DELETE)映射资源操作。
-
与 Spring 生态无缝集成:依赖注入(DI)、事务管理等特性可直接复用。
-
二、核心组件与工作流程
1. 核心组件
组件 | 作用 | 典型实现类/配置 |
---|---|---|
DispatcherServlet | 前端控制器,接收所有请求并分发到处理器 | 配置在 web.xml 中 |
HandlerMapping | 将请求 URL 映射到具体的处理器(Controller) | RequestMappingHandlerMapping |
Controller | 处理业务逻辑,返回 ModelAndView 或数据 |
使用 @Controller 注解的类 |
ModelAndView | 封装模型数据(Model)和视图名称(View) | 由 Controller 方法返回 |
ViewResolver | 将逻辑视图名解析为具体视图(如 JSP、Thymeleaf) | InternalResourceViewResolver |
2. 请求处理流程
-
用户发起请求 → DispatcherServlet 拦截请求
-
HandlerMapping 查找处理器 → HandlerAdapter 执行处理器方法
-
Controller 处理逻辑 → 返回 ModelAndView
-
ViewResolver 解析视图 → 视图渲染 → 响应返回客户端
(详细流程可参考 )
三、快速入门示例
1. 项目配置
-
依赖配置(pom.xml)
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.10</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>
-
web.xml 配置
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
2. 控制器示例
@Controller
public class HelloController {
@RequestMapping("/hello")
public ModelAndView hello() {
ModelAndView mav = new ModelAndView("hello");
mav.addObject("message", "Hello, Spring MVC!");
return mav;
}
}
-
视图文件(hello.jsp)
<h1>${message}</h1>
四、常用功能与注解
1. 请求映射与参数绑定
注解 | 用途 | 示例 |
---|---|---|
@RequestMapping |
映射 URL 到方法 | @RequestMapping("/user") |
@PathVariable |
绑定 URL 路径变量 | @PathVariable("id") int id |
@RequestParam |
绑定请求参数 | @RequestParam("name") String |
@RequestBody |
绑定 JSON/XML 请求体 | @RequestBody User user |
2. 数据验证
-
JSR-303 验证
public class User { @NotBlank private String name; // getters/setters } @PostMapping("/user") public String addUser(@Valid User user, BindingResult result) { if (result.hasErrors()) { return "error"; } return "success"; }
3. 异常处理
-
局部异常处理
@ExceptionHandler(Exception.class) public ModelAndView handleException(Exception ex) { ModelAndView mav = new ModelAndView("error"); mav.addObject("message", ex.getMessage()); return mav; }
-
全局异常处理
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(NullPointerException.class) public ModelAndView handleNullPointer() { // 处理逻辑 } }
五、高级特性
1. RESTful 支持
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
// 查询用户
}
@PostMapping
public ResponseEntity<String> createUser(@RequestBody User user) {
// 创建用户
return ResponseEntity.ok("User created");
}
}
2. 文件上传
-
配置解析器
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="10485760"/> <!-- 10MB --> </bean>
-
控制器方法
@PostMapping("/upload") public String uploadFile(@RequestParam("file") MultipartFile file) { // 处理文件 }
六、源码与扩展
-
DispatcherServlet 源码
核心方法
doDispatch()
实现了请求分发逻辑,包括获取 Handler、执行拦截器链、调用适配器等。 -
扩展点
-
拦截器(Interceptor) :实现
HandlerInterceptor
,在请求处理前后添加逻辑。 -
视图解析器:自定义视图解析规则(如 JSON、PDF)。
-
静态资源处理 :通过
<mvc:resources>
配置静态资源路径。
-
总结
SpringMVC 通过 DispatcherServlet 统筹请求处理流程,结合注解和配置实现灵活的 Web 开发。掌握其核心组件(如 Controller、ModelAndView)和扩展机制(拦截器、异常处理)是进阶的关键。建议结合实际项目练习,并深入阅读源码以理解底层实现。