一、控制器类注解:定义接口的 "入口"
这类注解用于标记一个类为 Spring MVC 控制器,负责接收和处理客户端请求。
1. @Controller:传统视图控制器
-
核心作用:标记类为 Spring MVC 控制器,Spring 启动时会自动扫描并管理该类对象。
-
关键特点 :默认返回视图名,配合视图解析器跳转到页面(如 JSP、Thymeleaf),常用于传统服务端渲染项目。
-
代码示例 :
javaimport 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)
-
代码示例:
javaimport 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:是否为必填参数,默认truedefaultValue:参数未传递时的默认值
-
代码示例:
javaimport 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。 -
代码示例 :
javaimport 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)。 -
代码示例 :
javaimport 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类型的文件上传请求,可同时接收文件和普通表单参数。 -
代码示例 :
javaimport 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、登录状态标识。
-
代码示例 :
javaimport 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,才能通过该注解读取。 -
代码示例 :
javaimport 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、设备信息等。
-
代码示例 :
javaimport 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的组合,类上添加后所有方法默认生效。 -
代码示例 :
javaimport 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 "直接返回的响应数据"; } }