Spring MVC 注解

一、控制器类注解:定义接口的 "入口"

这类注解用于标记一个类为 Spring MVC 控制器,负责接收和处理客户端请求。

1. @Controller:传统视图控制器

  • 核心作用:标记类为 Spring MVC 控制器,Spring 启动时会自动扫描并管理该类对象。

  • 关键特点 :默认返回视图名,配合视图解析器跳转到页面(如 JSP、Thymeleaf),常用于传统服务端渲染项目。

  • 代码示例

    java 复制代码
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    
    @Controller
    public class PageController {
    
        // 访问 /login 时,会跳转到名为 "login" 的视图页面
        @GetMapping("/login")
        public String loginPage() {
            return "login";
        }
    }

    2. @RestController:前后端分离专用控制器

  • 核心作用@Controller + @ResponseBody 的组合注解,是前后端分离项目的标配。

  • 关键特点:类中所有方法的返回值,都会自动序列化为 JSON/XML 数据写入响应体,不会跳转页面。

  • 代码示例

java 复制代码
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/user") // 统一接口前缀
public class UserApiController {

    // 访问 /api/user/info 直接返回JSON数据
    @GetMapping("/info")
    public String getUserInfo() {
        return "{\"name\":\"张三\",\"age\":21}";
    }
}

二、请求映射注解:绑定请求路径

@RequestMapping 及其派生注解,用于将客户端请求 URL 与控制器方法绑定。

