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 应用。建议通过实际项目(如用户管理系统)练习核心功能。

相关推荐
Rick199327 分钟前
LangChain(含 LangChain4j)和 Spring AI的区别
人工智能·spring·langchain
shaoFan130 分钟前
关于java 调用阿里千问大模型,流式返回,并返回给前端
java·前端·状态模式
雪碧聊技术30 分钟前
Java历史—沙箱安全机制
java·安全·沙箱机制
java1234_小锋31 分钟前
Spring AI 2.0 开发Java Agent智能体 - Spring AI 2.0简介
java·人工智能·spring·spring ai
Hesionberger35 分钟前
LeetCode72.编辑距离(多维动态规划)
java·开发语言·c++·python·算法
人道领域43 分钟前
【LeetCode刷题日记】1047:双栈法与双指针法巧妙消除相邻重复字符
java·算法·leetcode·职场和发展
Java成神之路-1 小时前
面试题:@Controller 与 @RestController 区别
java·spring boot
用户298698530141 小时前
Java 提取 HTML 文本内容:两种轻量级实现方案对比
java·后端
lihao lihao1 小时前
Linux文件与fd
java·linux·算法
Java爱好狂.1 小时前
Redis高级笔记:原理+集群+应用+拓展+源码
java·数据库·redis·spring·java面试·后端开发·java八股文