SpringBoot2:请求处理原理分析-常用接口方法参数整理

news2024/9/20 0:20:39

文章目录

    • 1、常用的原生API参数
    • 2、一些自带的复杂参数
    • 3、自定义Bean参数
    • 4、自定义参数转换服务
    • 5、总结

1、常用的原生API参数

作用说明:在接口方法参数放入一些原生API作为参数使用。

案例:
接口收参形式:

    @RequestMapping("/test")
    public void test(HttpServletRequest request,
                       HttpServletResponse response,
                       ServletRequest sreq,
                       WebRequest webRequest,
                       MultipartRequest mrequest,
                       Reader reader,
                       HttpSession session,
                       PushBuilder pushBuilder,
                       Principal principal,
                       InputStream inputStream,
                       HttpMethod method,
                       Locale locale,
                       TimeZone timeZone,
                       ZoneId zoneId) {
    }

请求传参形式:
在这里插入图片描述
注意

MultipartRequest mrequest,
Reader reader,		这个参数,我暂时没找到用postman如何传值

这两个参数,必须要传入对应的实参值,否则接口报错。

对应的参数解析器:org.springframework.web.servlet.mvc.method.annotation.ServletRequestMethodArgumentResolver#supportsParameter
在这里插入图片描述
返回结果:
空字符串

2、一些自带的复杂参数

Map、Model(map、model里面的数据会被放在request的请求域 request.setAttribute)、Errors/BindingResult、RedirectAttributes( 重定向携带数据)、ServletResponse(response)、SessionStatus、UriComponentsBuilder、ServletUriComponentsBuilder

这里,我不在一个个的测试,大家可以自己在接口方法处写上这些参数,然后,debug,查看对应的参数解析器原理即可。

这里,我重点说明一下Map、Model的作用。
在接口方法参数设置Map、Model之后,如果我们的接口做转发处理,那么,对应的参数设置在Map、Model内,会自动代入转发后的接口的request对象中,从而,通过request对象获取新设置的参数值。

案例:
接口收参形式:
转发接口

    @GetMapping("/params")
    public String testParam(Map<String,Object> map,
                            Model model,
                            HttpServletRequest request,
                            HttpServletResponse response){
        map.put("hello","world666");
        model.addAttribute("world","hello666");
        request.setAttribute("message","HelloWorld");

        Cookie cookie = new Cookie("c1","v1");
        response.addCookie(cookie);
        return "forward:/success";
    }

目标接口

    @ResponseBody
    @GetMapping("/success")
    public Map success(@RequestAttribute(value = "msg",required = false) String msg,
                       @RequestAttribute(value = "code",required = false)Integer code,
                       HttpServletRequest request){
        Object msg1 = request.getAttribute("msg");

        Map<String,Object> map = new HashMap<>();
        Object hello = request.getAttribute("hello");
        Object world = request.getAttribute("world");
        Object message = request.getAttribute("message");
        Object content = request.getAttribute("content");

        map.put("reqMethod_msg",msg1);
        map.put("annotation_msg",msg);
        map.put("hello",hello);
        map.put("world",world);
        map.put("content",content);
        map.put("message",message);
        return map;
    }

请求传参形式:
在这里插入图片描述
返回结果:

{
    "reqMethod_msg": null,
    "world": "hello666",
    "annotation_msg": null,
    "hello": "world666",
    "message": "HelloWorld",
    "content": null
}

可以看出,在转发接口中,通过Map、Model设置的参数值,被request带到目标接口处。

3、自定义Bean参数

作用说明:将页面多个字段参数,封装成我们自己的Bean,简化代码。

案例:
接口收参形式:
两个Bean对象

@Data
public class Person {

    private String userName;
    private Integer age;
    private Date birth;
    private Pet pet;

}

@Data
public class Pet {

    private String name;
    private Integer age;

}
    @PostMapping("/saveuser")
    public Person saveuser(Person person){

        return person;
    }

请求传参形式:
字段名和值类型、格式,要和Bean中的字段名和值类型、格式对应上。
在这里插入图片描述
返回结果:

{
    "userName": "zhangsan",
    "age": 18,
    "birth": "2019-12-09T16:00:00.000+00:00",
    "pet": {
        "name": "4444",
        "age": 5555
    }
}

原理解析:
这个自定义Bean的参数解析器是
org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor
在这里插入图片描述
这个参数解析器里面,涉及到两个新的组件
1、数据绑定器:WebDataBinder
2、数据类型转换服务:Converters(springboot默认配置了124种)
我们也可以自定义转换服务,注册到IOC容器中,处理我们自定义的数据格式。

4、自定义参数转换服务

