【Web开发】Spring MVC 的请求处理机制

发布于:2022-11-07 ⋅ 阅读:(848) ⋅ 点赞:(0)

Spring MVC 的请求处理流程

在这里插入图片描述

DispatcherServlet

DispatcherServlet继承结构

在这里插入图片描述

DispatcherServlet对请求的处理流程

大致步骤

  • 绑定⼀些 Attribute

    • WebApplicationContext / LocaleResolver / ThemeResolver
  • 处理 Multipart

    • 如果是,则将请求转为 MultipartHttpServletRequest
  • Handler 处理

    • 如果找到对应 Handler,执⾏ Controller 及前后置处理器逻辑
  • 处理返回的 Model ,呈现(render)视图

具体可以参见DispatcherServlet#doService(…)和DispatcherServlet#doDispatch(…)方法

如何定义处理⽅法(即Handler方法)

定义映射关系

  • @Controller

  • @RequestMapping

    • value: 指定请求的实际地址, 比如 /action/info之类
    • method: 指定请求的method类型, GET、POST、PUT、DELETE等
    • consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
    • produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回
    • params: 指定request中必须包含某些参数值是,才让该方法处理
    • headers: 指定request中必须包含/不包含某些指定的header值,才能让该方法处理请求
  • @RestController
  • @GetMapping / @PostMapping / @PutMapping / @DeleteMapping / @PatchMapping

定义处理⽅法

  • @RequestBody / @ResponseBody / @ResponseStatus(用于改变HTTP响应的状态码)

  • @PathVariable / @RequestParam / @RequestHeader

    • 通过@PathVariable 可以将URL中占位符参数{xxx}绑定到处理器类的方法形参中@PathVariable(“xxx“)
    • @RequestParam标注在接口的方法参数上,被标注的参数的值来源于request.getParameter或request.getParameterValues
    • @RequestHeader注解,能够将请求头中的变量值映射到控制器的参数中。
  • HttpEntity / RequestEntity / ResponseEntity

    • HttpEntity表示http的request和resposne实体,它由消息头和消息体组成。从HttpEntity中可以获取http请求头和回应头,也可以获取http请求体和回应体信息。HttpEntity的典型应用是配合RestTemplate。

详细参数

https://docs.spring.io/spring-framework/docs/5.1.5.RELEASE/spring-framework-reference/web.html#mvc-ann-arguments

详细返回

https://docs.spring.io/spring-framework/docs/5.1.5.RELEASE/spring-framework-reference/web.html#mvc-ann-return-types

⽅法示例

在这里插入图片描述

定义类型转换

SpringBoot的默认实现

WebMvcAutoConfiguration的内部类WebMvcAutoConfigurationAdapter中实现了重写WebMvcConfigurer接口这样一个方法。

addFormatters方法用于添加默认的{@link Converter Converter}和{@link Formatter Formatters}到注册中心。

在这里插入图片描述

ApplicationConversionService#addBeans(…)方法

在这里插入图片描述

Converter和Formatter的异同

两者的作用一样,都是类型转换。

org.springframework.format.Formatter只能做String类型到其他类型的转换。

org.springframework.core.convert.converter.Converter可以做任意类型的转换。

⾃⼰实现 WebMvcConfigurer

  • 添加⾃定义的 Converter
  • 添加⾃定义的 Formatter

在这里插入图片描述

定义校验

  • 通过 Validator 对绑定结果进⾏校验

    • Hibernate Validator
  • @Valid@Validated注解 及自定义注解校验
  • BindingResult (对于不希望Spring MVC来介入我的Valid失败后的操作,可以通过BindingResult实现)

Multipart 上传

  • 配置 MultipartResolver
    • Spring Boot ⾃动配置 MultipartAutoConfiguration
  • ⽀持类型 multipart/form-data
  • MultipartFile 类型

在这里插入图片描述

一些误区/注意点

@RequestParam注解能读取请求体里的内容吗?

@RequestParam:In Spring MVC, “request parameters” map to query parameters, form data, and parts in multipart requests.

有时候我们只想取出请求body里面的部分内容,但@RequstBody注解是把整个请求的Body传给参数,而RequestParam是可以把Body里的对应部分取出来传给参数。

controller里面可以实现传多个对象么? 比如:hello(Student student, Teacher teacher)

注意:@RequestBody只能将一个请求报文体转成一个复杂对象。

  1. 将多个对象合成一个中间复杂对象,之后再拆开。
  2. 通过 Map 或者Jackson 的 ObjectNode
  3. 自定义注解,并将它注册到 Spring MVC
本文含有隐藏内容,请 开通VIP 后查看