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

相关推荐
鱼跃鹰飞6 小时前
设计模式系列:工厂模式
java·设计模式·系统架构
a努力。6 小时前
国家电网Java面试被问:混沌工程在分布式系统中的应用
java·开发语言·数据库·git·mysql·面试·职场和发展
Yvonne爱编码6 小时前
Java 四大内部类全解析:从设计本质到实战应用
java·开发语言·python
J2虾虾7 小时前
SpringBoot和mybatis Plus不兼容报错的问题
java·spring boot·mybatis
毕设源码-郭学长7 小时前
【开题答辩全过程】以 基于springboot 的豪华婚车租赁系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
Tao____9 小时前
通用性物联网平台
java·物联网·mqtt·低代码·开源
曹轲恒9 小时前
SpringBoot整合SpringMVC(上)
java·spring boot·spring
JH307310 小时前
Java Spring中@AllArgsConstructor注解引发的依赖注入异常解决
java·开发语言·spring
码农水水10 小时前
米哈游Java面试被问:机器学习模型的在线服务和A/B测试
java·开发语言·数据库·spring boot·后端·机器学习·word
2601_9495758610 小时前
Flutter for OpenHarmony二手物品置换App实战 - 表单验证实现
android·java·flutter