在Java企业级开发中SpringMVC 作为最主流的Web框架之一凭借其强大的注解驱动开发模式极大地简化了Servlet层的开发。告别了繁琐的web.xml配置我们只需要在普通的POJO上添加几个注解就能轻松处理客户端请求。本文将系统性地总结 SpringMVC 中最常用、最核心的注解并结合代码片段说明其具体用法。## 1. 控制器定义Controller 与 RestController这是开启 SpringMVC 之旅的第一步。- **Controller** 标记一个类作为Spring MVC的**控制器**。默认情况下它返回的是**视图名称**如返回 userList会跳转到 userList.jsp。- **RestController** 这是 Controller ResponseBody 的组合注解。常用于**RESTful API**开发它默认所有方法返回的都是 **JSON/XML** 格式的数据而不是视图页面。**用法示例**java// 传统Web应用返回视图Controllerpublic class ViewController {GetMapping(/hello)public String sayHello() {return helloPage; // 跳转到 helloPage.html/jsp}}// 前后端分离/接口开发返回JSONRestControllerRequestMapping(/api/users)public class UserApiController {GetMapping(/{id})public User getUser(PathVariable Long id) {return userService.getById(id); // 自动转为JSON}}## 2. 请求映射RequestMapping 及其衍生RequestMapping 是最核心的映射注解用于将HTTP请求映射到特定处理器的某个方法上。为了方便和语义化Spring 提供了它的四个快捷版本- **GetMapping** 映射 GET 请求查询数据- **PostMapping** 映射 POST 请求提交数据- **PutMapping** 映射 PUT 请求更新数据- **DeleteMapping** 映射 DELETE 请求删除数据**用法示例**javaRestControllerRequestMapping(/product)public class ProductController {// 传统写法RequestMapping(value /list, method RequestMethod.GET)GetMapping(/list)public ListProduct list() {return productService.findAll();}PostMapping(/add)public Result add(RequestBody Product product) {// 处理新增逻辑return Result.success();}}## 3. 参数接收从请求到方法的桥梁这是日常开发中使用频率最高的部分。- **PathVariable** 接收**URL路径**中的占位符参数。常用于RESTful风格接口如 /user/1。- **RequestParam** 接收**URL查询参数**或**表单参数**。如 /user?id1 或表单中的 name 字段。- **RequestBody** 接收**HTTP请求体**中的JSON/XML数据并将其自动反序列化为Java对象。常用于POST/PUT请求。- **RequestHeader** 获取请求头中的特定值如 Token、User-Agent。- **CookieValue** 获取Cookie中的值。**用法示例**javaRestControllerRequestMapping(/order)public class OrderController {// URL: /order/detail/1001GetMapping(/detail/{orderId})public Order getOrder(PathVariable Long orderId) {// orderId 1001return orderService.get(orderId);}// URL: /order/search?page1size10GetMapping(/search)public PageResult search(RequestParam(defaultValue 1) int page,RequestParam(defaultValue 10) int size) {// 参数非必传时设置 required falsereturn orderService.search(page, size);}// 接收JSON{productId:101, quantity:2}PostMapping(/create)public Result createOrder(RequestBody OrderDto orderDto) {// 自动将JSON映射到OrderDto对象return orderService.create(orderDto);}}## 4. 数据绑定与格式化- **ModelAttribute** 将请求参数绑定到**模型对象**上并将该对象存入Model中供视图使用。也可以标注在方法上表示在控制器方法执行前预先初始化模型数据。- **DateTimeFormat** 用于字符串到日期类型的转换通常在POJO的字段上使用。- **NumberFormat** 用于字符串到数字类型的格式化。**用法示例**javaControllerpublic class UserController {// 场景表单提交自动封装为User对象并传到页面PostMapping(/register)public String register(ModelAttribute(user) User user) {// 表单字段自动填充到user对象return registerSuccess;}}// POJO中的格式化示例public class OrderForm {DateTimeFormat(pattern yyyy-MM-dd HH:mm:ss)private LocalDateTime createTime;NumberFormat(pattern #,###.##)private BigDecimal amount;}## 5. 响应处理- **ResponseBody** 将方法返回的Java对象转换为JSON/XML并直接写入HTTP响应体中不经过视图解析器。RestController 内部已经包含了此注解。- **ResponseStatus** 指定HTTP响应的状态码如 ResponseStatus(HttpStatus.CREATED)通常用于异常类或成功创建资源的场景。**用法示例**javaRestControllerpublic class ResponseDemoController {// 明确返回201状态码PostMapping(/resource)ResponseStatus(HttpStatus.CREATED)public Resource createResource() {return new Resource(New Resource);}// 使用ResponseBody返回JSON虽然RestController已内置GetMapping(/data)ResponseBodypublic MapString, Object getData() {return Map.of(key, value);}}## 6. 文件上传与处理- **RequestPart** 专门用于处理**multipart/form-data**格式的请求既可以接收文件MultipartFile也可以接收JSON数据块。**用法示例**javaPostMapping(/upload)public String handleFileUpload(RequestParam(file) MultipartFile file) {// 处理上传的文件String originalName file.getOriginalFilename();// 保存文件逻辑...return upload success;}// 同时上传文件和JSON数据PostMapping(/submit)public String submitForm(RequestPart(file) MultipartFile file,RequestPart(meta) ProductMeta meta) {// 处理文件和元数据return success;}## 7. 全局异常处理进阶常用虽然不属于单个控制器注解但在大型项目中极其常用- **ControllerAdvice** / **RestControllerAdvice** 定义全局的控制器增强类。- **ExceptionHandler** 定义全局处理特定异常的方法。**用法示例**javaRestControllerAdvicepublic class GlobalExceptionHandler {ExceptionHandler(MethodArgumentNotValidException.class)public Result handleValidationException(MethodArgumentNotValidException e) {String message e.getBindingResult().getAllErrors().get(0).getDefaultMessage();return Result.error(400, message);}ExceptionHandler(Exception.class)public Result handleGenericException(Exception e) {return Result.error(500, 服务器内部错误);}}## 总结| 注解 | 核心作用 | 常见场景 || :--- | :--- | :--- || Controller | 声明控制器返回视图 | 传统Web应用 || RestController | 声明控制器返回数据 | RESTful API || RequestMapping | 映射请求路径 | 类级别路径前缀 || GetMapping等 | 映射HTTP方法 | 根据语义处理CRUD || PathVariable | 获取URL路径参数 | /user/{id} || RequestParam | 获取URL查询参数 | ?page1 || RequestBody | 获取请求体JSON | POST/PUT提交数据 || ResponseBody | 返回JSON数据 | 接口数据响应 || ModelAttribute | 表单数据绑定 | 传统表单提交 || RestControllerAdvice | 全局异常/数据绑定 | 统一异常处理 |掌握这些注解你就能够灵活应对 SpringMVC 开发中 95% 的业务场景。注解的核心思想就是 **“约定大于配置”** —— 少写XML多关注业务逻辑。希望这篇总结对你的开发学习有帮助