【SpringBoot 2】(七)请求处理——映射 常用注解 方法参数的小技巧(一)

简介: 【SpringBoot 2】(七)请求处理——映射 常用注解 方法参数的小技巧(一)

1 请求映射

 在SpringBoot中使用@XxxMapping注解完成前端请求与后端方法的一个映射。以前的时候,通常使用url映射命名的方式完成增删改查的操作,比如:/getUser 查找用户/deleteUser 删除用户 /editUser更改用户 /saveUser 添加用户。但是,后来出现了Rest风格的请求方式一直沿用至今。


1.1 Rest风格

 Rest风格就是使用HTTP请求方式动词来表示对资源的增删改查等操作,比如:GET查找用户DELETE删除用户PUT更改用户 POST添加用户。具体使用如下:image.png

 但是前端form表单的method只有POST、GET两种方法,如何使用PUT、DELETE两种方法呢?这就使用到了HiddenHttpMethodFilter,在源码的WebMvcAutoConfiguration自动配置类中使用OrderedHiddenHttpMethodFilter方法(方法源码在下面),其中返回它同名类对象,该类向上两层的父类HiddenHttpMethodFilter中定义了如何使用PUT、DELETE两种方法(源码见下面图片)


@Bean
@ConditionalOnMissingBean({HiddenHttpMethodFilter.class})
// 这里的隐藏方法过滤器默认是不开启的,通过下面的prefix和name即可在配置文件将其配置为true
@ConditionalOnProperty(
    prefix = "spring.mvc.hiddenmethod.filter",
    name = {"enabled"}
)
public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {
    return new OrderedHiddenHttpMethodFilter();
}

image.png

 了解源码的规范之后,让我们试着进行编码,总结上述文字得知:若想使用Rest风格的请求,需要进行两步操作①配置文件中开启隐藏方法过滤器(据说高版本的SpringBoot源码中默认是开启的)②form表单的method为POST并加入_method的值为相应的PUT、DELETE

image.png


1.2 表单提交Rest的原理

 表单在使用Rest风格的请求方式提交的时候,会带上input标签里_method的对应值PUT、DELETE,当请求发送过来的时候将会被HiddenHttpMethodFilter所拦截进行判断(form表单的method是否为POST且无报错),判断通过之后获取_method对应的值。原生request(post)的包装模式xxxWrapper重写了getMethod方法,返回的是_method传入的值。后面的controller方法中url映射的method的值就是经过方法重写之后获得的传入值。


⚠  像form表单的method只有POST、GET两个值的情况需要将配置文件中的隐藏方法过滤器开启,别的如PostMan直接发送Put、delete等方式请求就无需使用HiddenHttpMethodFilter

⚠  根据四种配置演变出的四个新注解⚠  自定义_method名称的方法:自定义一个webConfig类类中来创建一个HiddenHttpMethodFilter方法,调用它的setMethodFilter方法即可实现定制


1.3请求映射的原理

 SpringBoot和SpringMVC一样,前端发送的所有请求都一定会到DispatcherServlet中,而DispatcherServlet本身就是一个servlet继承自HttpServlet。一个servlet必定会重写doGet和doPost方法,于是通过对源码进行分析发现在HttpServlet的子类FrameworkServlet(它同时也是DispatcherServlet的父类)中重写了doGet和doPost方法,并且重写之后的doXxx方法都是调用了本类的processRequest方法,这个方法的底层又调用了本类的doService抽象方法,抽象方法没有方法体,继承该类的子类必须重写该方法,于是乎在它的子类中找到了重写之后的doService方法,这个方法中除了前面一大堆的初始化之外调用本类的doDispatch方法(这个才是最重要的一个方法)image.png

 从上文的析得知,SpringMVC的功能都要从DispatcherServlet类的doDispatch方法中分析得出,此方法使用getHandler(processedRequest)有参构造器里的对获取到的所有请求使用for循环逐个匹配下面的handlerMappings,而前两个都是在WebMvcAutoConfiguration自动配置类中配置过的。

