@Controller注解是开发中最常使用的注解,它的作用有两层含义:
- 告诉Spring,被该注解标注的类是一个Spring的Bean,需要被注入到Spring的上下文环境中。
- 该类里面所有被RequestMapping标注的注解都是HTTP服务端点。
@RestController相当于 @Controller+@ResponseBody。它有两层含义:
- 作为Controller的作用,将控制器类注入到Spring上下文环境,该类RequestMapping标注方法为HTTP服务端点。
- 作为ResponseBody的作用,请求响应默认使用的序列化方式是JSON,而不是跳转到jsp或模板页面。
@RequestMapping注解用于标注HTTP服务端点。它有很多属性,如:
- value: 应用请求端点,最核心的属性,用于标识请求处理方法的唯一性;
- method: HTTP协议的method类型, 如:GET、POST、PUT、DELETE等;
- consumes: HTTP协议请求内容的数据类型(Content-Type),例如application/json, text/html;
- produces: HTTP协议响应内容的数据类型。
- params: HTTP请求中必须包含某些参数值的时候,才允许被注解标注的方法处理请求。
- headers: HTTP请求中必须包含某些指定的header值,才允许被注解标注的方法处理请求。
示例:
@RequestMapping(value = "/article", method = POST)
@PostMapping(value = "/article")
上面代码中两种写法起到的是一样的效果,也就是PostMapping等同于@RequestMapping的method为POST的情况。同理:@GetMapping、@PutMapping、@DeleteMapping也都是简写的方式。
示例:
@RequestMapping(value = "/fun", method = RequestMethod.GET, consumes = {
"application/json",
"application/xml"
},produces = {
"application/json"
},headers = {
"content-type=text/plain",
"content-type=text/html",
})
public void fun(){
}
produces 和 consumes 属性来指定处理请求的提交内容类型(Content句pe)和返回的内容类型, 返回的类型必须是 request 请求头(Accept)中所包含的类型。
@RequestBody与@ResponseBody//注意并不要求@RequestBody与@ResponseBody成对使用
@ResponseBody
public AjaxResponse saveArticle(@RequestBody ArticleVO article)
说明:
-
@RequestBody 注解用于读取 Request 请求的 body 部分数据,使用系统默认配置的 HttpMessageConverter 进行解析,然后把相应的数据绑定到 Controller 方法的参数上。@RequestBody默认是使用JSON的格式
-
@ResponseBody修饰返回值,注解用于在HTTP的body中携带响应数据,默认是使用JSON的格式。如果不加该注解,spring响应字符串类型,是跳转到模板页面或jsp页面的开发模式。 @ResponseBody注解用于将 Controller方法返回的对象, 通过 HttpMessageConverter转换为指定格式后,写入到 Respons对象的 body数据区。@Responsebody注解将方法的返回结果直接 写入 Http 响应正文中,一般在异步获取数据时使用。在使用@RequestMapping 注解时, 返回值通常被解析为跳转路径,在加上@Responsebody 后返回结果就不会被解析为跳转 路径, 而是直接写入到 HTTP 响应正文中。
PathVariable用于URI上的{参数}。比如:请求URL为“/article/1”,那么将匹配DeleteMapping并且PathVariable接收参数id=1。 RequestParam用于接收普通表单方式或者ajax模拟表单提交的参数数据。
@DeleteMapping("/article/{id}")
@ResponseBody
public AjaxResponse deleteArticle(@PathVariable Long id) {
}
@PostMapping("/article")
@ResponseBody
public AjaxResponse deleteArticle(@RequestParam Long id) {
}
接收复杂嵌套对象参数:RequestParam和RequestBody的区别
表单数据提交用RequestParam就好了,为什么还要搞出来一个RequestBody注解呢?RequestBody注解能够使用对象或者嵌套对象接收前端数据。 上面的代码中paramData对象里面包含了一个bestFriend对象。这种数据结构使用RequestParam就无法接收了,RequestParam只能接收平面的、一对一的参数。像上文中这种数据结构的参数,就需要我们在java服务端定义两个类,一个类是ParamData,一个类是BestFriend。
public class ParamData {
private String name;
private int id;
private String phone;
private BestFriend bestFriend;
public static class BestFriend {
private String address;
private String sex;
}
//……getter/setter、默认构造方法
}
接下来就可以使用@RequestBody ParamData paramData
,一次性接收以上所有的复杂嵌套对象参数了,参数对象的所有属性都将被赋值。