Spring MVC 的请求处理流程
文章插图
DispatcherServletDispatcherServlet继承结构
文章插图
DispatcherServlet对请求的处理流程大致步骤
- 绑定?些 Attribute
-
- WebApplicationContext / LocaleResolver / ThemeResolver
- 处理 Multipart
-
- 如果是,则将请求转为 MultipartHttpServletRequest
- Handler 处理
-
- 如果找到对应 Handler,执? Controller 及前后置处理器逻辑
- 处理返回的 Model ,呈现(render)视图
如何定义处理?法(即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-return-types
?法示例
文章插图
定义类型转换SpringBoot的默认实现【Spring MVC 的请求处理机制】在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实现)
- 配置 MultipartResolver