SpringMVC常用注解及其介绍

感情迁移 提交于 2019-12-09 00:55:29

SpringMVC常用注解及其介绍

前言:在介绍SpringMVC常用注解之前,有兴趣的可以先了解一下SpringMVC的工作流程。SpringMVC工作流程详解

OK,接下来进入本次主题。
在实际项目中,我们最常用的几个注解,包括 @Controller、@RestController、 @RequestMapping、@PathVariable、@RequestParam 以及 @RequestBody,此次主要介绍下这几个注解常用的使用方式和特点。

1.@Controller

在SpringMVC中,controller主要负责处理前端控制器(DispatcherServlet )发过来的请求,经过业务逻辑层处理之后封装层一个model,并将其返回给view进行展示。@controller注解通常用于类上,如果结合Thymeleaf模板使用的话,会返回一个页面。如果是前后端分离的项目,则使用@RestController,表明返回的是json格式数据。

2.@RestController

在介绍RestController之前,我们先点进去看一下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    @AliasFor(
        annotation = Controller.class
    )
    String value() default "";
}

可以发现,@RestController注解里面包含了@Controller注解和@ResponseBody注解,@ResponseBody 注解是将返回的数据结构转换为 JSON 格式,所以说可以这么理解:@RestController = @Controller + @ResponseBody ,省了很多事,我们使用 @RestController 之后就不需要再使用 @Controller 了。

3.@RequestMapping

@RequestMapping 是一个用来处理请求地址映射的注解,它可以用于类上,也可以用于方法上。用于类上的注解会将一个特定请求或者请求模式映射到一个控制器之上,表示类中的所有响应请求的方法都是以该地址作为父路径;方法的级别上注解表示进一步指定到处理方法的映射关系。

该注解有6个属性,一般在项目中比较常用的有三个属性:value、method 和 produces。

value 属性:指定请求的实际地址,value 可以省略不写;
method 属性:指定请求的类型,主要有 GET、PUT、POST、DELETE,默认为 GET。
produces 属性:指定返回内容类型,如 produces = “application/json; charset=UTF-8”。

@RequestMapping 注解比较简单,举个例子:

@RestController
@RequestMapping(value = "/test", produces = "application/json; charset=UTF-8")
public class TestController {

    @RequestMapping(value = "/get", method = RequestMethod.GET)
    public String testGet() {
        return "success";
    }
}

这个很简单,启动项目在浏览器中输入 localhost:8080/test/get 测试一下即可。

四种不同的请求方式,都有相应的注解。不用每次在 @RequestMapping 注解中加 method 属性来指定,上面的 GET 方式请求可以直接使用 @GetMapping("/get") 注解,效果一样。相应地,PUT 方式、POST 方式和 DELETE 方式对应的注解分别为 @PutMapping、@PostMapping 和 DeleteMapping。

4.@PathVariable

@PathVariable 注解主要用来获取 URL 参数,Spring Boot 支持 Restfull 风格的 URL,比如一个 GET 请求携带一个参数 id,我们将 id 作为参数接收,可以使用 @PathVariable 注解。如下:

@GetMapping("/user/{id}")
public String testPathVariable(@PathVariable Integer id) {
    System.out.println("获取到的id为:" + id);
    return "success";
}

这里需要注意一个问题,如果想要 URL 中占位符中的 id 值直接赋值到参数 id 中,需要保证 URL 中的参数和方法接收参数一致,否则将无法接收。如果不一致的话,其实也可以解决,需要用 @PathVariable 中的 value 属性来指定对应关系。如下:

@RequestMapping("/user/{idd}")
public String testPathVariable(@PathVariable(value = "idd") Integer id) {
    System.out.println("获取到的id为:" + id);
    return "success";
}

对于访问的 URL,占位符的位置可以在任何位置,不一定非要在最后,比如这样也行:/xxx/{id}/user。另外,URL 也支持多个占位符,方法参数使用同样数量的参数来接收,原理和一个参数是一样的,例如:

@GetMapping("/user/{idd}/{name}")
    public String testPathVariable(@PathVariable(value = "idd") Integer id, @PathVariable String name) {
        System.out.println("获取到的id为:" + id);
        System.out.println("获取到的name为:" + name);
        return "success";
    }

运行项目,在浏览器中请求:localhost:8080/test/user/2/zhangsan, 可以看到控制台输出如下信息:
获取到的id为:2
获取到的name为:zhangsan

所以它支持多个参数的接收。同样地,如果 URL 中的参数和方法中的参数名称不同的话,也需要使用 value 属性来绑定两个参数。

5.@RequestParam

@RequestParam 注解顾名思义,也是获取请求参数的,上面我们介绍了 @PathValiable 注解也是获取请求参数的,那么 @RequestParam 和 @PathVariable 有什么不同呢?

  • @PathValiable 是从 URL 模板中获取参数值, 即这种风格的 URL:
http://localhost:8080/user/{id}  
  • @RequestParam 是从 Request 里获取参数值,即这种风格的 URL:
http://localhost:8080/user?id=1

对于@RequestParam 注解代码测试如下:

@GetMapping("/user")			//注意这里请求路径的写法是不一样的
public String testRequestParam(@RequestParam Integer id) {
    System.out.println("获取到的id为:" + id);
    return "success";
}

同样的@RequestParam 注解的value 属性是比较常用的,其作用和@PathVariable注解的value属性是一样的。此外@RequestParam 注解还有两个属性比较常用:

  1. required 属性:true 表示该参数必须要传,否则就会报 404 错误,false 表示可有可无。
  2. defaultValue 属性:默认值,表示请求中没有同名参数时的默认值。

从 URL 中可以看出,@RequestParam 注解用于 GET 请求上时,接收拼接在 URL 中的参数。除此之外,该注解还可以用于 POST 请求,接收前端表单提交的参数,假如前端通过表单提交 username 和 password 两个参数,那我们可以使用 @RequestParam 来接收,用法和上面一样。

6.@RequestBody

RequestBody 注解用于接收前端传来的实体,接收参数也是对应的实体,比如前端通过 JSON 提交传来两个参数 username 和 password,此时我们需要在后端封装一个实体来接收。在传递的参数比较多的情况下,使用 @RequestBody 接收会非常方便。例如:
定义User类代码此处省略…

@PostMapping("/user")
public String testRequestBody(@RequestBody User user) {
    System.out.println("获取到的username为:" + user.getUsername());
    System.out.println("获取到的password为:" + user.getPassword());
    return "success";
}

可以看出,@RequestBody 注解用于 POST 请求上,接收 JSON 实体参数。它和上面我们介绍的表单提交有点类似,只不过参数的格式不同,一个是 JSON 实体,一个是表单提交。在实际项目中根据具体场景和需要使用对应的注解即可。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!