您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

Spring MVC 的请求处理机制

时间:2022-11-08 13:51:09  来源:今日头条  作者:刷刷的破壳日记

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


Tags:Spring MVC   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
玩转Spring MVC自定义请求匹配规则
在本文中,介绍了如何自定义RequestMappingHandlerMapping。通过自定义getCustomMethodCondition()方法,我们可以根据特定的需求扩展HandlerMapping的行为,并使用自定义条件来匹...【详细内容】
2023-12-06  Search: Spring MVC  点击:(205)  评论:(0)  加入收藏
Spring MVC的工作流程
1. 用户发送请求至前端控制器DispatcherServlet2. DispatcherServlet收到请求后,调用HandlerMapping处理器映射器3. 处理器映射器找到具体的处理器(可以根据xml配置、注解进行...【详细内容】
2023-11-02  Search: Spring MVC  点击:(269)  评论:(0)  加入收藏
Spring MVC工作流程,你学会了吗?
一、需求开发过程需求:前端浏览器请求url: http://localhost:8080/demo/handle01,前端⻚面显示后台服务器的时间开发过程1)配置DispatcherServlet前端控制器2)开发处理具体业务逻...【详细内容】
2023-05-06  Search: Spring MVC  点击:(354)  评论:(0)  加入收藏
Spring MVC核心功能异常处理机制原理详解
如果在请求映射期间发生异常或从请求处理程序(例如@Controller)抛出异常,DispatcherServlet将委托给HandlerExceptionResolver bean链来解决异常并提供替代处理,这通常是一个...【详细内容】
2023-02-23  Search: Spring MVC  点击:(123)  评论:(0)  加入收藏
Spring MVC 的请求处理机制
Spring MVC 的请求处理流程 DispatcherServletDispatcherServlet继承结构 DispatcherServlet对请求的处理流程大致步骤 绑定⼀些 Attribute WebApplicationContext / Loc...【详细内容】
2022-11-08  Search: Spring MVC  点击:(292)  评论:(0)  加入收藏
简单配置spring mvc,防止xss注入
1.针对url传参或form表单传参@InitBinderpublic void initBinder(final WebDataBinder webdataBinder) { //去除首尾空格 webdataBinder.registerCustomEditor(String...【详细内容】
2022-06-24  Search: Spring MVC  点击:(502)  评论:(0)  加入收藏
请简述Spring MVC的执行流程
今天我给大家介绍一下Spring MVC的详细执行流程。我把Spring MVC的执行流程划分为三个阶段,配置阶段、初始化阶段和运行阶段。 我整理了一张完整的执行流程图,需要高清图的小...【详细内容】
2022-04-20  Search: Spring MVC  点击:(321)  评论:(0)  加入收藏
手撸了一个 Spring MVC 框架
想要了解Spring MVC框架的原理,探究框架是如何设计的,不错的学习方式是阅读源码,然后自己手写一个框架。本文带领大家简化的手写一个Spring MVC框架。Spring框架对于Java后端程...【详细内容】
2021-09-22  Search: Spring MVC  点击:(234)  评论:(0)  加入收藏
Spring MVC 框架搭建配置方法及详解
现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了...【详细内容】
2021-05-27  Search: Spring MVC  点击:(438)  评论:(0)  加入收藏
还搞不清Spring 与 Spring MVC 容器之间的关系?
在使用Spring MVC的时候,标准的配置是如下这样的: 注意注意:小编整理了一份Spring全家桶笔记:Spring+Spring Boot+Spring Cloud+Spring MVC,有需要的朋友可以私信“spring”免费...【详细内容】
2021-04-13  Search: Spring MVC  点击:(452)  评论:(0)  加入收藏
▌简易百科推荐
Qt与Flutter:在跨平台UI框架中哪个更受欢迎?
在跨平台UI框架领域,Qt和Flutter是两个备受瞩目的选择。它们各自具有独特的优势,也各自有着广泛的应用场景。本文将对Qt和Flutter进行详细的比较,以探讨在跨平台UI框架中哪个更...【详细内容】
2024-04-12  刘长伟    Tags:UI框架   点击:(1)  评论:(0)  加入收藏
Web Components实践:如何搭建一个框架无关的AI组件库
一、让人又爱又恨的Web ComponentsWeb Components是一种用于构建可重用的Web元素的技术。它允许开发者创建自定义的HTML元素,这些元素可以在不同的Web应用程序中重复使用,并且...【详细内容】
2024-04-03  京东云开发者    Tags:Web Components   点击:(8)  评论:(0)  加入收藏
Kubernetes 集群 CPU 使用率只有 13% :这下大家该知道如何省钱了
作者 | THE STACK译者 | 刘雅梦策划 | Tina根据 CAST AI 对 4000 个 Kubernetes 集群的分析,Kubernetes 集群通常只使用 13% 的 CPU 和平均 20% 的内存,这表明存在严重的过度...【详细内容】
2024-03-08  InfoQ    Tags:Kubernetes   点击:(19)  评论:(0)  加入收藏
Spring Security:保障应用安全的利器
SpringSecurity作为一个功能强大的安全框架,为Java应用程序提供了全面的安全保障,包括认证、授权、防护和集成等方面。本文将介绍SpringSecurity在这些方面的特性和优势,以及它...【详细内容】
2024-02-27  风舞凋零叶    Tags:Spring Security   点击:(55)  评论:(0)  加入收藏
五大跨平台桌面应用开发框架:Electron、Tauri、Flutter等
一、什么是跨平台桌面应用开发框架跨平台桌面应用开发框架是一种工具或框架,它允许开发者使用一种统一的代码库或语言来创建能够在多个操作系统上运行的桌面应用程序。传统上...【详细内容】
2024-02-26  贝格前端工场    Tags:框架   点击:(47)  评论:(0)  加入收藏
Spring Security权限控制框架使用指南
在常用的后台管理系统中,通常都会有访问权限控制的需求,用于限制不同人员对于接口的访问能力,如果用户不具备指定的权限,则不能访问某些接口。本文将用 waynboot-mall 项目举例...【详细内容】
2024-02-19  程序员wayn  微信公众号  Tags:Spring   点击:(39)  评论:(0)  加入收藏
开发者的Kubernetes懒人指南
你可以将本文作为开发者快速了解 Kubernetes 的指南。从基础知识到更高级的主题,如 Helm Chart,以及所有这些如何影响你作为开发者。译自Kubernetes for Lazy Developers。作...【详细内容】
2024-02-01  云云众生s  微信公众号  Tags:Kubernetes   点击:(51)  评论:(0)  加入收藏
链世界:一种简单而有效的人类行为Agent模型强化学习框架
强化学习是一种机器学习的方法,它通过让智能体(Agent)与环境交互,从而学习如何选择最优的行动来最大化累积的奖励。强化学习在许多领域都有广泛的应用,例如游戏、机器人、自动驾...【详细内容】
2024-01-30  大噬元兽  微信公众号  Tags:框架   点击:(68)  评论:(0)  加入收藏
Spring实现Kafka重试Topic,真的太香了
概述Kafka的强大功能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条消息的值。可以自动或手动增加该值。如果我们由于错误而无法处理消息并想重...【详细内容】
2024-01-26  HELLO程序员  微信公众号  Tags:Spring   点击:(88)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19   Java中文社群  微信公众号  Tags:SpringBoot   点击:(86)  评论:(0)  加入收藏
站内最新
站内热门
站内头条