配置类里注册自定义转换服务

    @Bean
    public WebMvcConfigurer webMvcConfigurer(){
        return new WebMvcConfigurer() {

            @Override
            public void addFormatters(FormatterRegistry registry) {
                registry.addConverter(new Converter<String, Pet>() {

                    @Override
                    public Pet convert(String source) {
                        // 啊猫,3
                        if(!StringUtils.isEmpty(source)){
                            Pet pet = new Pet();
                            String[] split = source.split(",");
                            pet.setName(split[0]);
                            pet.setAge(Integer.parseInt(split[1]));
                            return pet;
                        }
                        return null;
                    }
                });
            }
        };
    }

这样配置后了,我们页面关于pet的参数就可以这样传递

<input name="pet" value="啊猫,3"/>

不需要再pet.namepet.age

5、总结

对于这些传参,收参,返参的方式,以上作为学习了解。
实际开发中,我们都采用ajax+json传参,@RequestBody+json收参,@ResponseBody+json返参。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2118267.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

16款facebook辅助工具,总有一款适合你!

Hey小伙伴们~&#x1f44b; 是不是想利用FB大展拳脚&#xff0c;却苦于不知道如何开始&#xff1f;别急&#xff0c;今天就给你们安利16个超实用的FB营销工具&#xff0c;涵盖了内容创建和发布的应用程序&#xff0c;以及数据追踪分析、商品销售等多个方面让你轻松get海外获客新…

浅谈:CDN下真实IP的暴露

免责声明:本文仅做分享! 目录 CDN简介&#xff1a; 国内常见CDN&#xff1a; 国外常见CDN&#xff1a; 判断CDN存在? 在线ping检测: nslookup: 寻找真实IP----> 1-DNS历史解析纪录 2-子域名查询 1.在线平台查询 2.工具爆破 3.搜索引擎 3-网站邮件头信息 4-S…

100个视频如何转换成1个二维码

使用场景描述&#xff1a;有50-100个视频&#xff0c;要实现扫一个二维码&#xff0c;就可以完整观看这50-100个视频的内容&#xff0c;这种情况下&#xff0c;可以使用列表专辑二维码功能来轻松实现。 使用步骤 STEP1 注册帐号 使用视频专辑列表二维码&#xff0c;您需要注册…

原生 iOS 引入 Flutter 报错 kernel_blob.bin 找不到

情况 在一次原生 iOS 项目中引入 Flutter 的过程中&#xff0c;在模拟器中运行出现报错&#xff1a; 未能打开文件“kernel_blob.bin”&#xff0c;因为它不存在。 如下图&#xff1a; 模拟器中一片黑 原因&解决方案 这个是因为 Flutter 的打包 iOS framework 命令中…

美国洛杉矶ip有哪些独特优势

美国洛杉矶的IP地址独特优势主要体现在以下几个方面&#xff0c;rak小编为您整理发布美国洛杉矶的IP地址独特优势&#xff0c;希望 对您选择服务器有帮助。 1. 丰富的IP资源&#xff1a;美国洛杉矶多IP服务器提供的IP数量从几十到几百不等&#xff0c;最多可提供多达511个独立I…

沃创云外呼系统有哪些具体的功能特点

沃创云 [云呼叫中心]&#xff0c;新一代电销外呼系统 沃创云新一代电销外呼系统&#xff0c;提升接通率及降低封号率。 企业云通信-系统平台 沃创云电销外呼系统是一款适用于中小企业电话营销场景的云通信系统平台。 通过与中国移动、中国联通、中国电信三大运营商的紧密合…

Excel--不规则隔行填充底纹颜色

巧用条件格式快速给小计和总计行填充不同颜色。 先选择整个表格&#xff08;选中第一行&#xff0c;按住Shift双击边框即可选中整个表格&#xff09; 新建条件格式-使用公式确定要设置格式的单元格&#xff0c;输入$B3"小计&#xff1a;"&#xff0c;设置格式&…

【go-zero】api与rpc使用etcd服务发现

