Spring MVC核心注解详解:@RestController、统一响应结果Result对象与@RequestMapping
在Spring框架中,@Controller 和 @ResponseBody 是两个常用的注解,它们通常与Spring MVC一起使用来处理Web请求和响应。下面分别解释这两个注解以及它们通常与return语句一起使用时的作用。和一些其他注解以及(统一响应结果Result)和上一篇文章的补充
第一部分 @Controller
@Controller 注解是Spring MVC中的一个<核心注解>用于标记一个类,表明这个类是一个Spring MVC Controller处理器。这意味着这个类中的方法可以被用来处理通过Web请求映射到的操作。当Spring MVC接收到一个请求,并且该请求与控制器中某个方法上的 @RequestMapping(或其变体如 @GetMapping、 @PostMapping等)注解相匹配时,该方法就会被调用。并返回一个ModelAndView对象(或者通过其他方式返回一个视图名称和模型数据),Spring MVC会根据返回的视图名称和模型数据来渲染视图(如JSP页面)。
@Controller注解本身并不直接决定return语句返回什么。相反,它定义了方法的返回值类型和行为是如何被Spring MVC框架处理的。通常 @Controller注解的方法会返回一个字符串(表示视图名称)、ModelAndView对象(封装了视图名称和模型数据)、或者是一个对象(当与 @ResponseBody一起使用时)。
第二部分 @ResponseBody
@ResponseBody 注解用于将控制器的返回值绑定到Web响应体(Response Body)上。这通常用于返回JSON或XML等非HTML格式的响应数据。当 @ResponseBody注解被添加到控制器方法上时,Spring MVC会使用HttpMessageConverters将方法的返回值转换为相应的格式,并写入HTTP响应中。
与 @Controller不同, @ResponseBody直接影响了return语句的返回值。具体来说,当 @ResponseBody与 @Controller中的方法一起使用时,return语句可以返回一个对象(如POJO、DTO等),该对象随后会被序列化为JSON、XML等格式,并作为HTTP响应体返回给客户端。
@ResponseBody直接响应的意思
当 @ResponseBody
注解被用于Controller的方法上时,它告诉Spring MVC框架,该方法的返回值不是视图名称或ModelAndView对象,而是一个需要被写入到HTTP响应体中的对象。Spring MVC会使用配置的HttpMessageConverter来将返回的对象转换成客户端请求的格式(如JSON、XML等),并直接写入到HTTP响应体中。这样,客户端就可以直接接收到这些数据,而不是经过视图渲染的HTML页面。这种方式非常适合构建RESTful风格的Web服务。
第三部分 @RestController
@RestController
是 @Controller
和 @ResponseBody
的便捷组合注解。当你在一个类上使用了 @RestController
注解,那么这个类中的所有方法默认都会加上 @ResponseBody
注解,即每个方法的返回值都会自动地绑定到Web响应体中,并转换成JSON或XML等格式(具体取决于请求头Accept的内容)。这意味着,使用 @RestController
注解的类,主要用于构建RESTful Web服务,它返回的数据直接作为HTTP响应体返回给客户端,而不是解析为跳转路径或视图名称。
@RestController中包含了 @Controller和 @ResponseBody
@ResponseBody的作用是方法的返回值return返回值直接响应,如果返回值类型是 实体对象/集合,将会转换为Json格式来响应。
响应回 字符串:
响应回 实体对象:
响应回集合:
第四部分 @RequestMapping
@RequestMapping
是 Spring MVC 中用于处理 HTTP 请求的一个核心注解,用于将 HTTP 请求映射到具体的控制器方法上。它定义了哪些 URL 路径和 HTTP 方法应该被映射到哪些控制器方法。在 Spring MVC 应用启动时,Spring 容器会扫描这些注解,并构建一个请求映射表,该表将 URL 路径与控制器方法关联起来。
这个注解可以标注在类级别上,也可以标注在方法级别上。
4.1 类级别上的 @RequestMapping
当 @RequestMapping
标注在类上时,它定义了一个基础路径,这个基础路径会应用于该类中所有使用 @RequestMapping
(或子注解如 @GetMapping
、 @PostMapping
等)的方法上。例如:
解释
java复制代码
@Controller
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public String getUserById(@PathVariable("id") String id) {
// 处理逻辑
return "userDetails";
}
@PostMapping("/add")
public String addUser(User user) {
// 处理逻辑
return "redirect:/users";
}
}
在这个例子中,UserController
类上的 @RequestMapping("/users")
定义了一个基础路径 /users
。因此,getUserById
方法会处理 /users/{id}
的 GET 请求,而 addUser
方法会处理 /users/add
的 POST 请求。
4.2 方法级别上的 @RequestMapping
当 @RequestMapping
标注在方法上时,它直接指定了该方法处理的 HTTP 请求的 URL 路径和请求方法(可选)。例如:
解释
java复制代码
@Controller
public class WelcomeController {
@RequestMapping(value = "/welcome", method = RequestMethod.GET)
public String welcomePage() {
return "welcome";
}
}
在这个例子中,welcomePage
方法会处理 /welcome
的 GET 请求。
4.3 @RequestMapping
的子注解
为了简化 @RequestMapping
的使用,Spring 提供了几个特定 HTTP 方法的子注解,如 @GetMapping
、 @PostMapping
、 @PutMapping
、 @DeleteMapping
等。这些子注解在功能上等价于使用 @RequestMapping
并指定 method
属性,但更简洁易读。例如:
解释
java复制代码
@GetMapping("/users/{id}")
public String getUserById(@PathVariable("id") String id) {
// 处理逻辑
return "userDetails";
}
这与使用 @RequestMapping(value = "/users/{id}", method = RequestMethod.GET)
是等价的,但更加简洁。
第五部分 统一响应结果——Result
在Controller中每一个方法都是一个功能接口
在项目中的开发文档就是来描述这个功能接口的请求路径是什么、请求参数是什么、响应返回的数据是什么
但是!!:
返回响应的格式 各种各样不便管理 难以维护。
所以就有了——统一的响应结果(Result对象)
全部统一返回响应类型为Result (特别规范!!)
return时调用 Result中的静态方法success
不管什么类型都返回为json格式!!特别特别的规范~
第六部分 对上篇文章的 @HandlerMapping 补充
BS架构解析:Servlet、Spring MVC DispatcherServlet及Tomcat的工作流程
- @HandlerMapping:这实际上不是一个注解,而是一个接口。在 Spring MVC 中,
HandlerMapping
接口用于定义如何将请求映射到处理器(Handler)上。虽然你通常不会直接在代码中看到@HandlerMapping
注解(因为它根本不存在这样的注解),但你会看到 Spring MVC 框架内部使用了实现了HandlerMapping
接口的组件,如RequestMappingHandlerMapping
。这个组件在请求处理流程中负责查找与当前请求相匹配的处理器(即控制器中的方法)。 - 流程概述:
- 当 HTTP 请求到达时,
DispatcherServlet
作为前端控制器接收请求。 DispatcherServlet
查询一个或多个实现了HandlerMapping
接口的组件(如RequestMappingHandlerMapping
),以找到与请求 URL 相匹配的处理器(Handler)。RequestMappingHandlerMapping
(或其他HandlerMapping
实现)使用在启动时构建的请求映射表来查找与请求 URL 相匹配的@RequestMapping
注解所定义的控制器方法。- 如果找到了匹配的控制器方法,
DispatcherServlet
将调用该方法来处理请求。
越来越通透~!!!慢慢理清思路,特别是整个流程
还是勒句话嘿嘿“只要一直在跑,就肯定错不了~”
转载自:https://juejin.cn/post/7394790053141069859