image.png


⚠  拓展知识:如果一些特殊场景需要对不同的请求映射不同的代码包,比如普通用户和VIP用户的功能肯定是不一样的,所以在此时我们就可以借助给容器中注册自定义HandlerMapping的方式来完成。


2 请求处理常用注解

 以下的注解都可以通过键名获取单个键的值,也可以使用map集合(kv都是必须String)获取所有的参数


2.1 @RequestParam

 @RequestParam注解用来获取请求参数的值

image.png

2.2 @PathVariable

 在Restful请求风格中,通常使用路径的方式进行参数的传递,@PathVariable注解就是用来获取url路径中参数的值

image.png

2.3 @RequestHeader

 @RequestHeader注解用来获取请求头的值

image.png

相关文章
|
5月前
|
缓存 监控 Java
SpringBoot @Scheduled 注解详解
使用`@Scheduled`注解实现方法周期性执行,支持固定间隔、延迟或Cron表达式触发,基于Spring Task,适用于日志清理、数据同步等定时任务场景。需启用`@EnableScheduling`,注意线程阻塞与分布式重复问题,推荐结合`@Async`异步处理,提升任务调度效率。
879 128
|
4月前
|
XML JSON Java
【SpringBoot(三)】从请求到响应再到视图解析与模板引擎,本文带你领悟SpringBoot请求接收全流程!
Springboot专栏第三章,从请求的接收到视图解析,再到thymeleaf模板引擎的使用! 本文带你领悟SpringBoot请求接收到渲染的使用全流程!
387 3
|
4月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
570 2
|
5月前
|
XML Java 数据格式
常用SpringBoot注解汇总与用法说明
这些注解的使用和组合是Spring Boot快速开发和微服务实现的基础,通过它们,可以有效地指导Spring容器进行类发现、自动装配、配置、代理和管理等核心功能。开发者应当根据项目实际需求,运用这些注解来优化代码结构和服务逻辑。
427 12
|
5月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
309 0
探索Spring Boot的@Conditional注解的上下文配置
|
7月前
|
前端开发 Java 数据库连接
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
|
5月前
|
Java 测试技术 编译器
@GrpcService使用注解在 Spring Boot 中开始使用 gRPC
本文介绍了如何在Spring Boot应用中集成gRPC框架,使用`@GrpcService`注解实现高效、可扩展的服务间通信。内容涵盖gRPC与Protocol Buffers的原理、环境配置、服务定义与实现、测试方法等,帮助开发者快速构建高性能的微服务系统。
1115 0
|
9月前
|
人工智能 前端开发 JavaScript
SpringBoot实现网页消息推送的5种方法
本文详细介绍了在SpringBoot中实现网页消息推送的几种主流方案,包括短轮询、长轮询、SSE(Server-Sent Events)、WebSocket以及STOMP。每种方案各有优缺点,适用于不同的场景需求。短轮询简单易实现但效率低;长轮询提升了实时性但仍有限制;SSE适合单向通信且轻量高效;WebSocket支持全双工通信,适合高实时性要求的场景;STOMP基于WebSocket,提供更高级的消息传递功能。通过对比分析,开发者可根据业务需求、性能要求及浏览器兼容性选择最适合的技术方案,同时可结合多种技术实现优雅降级,优化用户体验。
1795 57
|
10月前
|
缓存 安全 Java
深入解析HTTP请求方法:Spring Boot实战与最佳实践
这篇博客结合了HTTP规范、Spring Boot实现和实际工程经验,通过代码示例、对比表格和架构图等方式,系统性地讲解了不同HTTP方法的应用场景和最佳实践。
971 5
|
Java API Spring
Spring容器如何使用一个注解来指定一个类型为配置类型
Spring容器如何使用一个注解来指定一个类型为配置类型
222 0