准备代码 etcd先安装启动 目录结构 go mod init rpc/demo/v2 编写rpc 在user-rpc目录下 user.proto 文件 可使用goctl快速生成 goctl rpc -o user.proto syntax "proto3";option go_package"./pb"; package pb;message GetUserInfoReq {int64 id 1…

第二证券:怎么选出一只好股票?选对股票就能赚钱吗?

怎样选出好股票&#xff1a; 1、比较股票流动性&#xff0c;流动性是指股票成交的生动程度&#xff0c;能够通过股票成交量来判断。好的股票一般具有较高的流动性&#xff0c;这样能够下降流转成本。流动性差的股票在交易时价格可能存在较大的点差&#xff0c;这会添加出资者的…

ComfyUI【基础篇】:小白都可以学会的ComfyUI安装教程(秋叶版安装包)

大家好我是极客菌&#xff01;&#xff01;&#xff01; 前面和大家分享过使用ComfyUI原生安装包在本地搭建ComfyUI环境。 今天和大家分享另一种在本地搭建ComfyUI环境的方式&#xff1a;使用秋叶大佬的安装包。 一. 秋叶大佬的安装包安装教程 &#xff08;需要的同学可自行…

【个人博客hexo版】npm安装hexo时会出现的一些问题

目录 bug1 关于缓存地址和全局变量1.删除C:\Users\用户\下的.npmrc文件2.重新设置淘宝镜像 bug2 需要管理员权限解决办法 bug1 关于缓存地址和全局变量 之前修改过缓存地址和全局变量&#xff0c;卸载又安装了新版的nodejs&#xff0c;安装hexo时会弹出之前的缓存地址&#xf…

18057 ASCII码值之和的差

**思路**&#xff1a; 1. 读取两个字符串 s1 和 s2。 2. 计算每个字符串中所有字符的 ASCII 码值之和。 3. 计算两个字符串的 ASCII 码值之和的差。 4. 输出结果。 **伪代码**&#xff1a; 1. 读取字符串 s1。 2. 读取字符串 s2。 3. 初始化 sum1 和 sum2 为 0。 4. 对于 s1 中…

龙良曲pytorch笔记14-33

一、张量数据类型 张量维度含义0维标量1维向量2维矩阵3维时间序列数据 股价 文本数据 单张彩色图片(RGB) 例如&#xff0c;一个图像可以用三个字段表示&#xff1a; (width, height, channel) 3D 但是&#xff0c;在机器学习工作中&#xff0c;我们经常要处理不止一张图片或…

黑神话悟空幽魂怎么打?大头怪幽魂打法攻略!

黑神话悟空幽魂是第一章的一个非剧情头目&#xff0c;虽然不是妖王级别&#xff0c;但是实力强劲&#xff0c;一套小连招防不胜防&#xff0c;攻高血厚&#xff0c;稍不注意就会挑战失败&#xff0c;这里带来具体的打法技巧。 在游戏开始之前&#xff0c;我们必须要拥有一件完美…

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包&#xff0c;是 JAVA 基础类的一部分&#xff0c;基于 Java AWT 构建&#xff0c;提供了一系列轻量级、可定制的图形用户界面&#xff08;GUI&#xff09;组件。 与 AWT 相比&#xff0c;Swing 提…

录课软件哪个好用?真人出镜微课,让知识生动起来

在数字化教育的浪潮中&#xff0c;录课软件成为了教师和教育工作者不可或缺的得力助手。它们不仅帮助教师高效录制课程&#xff0c;还能通过真人出镜、动画元素和实地拍摄等多种方式&#xff0c;让知识传授更加生动有趣&#xff0c;下面就一起看看具体的方法吧。 录课软件1&…

PCI Express 体系结构导读摘录(四)

系列文章目录 PCI Express 体系结构导读摘录&#xff08;一&#xff09; PCI Express 体系结构导读摘录&#xff08;二&#xff09; PCI Express 体系结构导读摘录&#xff08;三&#xff09; PCI Express 体系结构导读摘录&#xff08;四&#xff09; 文章目录 系列文章目录第…

YOLOv8+Deepsort+PyQt+GUI 语义分割+目标检测+姿态识别 三者合一(集成于一套系统)综合视觉分析系统

综合视觉分析系统 技术栈&#xff1a; YOLOv8&#xff1a;用于目标检测&#xff0c;是一个快速且准确的目标检测框架。DeepSORT&#xff1a;用于目标跟踪&#xff0c;结合了深度学习特征提取和卡尔曼滤波器来预测目标轨迹。GUI&#xff1a;提供一个直观易用的图形用户界面&am…

便携式气象仪器的主要特点

TH-BQX9】便携式气象仪器&#xff0c;也称为便携式气象仪或便携式自动气象站&#xff0c;是一款高度集成、低功耗、可快速安装、便于野外监测使用的高精度自动气象观测设备。以下是关于便携式气象仪器的详细介绍&#xff1a; 主要特点 高精度与多功能&#xff1a;便携式气象仪器…

打造线上+线下相结合的O2O平台预约上门服务小程序源码系统 带完整的安装代码包以及搭建部署教程

系统概述 本系统采用前后端分离的设计架构&#xff0c;前端以微信小程序为载体&#xff0c;提供直观、易用的用户界面&#xff1b;后端则采用稳定的服务器架构&#xff0c;确保数据处理的高效与安全。系统主要包括用户端、商户端和管理员端三大模块&#xff0c;通过API接口实现…