spring MVC 介绍

Spring MVC 是 Spring 框架中用于构建 Web 应用的核心模块,基于 MVC 设计模式(Model-View-Controller)实现。以下是其核心概念的整理:


1. MVC 设计模式

Model (模型):封装业务数据和业务逻辑(如 POJO 对象、Service 层)。

View (视图):负责数据展示(如 JSP、Thymeleaf、HTML)。

Controller(控制器):接收请求,调用业务逻辑,返回模型和视图。


2. 核心组件

(1) DispatcherServlet(前端控制器)

作用 :Spring MVC 的入口,统一处理所有请求,协调各组件工作。

配置 :在 web.xml 中定义,或通过 Spring Boot 自动配置。

流程

  1. 接收 HTTP 请求。
  2. 调用 HandlerMapping 找到对应的控制器(Controller)。
  3. 调用 HandlerAdapter 执行控制器逻辑。
  4. 处理结果通过 ViewResolver 解析为视图。
(2) HandlerMapping

作用 :根据请求 URL 找到对应的 Controller 和方法。

默认实现RequestMappingHandlerMapping(基于 @RequestMapping 注解)。

(3) Controller

作用 :处理具体业务逻辑,返回数据或视图。

核心注解

@Controller:标记为控制器。

@RestController:专用于 REST API(等价于 @Controller + @ResponseBody)。

@RequestMapping:定义请求映射路径(类或方法级别)。

@GetMapping@PostMapping 等:简化特定 HTTP 方法的映射。

(4) ViewResolver(视图解析器)

作用 :将逻辑视图名(如 "home")解析为实际视图(如 home.jsp)。

常用实现

InternalResourceViewResolver:解析 JSP。

ThymeleafViewResolver:解析 Thymeleaf 模板。

(5) Model

作用 :向视图传递数据的容器。

使用方式

• 通过 Model 对象(方法参数)添加数据。

• 使用 @ModelAttribute 绑定请求参数到对象。


3. 请求处理流程

  1. 用户发起请求 → DispatcherServlet 接收请求。
  2. 查询 HandlerMapping → 找到对应的 Controller 方法。
  3. 调用 HandlerAdapter → 执行控制器方法。
  4. 处理业务逻辑 → 返回 ModelAndView(或直接返回数据)。
  5. 解析视图 → ViewResolver 将逻辑视图名解析为实际视图。
  6. 渲染视图 → 结合 Model 数据生成 HTML/JSON 响应。

4. 关键注解

(1) 请求映射

@RequestMapping:定义 URL 路径和 HTTP 方法。

java 复制代码
@RequestMapping(value = "/user", method = RequestMethod.GET)

@GetMapping@PostMapping 等:简化版映射注解。

(2) 参数绑定

@RequestParam:绑定请求参数到方法参数。

java 复制代码
public String getUser(@RequestParam("id") Long id) { ... }

@PathVariable:绑定 URL 路径变量。

java 复制代码
@GetMapping("/user/{id}")
public String getUser(@PathVariable Long id) { ... }

@RequestBody:将请求体(JSON/XML)绑定到对象。

java 复制代码
@PostMapping("/user")
public User createUser(@RequestBody User user) { ... }
(3) 数据传递

Model:通过方法参数传递数据到视图。

java 复制代码
@GetMapping("/users")
public String listUsers(Model model) {
    model.addAttribute("users", userService.findAll());
    return "user/list";
}

@ModelAttribute:绑定表单数据到对象。

java 复制代码
@PostMapping("/user")
public String saveUser(@ModelAttribute User user) { ... }
(4) 数据验证

@Valid:触发 JSR-303 验证(需配合 hibernate-validator)。

java 复制代码
@PostMapping("/user")
public String saveUser(@Valid @ModelAttribute User user, BindingResult result) {
    if (result.hasErrors()) { ... }
}

5. 视图技术

JSP :传统 Java 视图技术,需配置 ViewResolver

Thymeleaf :现代模板引擎,与 Spring Boot 集成简单。

JSON 响应 :使用 @ResponseBody@RestController 返回 JSON 数据。


6. RESTful 支持

HTTP 方法语义化

GET 查询,POST 新增,PUT 更新,DELETE 删除。

状态码与响应

• 使用 ResponseEntity 控制状态码和响应头。

java 复制代码
@GetMapping("/user/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
    User user = userService.findById(id);
    return ResponseEntity.ok(user); // 200 OK
}

7. 高级特性

(1) 拦截器(Interceptor)

作用 :在请求处理前后插入逻辑(如日志、权限校验)。

实现 :实现 HandlerInterceptor 接口,配置到 InterceptorRegistry

(2) 异常处理

@ExceptionHandler:在 Controller 内处理特定异常。

@ControllerAdvice:全局异常处理(所有 Controller 共享)。

java 复制代码
@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleException(Exception e) {
        return ResponseEntity.status(500).body(e.getMessage());
    }
}
(3) 文件上传

• 使用 MultipartFile 接收上传文件。

java 复制代码
@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) { ... }

8. 与其他技术集成

数据库 :整合 Spring Data JPA、MyBatis。

安全 :通过 Spring Security 实现权限控制。

测试 :使用 MockMvc 模拟 HTTP 请求测试 Controller。


总结

Spring MVC 的核心是 DispatcherServlet 驱动的请求处理流程,通过注解简化配置,结合组件化设计实现灵活扩展。掌握以下关键点即可快速上手:

  1. 请求映射(@RequestMapping 系列注解)。
  2. 参数绑定与数据验证。
  3. 视图解析与数据传递。
  4. RESTful API 设计。
  5. 拦截器与全局异常处理。

结合 Spring Boot 可进一步简化配置,快速构建 Web 应用。建议通过实际项目(如用户管理系统)练习核心功能。

相关推荐
程序猿教你打篮球15 分钟前
【SpringCloud】认识微服务
spring·spring cloud·微服务
mrbone1115 分钟前
C++-C++中的几种cast
java·开发语言·c++
我爱Jack1 小时前
Spring Boot 配置文件
java·数据库·spring boot
椰椰椰耶1 小时前
【redis】主从复制:单点问题、配置详解、特点详解
java·数据库·redis
阿汤哥的程序之路1 小时前
Java 安装开发环境(Mac Apple M1 Pro)
java·python·macos
齐 飞1 小时前
JVM类加载过程详解
java·jvm·笔记
big凉笙墨染1 小时前
《网络安全学习者必看!Java序列化与反序列化深度解读》
java·后端·安全
独行soc1 小时前
2025年渗透测试面试题总结-某华为面试复盘 (题目+回答)
java·python·安全·web安全·面试·职场和发展·红蓝攻防
neoooo1 小时前
Redis 缓存击穿、穿透、雪崩问题及解决方案
java·spring boot·redis
web150854159352 小时前
Windows操作系统部署Tomcat详细讲解
java·windows·tomcat