@RequestMapping与@GetMapping和@PostMapping等注解的区别

目录

前置知识

大致区别

使用场景上的注意事项

如何工作

使用案例

写法对比


前置知识

  • HTTP请求方法一共有9种,为:GET、POST、HEAD、OPTIONS、PUT、PATCH、DELETE、TRACE、CONNECT
  • GET(获取资源) 本质就是发送一个请求来取得服务器上的某一资源;资源通过一组HTTP头和呈现数据(如HTML文本,或者图片或者视频等)返回给客户端;GET请求中,永远不会包含呈现数据;即GET请求只用来向服务器获取资源,而GET请求本身不应该携带任何呈现数据
  • POST(传输实体文本) 向指定资源提交数据进行处理请求;数据被包含在POST请求体中(例如提交表单或者上传文件);POST请求可能会导致新的资源的建立或已有资源的修改
  • MVC中,控制器的定义
  • 在Spring MVC中,控制器是指类或者类的方法上添加了@RequestMapping注解的类,并不是使用了@Controller注解的类就是控制器类
  • @Controller注解的类和@Component注解的类在功能上是一样的,都是在辅助@ComponentScan实现组件扫描
  • 只是在表意上,在用@Controller注解控制器类比用@Component注解控制器类更清楚一些

大致区别

SpringMVC以前版本的@RequestMapping,到了新版本被下面新注解替代,相当于增加的选项:

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping

从命名约定我们可以看到每个注解都是为了处理各自的传入请求方法类型,即@GetMapping用于处理请求方法的GET类型,@PostMapping用于处理请求方法的POST类型等

  • 如果我们想使用传统的@RequestMapping注解实现URL处理程序,那么它应该是这样的:
  • @RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
  • 新方法可以简化为:
  • @GetMapping("/get/{id}")
  • @RequestMapping是一个非常通用的注解,它可以应用于类和方法层面
  • 用于将任意HTTP请求映射到控制器方法上
  • @RequestMapping表示共享映射,如果没有指定请求方式,将接收所有的HTTP请求方式
  • 需要注意的是,大多数控制器方法都应该映射到一个特定的HTTP方法,而不是使用@RequestMapping共享映射
  • 当应用于类时,表示该类处理所有的请求;当应用于方法时,表示该方法处理特定的请求
  • 此外,@RequestMapping还可以用来指定请求的URL、HTTP方法等;例如:
  • 在上述代码中,handleRequest方法将处理所有发送到”/test”的HTTP GET请求
  • 在类的级别上的注解会将一个特定请求或者请求模式映射到一个控制器之上;之后你还可以另外添加方法级别的注解来进一步指定到处理方法的映射关系
  • @GetMapping是@RequestMapping的特化版本,专门用于处理HTTP GET请求
  • 用于将GET请求映射到控制器处理方法上;当客户端发送HTTP GET请求时,Spring Boot会自动将请求映射到具有相应URL路径的控制器方法上,然后调用该方法处理请求;在调用控制器方法之前,Spring Boot会执行一系列预处理操作,例如解析请求参数和验证请求头;在调用控制器方法之后,Spring Boot会执行一系列后处理操作,例如转换响应信息和生成响应头
  • @GetMapping是一个作为快捷方式的组合注解
  • 它在功能上等价于@RequestMapping(method = RequestMethod.GET)
  • 和@RequestMapping一样,@GetMapping也可以应用于类和方法层面
  • 例如:
  • 在上述代码中,home方法将处理所有发送到”/“的HTTP GET请求

使用场景上的注意事项

  • (1) 在前端method特指了get或post的时候分别使用@GetMapping和@PostMapping
  • (2)如果传的参数是@RequestBody,多参或者传对象的情况下使用@PostMappping这种注解
  • 因为@RequestBody是获取请求body中的数据,常用于搭配@PostMapping请求来提交对象数据

如何工作

  • 所有上述注解都已在内部注解了@RequestMapping以及方法元素中的相应值
  • 例如,如果我们查看@GetMapping注解的源代码,我们可以看到它已经通过以下方式使用RequestMethod.GET进行了注解:
  • 所有其他注解都以相同的方式创建,即@PostMapping使用RequestMethod.POST进行注解,@PutMapping使用RequestMethod.PUT进行注解等

使用案例

  • (案例1) 下面是结合RestController的简单使用:
  • (案例2) 下面是使用@Controller的代码:
  • 在上面的代码中,HomeController类充当请求控制器;它的homeInit()方法将处理所有传入的URI请求"/";它接受一个Model并返回视图home;使用配置的视图解析器解析视图名称”home“的页面
  • (案例3) 下面是一个同时在类和方法上应用了 @RequestMapping 注解的示例:
  • 如上述代码所示,到 /user/login 的请求会由 login() 方法来处理,而到 /user/register 的请求会由 register() 来处理
  • (案例4) 将控制器方法映射到一个特定的HTTP方法上,应用@GetMapping、@PostMapping:
  • 通常,这样代码更规范,因为login登录时只需要向服务器获取用户数据,register注册时需要向服务器提交数据
  • 组合注解对控制器方法的请求映射进行具体区分,减少了在应用程序上要配置的元数据,并且代码也更易读,有助于控制器对请求的快速匹配以及代码功能区分等
  • (案例5) 在下面的示例中,@RequestParam注解表示请求参数“name”的值将被注入到方法参数中
  • 当客户端发送HTTP GET请求“/api/hello?name=world”时,Spring Boot会自动将请求映射到hello()方法,并将参数“world”注入到方法参数中,最终返回字符串“Hello, world!”

写法对比

  • @RequestMapping:
  • @PostMapping: