您当前的位置: 首页 >  spring

梁云亮

暂无认证

  • 3浏览

    0关注

    1211博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

SpringMVC常用注解

梁云亮 发布时间:2020-05-24 15:12:49 ,浏览量:3

@Controller与@RestController

@Controller注解是开发中最常使用的注解,它的作用有两层含义:

  • 告诉Spring,被该注解标注的类是一个Spring的Bean,需要被注入到Spring的上下文环境中。
  • 该类里面所有被RequestMapping标注的注解都是HTTP服务端点。

@RestController相当于 @Controller+@ResponseBody。它有两层含义:

  • 作为Controller的作用,将控制器类注入到Spring上下文环境,该类RequestMapping标注方法为HTTP服务端点。
  • 作为ResponseBody的作用,请求响应默认使用的序列化方式是JSON,而不是跳转到jsp或模板页面。
@RequestMapping

@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 与@RequestParam

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,一次性接收以上所有的复杂嵌套对象参数了,参数对象的所有属性都将被赋值。

关注
打赏
1665409997
查看更多评论
立即登录/注册

微信扫码登录

0.1368s