likes
comments
collection
share

Spring MVC核心注解详解:@RestController、统一响应结果Result对象与@RequestMapping

作者站长头像
站长
· 阅读数 16

在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响应体返回给客户端,而不是解析为跳转路径或视图名称。

Spring MVC核心注解详解:@RestController、统一响应结果Result对象与@RequestMapping

@RestController中包含了 @Controller@ResponseBody

Spring MVC核心注解详解:@RestController、统一响应结果Result对象与@RequestMapping

@ResponseBody的作用是方法的返回值return返回值直接响应,如果返回值类型是 实体对象/集合,将会转换为Json格式来响应。

响应回 字符串:

Spring MVC核心注解详解:@RestController、统一响应结果Result对象与@RequestMapping

Spring MVC核心注解详解:@RestController、统一响应结果Result对象与@RequestMapping

响应回 实体对象:

Spring MVC核心注解详解:@RestController、统一响应结果Result对象与@RequestMapping

Spring MVC核心注解详解:@RestController、统一响应结果Result对象与@RequestMapping

响应回集合:

Spring MVC核心注解详解:@RestController、统一响应结果Result对象与@RequestMapping

Spring MVC核心注解详解:@RestController、统一响应结果Result对象与@RequestMapping

第四部分 @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中每一个方法都是一个功能接口

在项目中的开发文档就是来描述这个功能接口的请求路径是什么、请求参数是什么、响应返回的数据是什么

但是!!:

Spring MVC核心注解详解:@RestController、统一响应结果Result对象与@RequestMapping

返回响应的格式 各种各样不便管理 难以维护。

所以就有了——统一的响应结果(Result对象)

Spring MVC核心注解详解:@RestController、统一响应结果Result对象与@RequestMapping

Spring MVC核心注解详解:@RestController、统一响应结果Result对象与@RequestMapping

全部统一返回响应类型为Result (特别规范!!)

return时调用 Result中的静态方法success

Spring MVC核心注解详解:@RestController、统一响应结果Result对象与@RequestMapping

不管什么类型都返回为json格式!!特别特别的规范~

Spring MVC核心注解详解:@RestController、统一响应结果Result对象与@RequestMapping

Spring MVC核心注解详解:@RestController、统一响应结果Result对象与@RequestMapping

Spring MVC核心注解详解:@RestController、统一响应结果Result对象与@RequestMapping

Spring MVC核心注解详解:@RestController、统一响应结果Result对象与@RequestMapping

第六部分 对上篇文章的 @HandlerMapping 补充

BS架构解析:Servlet、Spring MVC DispatcherServlet及Tomcat的工作流程

  • @HandlerMapping:这实际上不是一个注解,而是一个接口。在 Spring MVC 中,HandlerMapping 接口用于定义如何将请求映射到处理器(Handler)上。虽然你通常不会直接在代码中看到 @HandlerMapping 注解(因为它根本不存在这样的注解),但你会看到 Spring MVC 框架内部使用了实现了 HandlerMapping 接口的组件,如 RequestMappingHandlerMapping。这个组件在请求处理流程中负责查找与当前请求相匹配的处理器(即控制器中的方法)。
  • 流程概述
  1. 当 HTTP 请求到达时,DispatcherServlet 作为前端控制器接收请求。
  2. DispatcherServlet 查询一个或多个实现了 HandlerMapping 接口的组件(如 RequestMappingHandlerMapping),以找到与请求 URL 相匹配的处理器(Handler)。
  3. RequestMappingHandlerMapping(或其他 HandlerMapping 实现)使用在启动时构建的请求映射表来查找与请求 URL 相匹配的 @RequestMapping 注解所定义的控制器方法。
  4. 如果找到了匹配的控制器方法,DispatcherServlet 将调用该方法来处理请求。

越来越通透~!!!慢慢理清思路,特别是整个流程

还是勒句话嘿嘿“只要一直在跑,就肯定错不了~”

转载自:https://juejin.cn/post/7394790053141069859
评论
请登录