文章目录
- @RequestMapping
- @RestController
- @RequestParam
- @RequestBody
- @PathVariable
- @RequestPart
- @CookieValue
- @SessionAttribute
- @RequestHeader
- @Target、@Retention、@Documented
- @Controller、@ResponseBody
@RequestMapping
@RequestMapping⽤来注册接⼝的路由映射,可以作用在类上,也可以作用在方法上,当标识⼀个类,设置映射请求的请求路径的初始信息,当标识⼀个⽅法,设置映射请求请求路径的具体信息。下面的代码表⽰服务收到请求时, 路径为 /hello 的请求就会调⽤ hello 这个⽅法的代码.
java
@RestController
public class UserController {
// 路由器规则注册
@RequestMapping("/hello")
public String hello(){
return "hello,Spring boot";
}
}
@RequestMapping ⽀持 get 请求和 post 请求 ,可以通过 method 进行指定,
java
@RestController
public class UserController {
// 路由器规则注册
@RequestMapping(value = "/hello",method= RequestMethod.POST)
public String hello(){
return "hello,Spring boot";
}
}
@RestController
@RestController是 Spring 中用来标记控制器类的注解,标注的类下的所有方法返回的数据直接写入HTTP响应体中,如下例子当浏览器访问 /hello 时,页面直接显示字符串Hello World,当访问 /user 时,Spring 会自动把 User 对象转换成 JSON 返回{"name":"张三","age":25}
java
@RestController
public class TestController {
@RequestMapping("/hello")
public String hello() {
return "Hello World";
}
@RequestMapping("/user")
public User getUser() {
User user = new User("张三", 25);
return user; // 返回一个 Java 对象
}
}
@RestController = @Controller + @ResponseBody
@RequestParam
有时候,前端传递的参数 key 和我们后端接收的 key 可以不⼀致,⽐如前端传递了⼀个 time 给后端,⽽后端是使⽤ createtime 字段来接收的。此时可以通过@RequestParam来重命名前后端的参数值。
例如,前端发来请求 GET /user?id=123,此时会从请求中找名为 id 的参数,把值赋给后面的 int userId 参数。
java
@RestController
public class UserController {
@RequestMapping("/user")
public String getUser(@RequestParam("id") int userId) {
return "用户ID是:" + userId;
}
}
使⽤ @RequestParam 进⾏参数重命名时, 参数就变成了必传参数,可以通过设置 @RequestParam 中的 required=false 来设置成非必传
java
@RequestParam(value = "name", required = false) String userName
@RequestParam可以用来传递集合,默认情况下,请求中参数名相同的多个值,是封装到数组. 如果要封装到集合,要使⽤@RequestParam 绑定参数关系。
java
@RequestMapping("/test")
public String method6(@RequestParam List<String> listParam){
return "size:"+listParam.size() + ",listParam:"+listParam;
}
@RequestBody
@RequestBody是将 HTTP 请求体(Body)中的数据绑定到控制器方法参数的注解,当前端通过 POST、PUT 等请求发送一段 JSON(或 XML)数据时,@RequestBody 能帮你把这段数据自动转换成一个 Java 对象,方便后续的使用
json
{
"name": "张三",
"age": 25
}
java
@PostMapping("/user")
public String createUser(@RequestBody User user) {
System.out.println(user.getName()); // 输出 "张三"
return "success";
}
@PathVariable
@PathVariable用来获取 URL 路径中的变量值的注解,例如使用浏览器发送请求 http://127.0.0.1:8080/param/m8/5/zhangsan,最终获取到 id 为 5 ,userName 为 zhangsan
java
@RequestMapping("/m8/{id}/{name}")
public String method8(@PathVariable Integer id, @PathVariable("name") String
userName){
return "解析参数id:"+id+",name:"+userName;
}
同样可以进行重命名操作,下面的例子表示获取 @GetMapping("/users/{id}") 中 id 的值
java
@RestController
public class UserController {
@GetMapping("/users/{id}")
public String getUser(@PathVariable("id") int userId) {
return "用户ID:" + userId;
}
}
@RequestPart
@RequestPart 用于处理 multipart/form-data 请求的注解。它可以把 multipart 请求中的某个特定部分(part)绑定到控制器方法的参数上,通常用于文件上传
java
@RequestMapping("/m9")
public String getfile(@RequestPart("file") MultipartFile file) throws IOException {
//获取⽂件名称
String fileName = file.getOriginalFilename();
//⽂件上传到指定路径
file.transferTo(new File("D:/temp/" + file.getOriginalFilename()));
return "接收到⽂件名称为: "+fileName;
}
@CookieValue
@CookieValue把请求中某个 Cookie 的值直接绑定到控制器方法的参数上,下面的例子能够指定获取 Cookie 中键为 bite 的字段值
java
@RequestMapping("/getCookie")
public String cookie(@CookieValue("bite") String bite) {
return "bite:" + bite;
}
@SessionAttribute
@SessionAttribute能从当前 HTTP Session 中获取某个属性的值,绑定到方法参数上,下面的例子就是从Session中获取属性名为 "username"的一系列属性,比如{id=1001, username="zhangsan"}
java
@RequestMapping("/getSess2")
public String sess2(@SessionAttribute(value = "username",required = false)
User username) {
return "username:"+user.getUsername();
}
java
@RequestMapping("/getSess2")
public String sess2(@SessionAttribute(value = "username",required = false)
String username) {
return "username:"+ username;
}
@RequestHeader
@RequestHeader用来获取 HTTP 请求头(Header)中的值的注解,例如下面的代码Spring 会自动从请求头中找到名为 User-Agent 的字段,把它的值赋给 userAgent 参数。
java
@GetMapping("/info")
public String getInfo(@RequestHeader("User-Agent") String userAgent) {
return "你的浏览器是:" + userAgent;
}
@Target、@Retention、@Documented
@Target、@Retention、@Documented这三个注解被称为元注解,即表示" 注解的注解 ",是用来定义自定义注解时,规定这个自定义注解的行为
- @Target 表示注解的适用范围,例如@Target({ElementType.TYPE})表示可以贴在类、接口、枚举上,@Target({ElementType.METHOD})表示可以贴在方法上;
- @Retention 表示注解的生命周期,包含三个取值:
- RetentionPolicy.SOURCE 表示只在源代码中存在,编译后就被丢弃;
- RetentionPolicy.CLASS 表示注解会保留在编译后的 .class 文件中,但JVM加载类时不会保留;
- RetentionPolicy.RUNTIME 表示注解会一直保留到运行时,JVM可以读取到;
- @Documented 是一个简单的标记注解,表示使用这个注解的类或方法,在生成Javadoc文档时,是否把该注解信息也包含进去。
下面是@RestController的源码
java
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
@AliasFor(
annotation = Controller.class
)
String value() default "";
}
@Controller、@ResponseBody
@Controller用来标记一个类为控制器的注解,在没有前后端分离的传统 Web 开发中,控制器方法通常返回一个视图名称,此时@Controller会将返回值解析为视图名称。
java
@Controller
public class IndexController {
@RequestMapping("/index")
public Object index(){
return "/index.html";
}
}
@ResponseBody用来将控制器方法的返回值直接写入 HTTP 响应体(response body)的注解,而不是进行视图解析(跳转到某个页面),如下例所示,此时该⽅法就会把 "/index.html" 当做⼀个数据返回给前端。
java
@Controller
@ResponseBody
public class IndexController {
@RequestMapping("/index")
public Object index(){
return "/index.html";
}
}
@RestController = @Controller + @ResponseBody