一、什么是Spring MVC?
Spring MVC是Spring Framework的核心模块之一,基于MVC(Model-View-Controller)架构模式,用于构建灵活、松耦合的Web应用程序。它通过清晰的职责分离,简化了请求处理、数据绑定、验证和视图渲染的流程。
核心优势:
高度可配置:支持注解驱动开发
无缝集成:与Spring IoC容器、AOP、Security等模块天然融合
REST支持:简化RESTful API开发
测试友好:提供Mock测试框架
二、Spring MVC核心架构
1. MVC组件职责
组件 | 职责说明 |
---|---|
Model | 封装业务数据(通常用Map或POJO) |
View | 渲染模型数据(JSP/Thymeleaf等) |
Controller | 处理请求并返回Model和视图名 |
2. 核心工作流程
三、关键组件详解
1. DispatcherServlet
(前端控制器)
入口点:所有请求首先到达此Servlet
配置示例(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>
</servlet>
2. HandlerMapping
映射请求URL到处理器(Controller)
常用实现:
RequestMappingHandlerMapping
(基于注解)
BeanNameUrlHandlerMapping
(基于Bean名称)
3. HandlerAdapter
实际执行处理器方法
支持多种处理器类型(如@Controller
, HttpRequestHandler
)
4. ViewResolver
将逻辑视图名解析为实际视图对象
常用实现:
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
四、注解驱动开发(现代Spring MVC主流方式)
1. 控制器示例
@Controller
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public String getUser(@PathVariable("id") Long id, Model model) {
User user = userService.findById(id);
model.addAttribute("user", user);
return "user-detail"; // 视图名称
}
@PostMapping
public String createUser(@Valid User user, BindingResult result) {
if (result.hasErrors()) {
return "user-form";
}
userService.save(user);
return "redirect:/users/" + user.getId();
}
}
2. 核心注解
注解 | 作用说明 |
---|---|
@Controller |
定义控制器类 |
@RequestMapping |
映射请求URL和方法 |
@GetMapping |
简化GET请求映射 |
@PostMapping |
简化POST请求映射 |
@PathVariable |
获取URL路径参数 |
@RequestParam |
获取请求参数 |
@ModelAttribute |
绑定参数到模型对象 |
@ResponseBody |
直接返回数据而非视图 |
五、数据处理与绑定
1. 参数绑定
@GetMapping("/search")
public String searchUsers(
@RequestParam(name = "page", defaultValue = "1") int page,
@RequestParam("keyword") String keyword) {
// 业务逻辑
}
2. 表单验证
public class User {
@NotBlank(message = "用户名不能为空")
@Size(min=3, max=20)
private String username;
@Email(message = "邮箱格式无效")
private String email;
}
@PostMapping
public String submitForm(@Valid User user, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "user-form";
}
// 保存操作
}
六、视图技术集成
Spring MVC支持多种视图技术:
JSP/JSTL:传统方案
Thymeleaf(推荐):
<div th:text="${user.name}">用户名占位</div>
FreeMarker:高性能模板引擎
JSON/XML:通过
@ResponseBody
或@RestController
七、高级特性
1. 拦截器(Interceptor)
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
// 身份验证逻辑
if (!isAuthenticated(request)) {
response.sendRedirect("/login");
return false;
}
return true;
}
}
2. 异常处理
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<String> handleUserNotFound(UserNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
}
}
3. 文件上传
@PostMapping("/upload")
public String handleFileUpload(@RequestParam("file") MultipartFile file) {
if (!file.isEmpty()) {
file.transferTo(new File("/uploads/" + file.getOriginalFilename()));
}
return "redirect:/success";
}
八、Spring Boot中的自动配置
Spring Boot简化了Spring MVC配置:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
// 自动配置项包括:
// - 内置Tomcat
// - 自动注册DispatcherServlet
// - 默认视图解析器
// - 静态资源处理(/static, /public)
九、最佳实践建议
使用RESTful风格:
@RestController
构建API分离关注点:
Controller:只处理HTTP协议
Service:实现业务逻辑
Repository:数据访问
启用缓存:
@Cacheable
提升性能API版本控制:
/v1/users
,/v2/users
统一响应格式:
{ "code": 200, "data": { ... }, "message": "success" }
结语
Spring MVC通过清晰的架构设计和丰富的功能集,已成为Java Web开发的事实标准。随着Spring Boot的普及,开发者可以更专注于业务逻辑而非配置。掌握其核心原理和现代注解驱动开发模式,是构建高性能、可维护Web应用的关键。