SpringMVC常用注解总结

越学越乱,哎,根据用到的,按照用的顺序总结下吧

首先放在最上面的就是@Controller用于声明这是个SpringBean

类与方法上

@Controller

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

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

和@Controller的作用类似的就是这个@RestController了

例如:

@Controller
public class UserController {
    
    
	......
}

@ResponseBody

@ResponseBody修饰返回值,注解用于在HTTP的body中携带响应数据,默认是使用JSON的格式。如果不加该注解,spring响应字符串类型,是跳转到模板页面或jsp页面的开发模式。

@ResponseBody用于将 Controller方法返回的对象, 通过HttpMessageConverter转换为指定格式后,写入到 Respons对象的 body数据区。

@Responsebody注解将方法的返回结果直接 写入 Http 响应正文中,一般在异步获取数据时使用。在使用@RequestMapping 注解时, 返回值通常被解析为跳转路径,在加上@Responsebody 后返回结果就不会被解析为跳转 路径, 而是直接写入到 HTTP 响应正文中。

@RequestMapping:

@RequestMapping作用:该注解的作用就是设置当前控制器方法请求访问路径,如果设置在类上统一设置当前控制器方法请求访问路径前缀

属性:

参数 说明
method 是让你指定请求的method的类型,比如常用的有get和post。
value 是指请求的实际地址,如果是多个地址就用{}来指定就可以啦。
produces 指定返回的内容类型,当request请求头中的Accept类型中包含指定的类型才可以返回的。
consumes 指定处理请求的提交内容类型,比如一些json、html、text等的类型。
headers 指定request中必须包含那些的headed值时,它才会用该方法处理请求的。
params 指定request中一定要有的参数值,它才会使用该方法处理请求。

例如下面用法:

  • 类上方配置的请求映射与方法上面配置的请求映射连接在一起,形成完整的请求映射路径:/user/save
@Controller
//类上方配置的请求映射与方法上面配置的请求映射连接在一起,形成完整的请求映射路径
@RequestMapping("/user")
public class UserController {
    
    
    //请求路径映射
    @RequestMapping("/save") //此时save方法的访问路径是:/user/save
    public String save(){
    
    
		......
    }
}

小案例

上面三个注解的综合应用如下所示:

//定义表现层控制器bean
@Controller
@RequestMapping("/user")
public class UserController {
    
    
    //设置映射路径为/save,即外部访问路径
    @RequestMapping("/save")
    //设置当前操作返回结果为指定json数据(本质上是一个字符串信息)
    @ResponseBody
    public String save(){
    
    
        System.out.println("user save ...");
        return "{'info':'springmvc'}";
    }
}

我们请求:/user/save,就能返回{'info':'springmvc'}的json格式数据

@PostMapping…

method参数中可以配置其他的请求方式例如

@RequestMapping(value = "/user", method = POST)

另外:还有其他四个Mapping注解可以直接说明请求方式,例如post

@PostMapping(value = "/user")

上面代码中两种写法起到的是一样的效果,也就是PostMapping等同于@RequestMapping的method为POST的情况。

同理:@GetMapping、@PutMapping、@DeleteMapping也都是简写的方式。

@PostMapping
@GetMapping
@PutMapping
@DeleteMapping

这个在RESTful风格中应用较多,以后再讲

@RestController

@RestController相当于 @Controller+@ResponseBody。

它有两个作用:

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

(现在项目都是前后端分离了,除了一些特定需求,也基本不用返回页面了,所以一般就用 @RestController 替换 @Controller+@ResponseBody 了,方便)

将上面案例改造一下,就可以写成:

//定义表现层控制器bean,设置当前操作返回结果为指定json数据(本质上是一个字符串信息)
//使用@RestController注解替换@Controller与@ResponseBody注解,简化书写
@ResponseBody
@RequestMapping("/user")
public class UserController {
    
    
    //设置映射路径为/save,即外部访问路径
    @RequestMapping("/save")
    public String save(){
    
    
        System.out.println("user save ...");
        return "{'info':'springmvc'}";
    }
}

参数上