@RequestMapping:通用路由映射

  • 核心作用:定义请求 URL 与控制器方法的映射关系,可加在类或方法上。

  • 常用属性

    • value/path:指定请求路径
    • method:指定请求方式(GET/POST/PUT/DELETE)
    • params:指定请求参数匹配条件
  • 简化派生注解 :Spring 4.3 后提供了更简洁的版本:

    • @GetMapping(等价于 GET 请求的 @RequestMapping
    • @PostMapping(等价于 POST 请求的 @RequestMapping
  • 代码示例:

    java 复制代码
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/api/demo")
    public class RequestMappingDemoController {
    
        // 类上的@RequestMapping:给所有方法加统一前缀 /api/demo
        // 方法上的@RequestMapping:指定GET请求,路径为 /api/demo/hello
        @RequestMapping(value = "/hello", method = RequestMethod.GET)
        public String hello() {
            return "Hello, Spring MVC!";
        }
    
        // 简化写法:@GetMapping 等价于 GET请求的@RequestMapping
        @GetMapping("/simple")
        public String simpleHello() {
            return "简化写法的Hello!";
        }
    }

    三、请求参数接收注解:获取客户端数据

    这类注解用于从请求的不同位置获取参数,是接口开发中最常用的部分。

    1. @RequestParam:接收普通请求参数

  • 核心作用 :接收 URL 查询参数(如 ?name=张三)、表单提交参数,支持参数重命名和默认值设置。

  • 常用属性

    • value:指定前端传递的参数名(用于后端参数重命名)
    • required:是否为必填参数,默认 true
    • defaultValue:参数未传递时的默认值
  • 代码示例:

    java 复制代码
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/api/param")
    public class RequestParamDemoController {
    
        // 访问 /api/param/search?keyword=Java&page=2
        @GetMapping("/search")
        public String search(
                @RequestParam("keyword") String keyWord, // 前端传keyword,后端用keyWord接收(重命名)
                @RequestParam(value = "page", defaultValue = "1") Integer page, // 不传page时默认值为1
                @RequestParam(required = false) String sort // 非必填参数,不传时为null
        ) {
            return "搜索关键词:" + keyWord + ",页码:" + page + ",排序:" + sort;
        }
    }

    2. @RequestBody:接收 JSON 格式请求体

  • 核心作用 :接收前端以 application/json 格式提交的请求体,自动将 JSON 字符串转换为 Java 对象。

  • 关键前提 :请求头的 Content-Type 必须为 application/json

  • 代码示例

    java 复制代码
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RestController;
    
    // 实体类(可放在同一文件内,实际开发中建议单独创建)
    class User {
        private String name;
        private Integer age;
    
        // 必须提供无参构造器和getter/setter
        public User() {}
        public User(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
        public Integer getAge() { return age; }
        public void setAge(Integer age) { this.age = age; }
    }
    
    @RestController
    @RequestMapping("/api/json")
    public class RequestBodyDemoController {
    
        // 前端POST请求体:{"name":"张三","age":21}
        @PostMapping("/addUser")
        public String addUser(@RequestBody User user) {
            return "接收成功:姓名=" + user.getName() + ",年龄=" + user.getAge();
        }
    }

    3. @PathVariable:接收 URL 路径参数

  • 核心作用 :接收 REST 风格接口 URL 中的路径变量(如 /user/123 中的 123)。

  • 代码示例

    java 复制代码
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/api/path")
    public class PathVariableDemoController {
    
        // 访问 /api/path/user/1001,路径中的1001会被绑定到id参数
        @GetMapping("/user/{id}")
        public String getUserById(@PathVariable Integer id) {
            return "查询到用户ID:" + id;
        }
    
        // 多路径参数示例:访问 /api/path/order/2026/04
        @GetMapping("/order/{year}/{month}")
        public String getOrderByTime(
                @PathVariable("year") Integer year, // 明确指定路径变量名
                @PathVariable Integer month
        ) {
            return "查询订单:" + year + "年" + month + "月";
        }
    }

    4. @RequestPart:接收上传文件

  • 核心作用 :处理 multipart/form-data 类型的文件上传请求,可同时接收文件和普通表单参数。

  • 代码示例

    java 复制代码
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestPart;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.multipart.MultipartFile;
    
    @RestController
    @RequestMapping("/api/upload")
    public class RequestPartDemoController {
    
        // 前端form表单提交,enctype="multipart/form-data"
        @PostMapping("/file")
        public String uploadFile(
                @RequestPart("file") MultipartFile file, // 接收上传的文件
                @RequestPart("desc") String description  // 同时接收表单参数
        ) {
            if (file.isEmpty()) {
                return "上传文件为空";
            }
            return "上传成功:文件名=" + file.getOriginalFilename() + ",描述=" + description;
        }
    }

    四、从请求 / 会话中获取值的注解

    这类注解用于从 Cookie、Session、请求头中直接获取数据,无需手动解析 HttpServletRequest

    1. @CookieValue:从 Cookie 中获取值

  • 核心作用:直接读取请求 Cookie 中指定名称的值,常用于获取 SessionID、登录状态标识。

  • 代码示例

    java 复制代码
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.CookieValue;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/api/cookie")
    public class CookieValueDemoController {
    
        @GetMapping("/info")
        public String getInfo(@CookieValue("SESSIONID") String sessionId) {
            return "当前会话ID:" + sessionId;
        }
    }

    2. @SessionAttribute:从 Session 中获取值

  • 核心作用:读取服务器端 Session 中存储的属性值,常用于获取登录用户信息。

  • 注意 :需先通过 HttpSession.setAttribute() 将数据存入 Session,才能通过该注解读取。

  • 代码示例

    java 复制代码
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.SessionAttribute;
    import org.springframework.web.bind.annotation.RestController;
    import javax.servlet.http.HttpSession;
    
    @RestController
    @RequestMapping("/api/session")
    public class SessionAttributeDemoController {
    
        // 先设置Session数据(模拟登录)
        @GetMapping("/login")
        public String login(HttpSession session) {
            session.setAttribute("loginUser", "张三");
            return "登录成功,用户信息已存入Session";
        }
    
        // 从Session中读取用户信息
        @GetMapping("/profile")
        public String getProfile(@SessionAttribute("loginUser") String username) {
            return "当前登录用户:" + username;
        }
    }

    3. @RequestHeader:从请求头中获取值

  • 核心作用:读取 HTTP 请求头中的指定字段,常用于获取 Token、User-Agent、设备信息等。

  • 代码示例

    java 复制代码
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestHeader;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/api/header")
    public class RequestHeaderDemoController {
    
        @GetMapping("/data")
        public String getData(
                @RequestHeader("Authorization") String token, // 获取请求头中的Token
                @RequestHeader(value = "User-Agent", defaultValue = "unknown") String userAgent // 获取客户端信息
        ) {
            return "请求Token:" + token + ",客户端:" + userAgent;
        }
    }

    五、响应处理注解:控制接口返回

    @ResponseBody:直接返回数据

  • 核心作用:加在方法或类上,方法返回值不会被解析为视图名,而是直接序列化为 JSON/XML 写入响应体。

  • @RestController 的关系@RestController 就是 @Controller + @ResponseBody 的组合,类上添加后所有方法默认生效。

  • 代码示例

    java 复制代码
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Controller // 传统@Controller,默认返回视图
    public class ResponseBodyDemoController {
    
        @GetMapping("/hello")
        @ResponseBody // 加了这个注解,直接返回字符串,不跳转页面
        public String hello() {
            return "直接返回的响应数据";
        }
    }
相关推荐
老友@2 小时前
Jenkins 中 Node 版本异常排查:Alpine + musl 导致的兼容问题(lts-alpine-jdk17)
java·servlet·jenkins
Kiyra2 小时前
为什么远程调用别包进 Spring 事务里
java·后端·spring
快乐非自愿2 小时前
SpringAI入门指南
大数据·人工智能·spring
人道领域2 小时前
【LeetCode刷题日记】225.用队列实现栈--三招实现栈操作(多种思维)
java·开发语言·算法·leetcode·面试
Mr_pyx2 小时前
【告别for循环】Java Stream 流式编程精通:从入门到源码级的性能优化
java·开发语言·性能优化
:1212 小时前
java基础--数组
java·开发语言
Agent产品评测局2 小时前
智能体在药物发现阶段如何辅助完成靶点专利覆盖的自动识别?2026药研AI Agent全景盘点与自动化选型指南
java·人工智能·ai·chatgpt·自动化
Agent手记2 小时前
终端消费数据自动采集与分析智能体的搭建思路:2026全链路技术架构与实战解析
java·开发语言·人工智能·ai·架构
这是程序猿2 小时前
mysql的安装教程
java·人工智能·windows·mysql