目录
1.7.1 @ResponseBody和@RestController两者区别
概述
前文我们的访问我们的项目直接就是用的http://localhost:8080/
,这里对于具体的项目我们可以加上项目路径并且设置端口号。在application.properties
文件中,
server.port=9090
server.context-path=/retrofitclientserver
此时访问我们的项目就要使用http://localhost:9090/retrofitclientserver
,端口号可以不指定,则会使用默认的端口号8080,为http://localhost:8080/retrofitclientserver
。
1.请求地址映射注解
请求地址映射注解可以加在类上,也可以加在方法上,加在类上表示这个类中所有响应请求的方法都是以该地址作为父路径。
1.1 @RequestMapping的属性
这是一个通用的注解,支持所有的HTTP请求。这里大致讲一下常用的属性。
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
value和path
value
和path
是都是指请求地址。@RequestMapping("/login")
等价于@RequestMapping(path="/login")
。
占位符
然后这两个属性还支持带占位符的URL,比如:
@RequestMapping(path = "/{account}", method = RequestMethod.GET)
public String getUser(@PathVariable String account)2
这是参数名跟占位符名字一致的情况,不一致的话就要这样写:
@RequestMapping(path = "/{account}/{name}", method = RequestMethod.GET)
public String getUser(@PathVariable("account") String phoneNumber,@PathVariable("name") String userName)
这样就把占位符绑定到参数phoneNumber
上了。
1.2 @PathVariable
这里出现了@PathVariable
,@Pathvariable
注解可以绑定占位符传过来的值到方法的参数上。
method
method属性是指请求的方式。
组合注解(RequestMapping的变形)
- @GetMapping = @RequestMapping(method = RequestMethod.GET)
- @PostMapping = @RequestMapping(method = RequestMethod.POST)
- @PutMapping = @RequestMapping(method = RequestMethod.PUT)
- @DeleteMapping = @RequestMapping(method = RequestMethod.DELETE)
组合注解是方法级别的,只能用在方法上,我们的实例基本都用组合注解。
1.3 @RequestParam
用法如下:
@PostMapping(value = "login")
public void login(@RequestParam String name, @RequestParam String password) {
System.out.println(name + ":" + password);
}
@RequestParam注解可以用来提取名为“name”的String类型的参数,并将之作为输入参数传入,这就是SpringMVC的提取和解析请求参数的能力。
我们甚至可以不用这个注解,也能只要传入参数名和方法的参数名一致,也能匹配:
@PostMapping(value = "login")
public void login(String name, @RequestParam String password) {
System.out.println(name + ":" + password);
}
这里的name
参数没有加这个注解,实际上也匹配到了。
如果传入参数名字和方法参数名字不一致,可以给@RequestParam
的属性赋值:
@PostMapping(value = "login")
public void login(@RequestParam("account") String name, @RequestParam String password) {
System.out.println(name + ":" + password);
}
1.4 @RequestBody
用法如下:
@PostMapping(path = "register")
public String registerUser(@RequestBody User user) {
return user.toString();
}
public class User {
private String name;
private String password;
省略get、set、toString...
}
@RequestBody
可以用来解析json字符串(还可以解析xml),并将字符串映射到对应的实体中,实体的字段名和json中的键名要对应。
注意提交请求的时候要在请求头指定content-type
为application/json charset=utf-8
。
1.5 @RequestHeader
@RequestHeader
注解用来将请求头的内容绑定到方法参数上。
用法如下:
@PostMapping(value = "login")
public void login(@RequestHeader("access_token") String accessToken,@RequestParam String name) {
System.out.println("accessToken:" + accessToken);
}
头内容:
1.6 @ResponseBody
@ResponseBody,一般是使用在单独的方法上的,需要哪个方法返回json数据格式,就在哪个方法上使用,具有针对性。
1.7 @RestController
@RestController,一般是使用在类上的,它表示的意思其实就是结合了@Controller和@ResponseBody两个注解。
1.7.1 @ResponseBody和@RestController两者区别
在使用springmvc框架的时候,在处理json的时候需要用到spring框架特有的注解@ResponseBody或者@RestController注解,这两个注解都会处理返回的数据格式,使用了该类型注解后返回的不再是视图,不会进行转跳,而是返回json或xml数据格式,输出在页面上。
那么,这两个注解在使用上有什么区别呢?
如果哪个类下的所有方法需要返回json数据格式的,就在哪个类上使用该注解,具有统一性;
需要注意的是,使用了@RestController注解之后,其本质相当于在该类的所有方法上都统一使用了@ResponseBody注解,所以该类下的所有方法都会返回json数据格式,输出在页面上,而不会再返回视图。
//@Controller
@RestController
public class UserController {
// @RequestMapping(value = "/u1",produces = "application/json;charset=utf-8") 第一种解决方式
@RequestMapping("/u1")
// @ResponseBody // 不会走视图解析器会直接返回一个字符串
public String test01() throws JsonProcessingException {
// jackson, ObjectMapper
ObjectMapper mapper = new ObjectMapper();
// 创建对象
User user = new User(1,"你好世界",29);
return mapper.writeValueAsString(user);
}
}