@RequestParam:

作用:是将请求参数绑定到你的控制器的方法参数上,是Spring MVC中的接收普通参数的注解。

属性:

参数 说明
value 请求参数中的名称。
required 请求参数是否必须提供参数,它的默认是true,意思是表示必须提供。

例如下面代码:

//普通参数:请求参数名与形参名不同时,使用@RequestParam注解关联请求参数名称与形参名称之间的关系
@RequestMapping("/userinfo")
@ResponseBody
public String commonParamDifferentName(@RequestParam("name") String userName){
    
    
    System.out.println("普通参数传递 userName ==> "+userName);
    return "{'module':'sanme param different name'}";
}

这样请求中的name参数就能接收到userName字符串对象中了,下面再用就用userName就行。

PS:当然,如果你接收的对象名与传入参数的名相同,他能自动封装,不用写这个(或者请求参数key的名称和POJO中属性的名称一致,也能进行封装)

@RequestBody:

@RequestBody作用:用于读取 Request 请求的 body 部分数据,使用系统默认配置的 HttpMessageConverter 进行解析,然后把相应的数据绑定到 Controller 方法的参数上。@RequestBody默认是使用JSON的格式

属性:required,是否必须有请求体。它的默认值是true,在使用该注解时,值得注意的当为true时

例如下面请求与代码:
在这里插入图片描述

//POJO参数:json格式
//使用@RequestBody注解将外部传递的json数据映射到形参的实体类对象中,要求属性名称一一对应
@RequestMapping("/user")
@ResponseBody
public String pojoParamForJson(@RequestBody User user){
    
    
    System.out.println("pojo(json)参数传递 user ==> "+user);
    return "{'module':'pojo for json param'}";
}

这样就能接收到json类型的参数并且转化为相应的POJO

那么我们之前不是用了 @RequestParam接收参数吗,为什么还来个body?

这是因为在发展后期,也就是现在的前后端分离开发中,发送json格式数据为主,@RequestBody应用较广,下面我们来区分一下这两个大兄弟

@RequestBody与@RequestParam区别

区别

  • @RequestParam用于接收url地址传参,表单传参【application/x-www-form-urlencoded】
  • @RequestBody用于接收json数据【application/json】

应用

  • 前后端分离开发中,发送json格式数据为主,@RequestBody应用较广
  • 如果发送非json格式数据,选用@RequestParam接收请求参数

@DateTimeFormat

例如下面传的日期类型数据,基于系统不同格式也不尽相同

2058-08-18
2058/08/18
08/18/2058

那么我们怎么接收呢?接收后怎么处理成统一格式呢?

这就要用到我们的@DateTimeFormat注解,作用:接收形参时,根据不同的日期格式设置不同的接收方式,简单来说就是可以设定日期时间型数据格式

例如下面请求与代码示例:

http://localhost:80/dataParam?date=2058/08/08&date1=2058-08-18&date2=2058/08/28 8:08:08

controller代码如下:

//使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd
@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date,
                  @DateTimeFormat(pattern="yyyy-MM-dd") Date date1,
                  @DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2){
    
    
    System.out.println("参数传递 date ==> "+date);
    System.out.println("参数传递 date1(yyyy-MM-dd) ==> "+date1);
    System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);
    return "{'module':'data param'}";
}

打印出来默认是的yyyy/MM/dd格式,其他均是设定的格式

@PathVaribale:

作用:作用:绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应。

在这里插入图片描述

它是Spring MVC支持的REST风格url的一个重要的标志。

@RequestBody、@RequestParam、@PathVariable区别和应用

区别

  • @RequestParam用于接收url地址传参或表单传参
  • @RequestBody用于接收json数据
  • @PathVariable用于接收路径参数,使用{参数名称}描述路径参数

应用

  • 后期开发中,发送请求参数超过1个时,以json格式为主,@RequestBody应用较广
  • 如果发送非json格式数据,选用@RequestParam接收请求参数
  • 采用RESTful进行开发,当参数数量较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值

猜你喜欢

转载自blog.csdn.net/weixin_45525272/article/details/126071472