SpringMVC接收数据

news2024/11/15 13:52:31

SpringMVC接收数据

在这里插入图片描述
在这里插入图片描述

SpringMVC处理请求流程

SpringMVC涉及组件理解:

  1. DispatcherServlet : SpringMVC提供,我们需要使用web.xml配置使其生效,它是整个流程处理的核心,所有请求都经过它的处理和分发![ CEO ]
  2. HandlerMapping : SpringMVC提供,我们需要进行IoC配置使其加入IoC容器方可生效,它内部缓存handler(controller方法)和handler访问路径数据,被DispatcherServlet调用,用于查找路径对应的handler![秘书]
  3. HandlerAdapter : SpringMVC提供,我们需要进行IoC配置使其加入IoC容器方可生效,它可以处理请求参数和处理响应数据数据,每次DispatcherServlet都是通过handlerAdapter间接调用handler,他是handler和DispatcherServlet之间的适配器![经理]
  4. Handler : handler又称处理器,他是Controller类内部的方法简称,是由我们自己定义,用来接收参数,向后调用业务,最终返回响应结果![打工人]
  5. ViewResovler : SpringMVC提供,我们需要进行IoC配置使其加入IoC容器方可生效!视图解析器主要作用简化模版视图页面查找的,但是需要注意,前后端分离项目,后端只返回JSON数据,不返回页面,那就不需要视图解析器!所以,视图解析器,相对其他的组件不是必须的![财务]

1 访问路径设置

@RequestMapping注解的作用就是将请求的URL地址和处理请求的方式(handler方法)关联起来,建立映射关系

SpringMVC接收到指定的请求,就回来找到在映射关系中对应的方法来处理这个请求。


@Controller
@RequestMapping("")
public class UserController {

    //handler -> handlerMapping  制定访问地址

    /**
     * @ WebServlet("必须使用/开头“)
     * @ RequestMapping(不是必须使用/开头) user/login  /user/login
     *
     * 1. 精准地址 [一个 | 多个] /user/login {"地址1","地址2"}
     * 2. 支持模糊 * 任意一层字符串 |  ** 任一层任意字符串
     *         /user/* -> user/a user/aaaa 可以  /user/a/b 不行
     *         /user/** ->user user/a   user/a/a/a/aa/aa/a
     * 3. 类上和方法上添加@RequestMapping的区别
     *      类上提取通用的访问地址
     *      方法上是具体的handler地址
     *      访问:类地址 + 方法地址即可
     * 4. 请求方式指定
     *      客户端 -> http(get | post | Put|delete) ->DispatcherServlet ->handler
     *      默认情况:@RequestMapping("Login")  只要地址正确 任何请求方式都可以访问
     *      制定请求方式 method = {RequestMethod.GET,RequestMethod.POST}
     *      不符合请求方式 会出现405异常
     * 5. 注解进阶      只能使用在方法上
     *      get @GetMapping ==  @RequestMapping(xxx,method=GET)
     *      post @PostMapping ==  @RequestMapping(xxx,method=Post)
     *      delete @DeleteMapping ==  @RequestMapping(xxx,method=Delete)
     *      put @PutMapping ==  @RequestMapping(xxx,method=Put)
     */

    @RequestMapping
    @GetMapping //get请求地址
    public String index(){

    }

    //@RequestMapping(value = "login",method = RequestMethod.POST)  //作用注册地址 将handler注册到handlerMapping
    @PostMapping("login")
    public String login(){

        return null;
    }

    @RequestMapping(value = "register",method = {RequestMethod.GET,RequestMethod.POST})
    public String register(){

        return null;
    }

}

2 接收参数(重点!!)

2.1 param和json参数比较

Param: key = value & key = value

JSON {key:value,key:value}

在 HTTP 请求中,我们可以选择不同的参数类型,如 param 类型和 JSON 类型。下面对这两种参数类型进行区别和对比:

  1. 参数编码:

    param 类型的参数会被编码为 ASCII 码。例如,假设 name=john doe,则会被编码为 name=john%20doe。而 JSON 类型的参数会被编码为 UTF-8。

  2. 参数顺序:

    param 类型的参数没有顺序限制。但是,JSON 类型的参数是有序的。JSON 采用键值对的形式进行传递,其中键值对是有序排列的

  3. 数据类型:

    param 类型的参数仅支持字符串类型、数值类型和布尔类型等简单数据类型。而 JSON 类型的参数则支持更复杂的数据类型,如数组、对象等

  4. 嵌套性:

    param 类型的参数不支持嵌套。但是,JSON 类型的参数支持嵌套,可以传递更为复杂的数据结构。

  5. 可读性:

    param 类型的参数格式比 JSON 类型的参数更加简单、易读。但是,JSON 格式在传递嵌套数据结构时更加清晰易懂。

总的来说,param 类型的参数适用于单一的数据传递,而 JSON 类型的参数则更适用于更复杂的数据结构传递。根据具体的业务需求,需要选择合适的参数类型。在实际开发中,常见的做法是:在 GET 请求中采用 param 类型的参数,而在 POST 请求中采用 JSON 类型的参数传递。

注意: @ResponseBody注解可以用来表示方法或者方法返回值,标识方法的返回值是要放在响应体中直接返回给客户端的数据,而不是有视图解析器来解析并渲染生成响应体。

2.2 param参数接收

2.2.1 直接接收
/**
 * 直接接收
 * param:  /param/data?name=root&age=18
 * 形参列表 填写对应名称的参数即可! 请求参数名 = 形参参数名即可
 * @return
 */
@RequestMapping("data")
@ResponseBody
public String data(String name,Integer age){
    //当前端没传来相应数据时,比如name没传  那么name就是默认值 
    System.out.println("name = " + name + ", age = " + age);
    return "name = " + name + ", age = " + age;
}
2.2.2 注解指定
    /**
     * 注解指定
     * 指定任意的请求参数名 要求必须传递 或者给予一个默认值
     * param: /param/data1?account=root&page=1
     *
     * @ RequestParam -> 形参列表 指定请求参数名 或者是否必须传递 或者非必须传递设置默认值
     *         用法: @RequestParam(value="指定请求参数名", 如果形参名和请求参数名一致 可以省略
     *                              required=false/true,前端是否必须传递参数,默认是true 必须传递 不传400异常
     *                              defaultValue="字符串" 当非必须传递时 可以设置默认值)
     *
     * @ RequestParam(value = "account") String username 默认此时account必须传递 否则会报错
     * 当函数变量名与路径变量名不同时,使用value来指定此变量接受的路径变量值
     *
     * @ RequestParam(required = false,defaultValue = "1") int page
     * 由于required=false(默认为true 必须传递) 可以不传递 不传递时为默认值defaultValue1
     */
    @GetMapping("data1")
    public String data1(@RequestParam(value = "account") String username ,
                        @RequestParam(required = false,defaultValue = "1") int page){
        System.out.println("username = " + username + ", page = " + page);
        return "username = " + username + ", page = " + page;
    }
2.2.3 特殊值:一名多值
    /**
     * 特殊值:一名多值 key=1&key=2 直接使用集合接值即可
     * param: /param/data?hbs=吃&hbs=喝&hbs=学习
     * 不加注解@RequestParam 将hbs对应的一个字符串直接赋值给集合 类型异常
     * 加了注解 经理就会将集合  add方法加入对应的字符串
     */
    @GetMapping("data2")
    @ResponseBody
    public String data2(@RequestParam List<String> hbs){
        System.out.println("hbs = " + hbs);
        return "ok";
    }
2.2.4 使用实体对象接值
/**
 * 使用实体对象接值
 * param: /param/data?name=二狗子&age=18
 * 准备一个对应属性和get|set方法的实体类即可!  形参列表声明对象参数即可 注意:类的属性名必须要等于路径变量名
 */
@RequestMapping("data3")
@ResponseBody
public String data3(User user) {
    Integer age = user.getAge();
    String name = user.getName();
    System.out.println("name = " + name + "age = " + age);
    return "name = " + name + "age = " + age;
}

2.3 路径参数接收

路径传递参数是一种在 URL 路径中传递参数的方式。在 RESTful 的 Web 应用程序中,经常使用路径传递参数来表示资源的唯一标识符或更复杂的表示方式。而 Spring MVC 框架提供了 @PathVariable 注解来处理路径传递参数。

@PathVariable 注解允许将 URL 中的占位符映射到控制器方法中的参数。

例如,如果我们想将 /user/{id} 路径下的 {id} 映射到控制器方法的一个参数中,则可以使用 @PathVariable 注解来实现。

下面是一个使用 @PathVariable 注解处理路径传递参数的示例:

    /**
     * param: /path/{account}/{password} 比如/path/root/123456
     * 动态路径设计 {key} = *     用{key}可以在形参列表获取传入的参数
     * 接收路径参数:使用@PathVariable 代表接受动态路径参数  参数与@Param类似
     * 不使用@PathVariable 则为param的直接接收 此时就接收不到动态路径参数了
     */
    @RequestMapping("{account}/{password}")
    public String login(@PathVariable(value = "account",required = false) String username,@PathVariable String password){
        System.out.println("username = " + username + ", password = " + password);
        return "username = " + username + ", password = " + password;
    }

2.4 JSON参数接收

前端传递 JSON 数据时,Spring MVC 框架可以使用 @RequestBody 注解来将 JSON 数据转换为 Java 对象。@RequestBody 注解表示当前方法参数的值应该从请求体中获取,并且需要指定 value 属性来指示请求体应该映射到哪个参数上。其使用方式和示例代码如下:

    /**
     * 接收JSON数据
     * 使用@RequestBody注解
     * Java原生的api 只支持路径参数和param参数 request.getParam("key");param
     *              不支持json  json是前端的格式
     * 解决方法:1导入json处理依赖
     *          2 handlerAdapter配置json转化器  在配置类上加入@EnableWebMvc   //handlerAdapter配置json转化器
     */
    @PostMapping("data")
    public String data(@RequestBody Person person){
        System.out.println("person = " + person);
        return person.toString();
    }

JSON依赖

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.0</version>
</dependency>

2.5 接收Cookie数据

    /**
     * cookie接收
     * 使用@CookieValue  参数value=接收的Cookie名
     */
    @RequestMapping("data")
    public String data(@CookieValue(value = "cookieName") String value){
        System.out.println("value = " + value);
        return value;
    }

2.6 接收请求头

    /**
     * 接收请求头
     * @ RequestHeader
     */
    @GetMapping("data")
    public String data(@RequestHeader("Host") String host){
        System.out.println("host = " + host);
        return "host = " + host;
    }

3 总结

接收参数
    1. 路径设置
        @RequestMapping(value = "地址",method="请求方式")
        @GetMapping / @PostMapping  方法
    2. 接收参数【重点】
        param
            直接接收 handler(类型 形参名) 形参名=请求参数名s
            注解指定 handler(@RequestParam(name="请求参数名",required = true,defaultValue="默认值"))
            一名多值 handler(@RequestParam List keys)
            实体接收 hadnler(实体 对象) 对象的属性名 = 请求参数名
        路径参数
            设置动态路径和标识  /{key}/info/{key}
            接受路径    handler(@PathVariable(动态路径key) 类型 形参名)
        json
            数据接收 handler(@RequestBody 实体类 对象)
            准备工作:
                1. 导入jackson依赖
                2. @EnableWebMVC【加入了handlerMapping 加入了handlerAdapter 配置json处理器】
    3. cookie接收
        handler(@CookieValue("cookie的名字"))
    4. 请求头对象接收
        handler(@RequestHeader("header的名字"))
    5. 原生api获取
        handler(httpServletRequest,response,session)
        ServletContext -> ioc -> 全局变量 @Autowired

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

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

相关文章

16个常用的思维模型

01.机会成本 02.沉没成本 03.直觉思维 04.决策树 05.非SR模型 06.确认性偏差 07.易得性偏差 08.逆向思维 09.六顶思考帽 10.101010旁观思维 11.升级思维 11.笛卡尔模型 13.第一性原理 14.奥卡姆剃刀理论 15.马斯洛需求层次理论 16.反脆弱思维 来源&#xff1a;16个常用的思维模…

基于最大重叠离散小波变换的PPG信号降噪(MATLAB 2018)

光电容积脉搏波PPG信号结合相关算法可以用于人体生理参数检测&#xff0c;如血压、血氧饱和度等&#xff0c;但采集过程中极易受到噪声干扰&#xff0c;对于血压、血氧饱和度测量的准确性造成影响。随着当今社会医疗保健技术的发展&#xff0c;可穿戴监测设备对于PPG信号的质量…

WSDM 2023 推荐系统相关论文整理(三)

WSDM 2023的论文录用结果已出&#xff0c;推荐系统相关的论文方向包含序列推荐&#xff0c;点击率估计等领域&#xff0c;涵盖图学习&#xff0c;对比学习&#xff0c;因果推断&#xff0c;知识蒸馏等技术&#xff0c;累计包含近四十篇论文&#xff0c;下文列举了部分论文的标题…

Source Insight 4.0安装和使用

文章目录 一、前言二、新建工程2.1 新建工程2.2 同步工程 3 Source Insight怎么生成函数调用关系图&#xff1f;3.1 打开关系窗口3.2 打开关系函数3.3 修改关系属性3.4设置 Relation Window Options3.5 设置Levels3.6 修改显示模式 4 下载地址 一、前言 Source Insight 4.0 是每…

Blog项目切换Markdown编辑器———LayUI弹出层弹出写在页面的内容导致的各种bug

【2024.5.24回顾】 1 问题描述(描述完自己解决了…) 正常情况 点击添加文章按钮后&#xff0c;弹出文章编辑界面&#xff0c;如果用富文本功能编辑&#xff0c;则一切正常。可以多次打开、关闭 Markdown 如果在弹出层中点击了切换编辑器按钮&#xff0c;会成功切换为markd…

Android RelativeLayout Rtl布局下的bug:paddingStart会同时作用于左右内边距

问题现象 如上图&#xff0c;只是设置了paddingStart&#xff0c;在RTL布局下&#xff0c;左右都产生了10dp的间距。其他布局如LinearLayout&#xff0c;FrameLayout则没有这个问题。 private void positionAtEdge(View child, LayoutParams params, int myWidth) {if (isLayou…

simCSE句子向量表示(1)-使用transformers API

SimCSE SimCSE: Simple Contrastive Learning of Sentence Embeddings. Gao, T., Yao, X., & Chen, D. (2021). SimCSE: Simple Contrastive Learning of Sentence Embeddings. arXiv preprint arXiv:2104.08821. 1、huggingface官网下载模型 官网手动下载&#xff1a;pri…

【Python数据分析--Numpy库】Python数据分析Numpy库学习笔记,Python数据分析教程,Python数据分析学习笔记(小白入门)

一&#xff0c;Numpy教程 给大家推荐一个很不错的笔记&#xff0c;个人长期学习过程中整理的 Python超详细的学习笔记共21W字点我获取 1-1 安装 1-1-1 使用已有的发行版本 对于许多用户&#xff0c;尤其是在 Windows 上&#xff0c;最简单的方法是下载以下的 Python 发行版…

史上最全,呕心沥血总结oracle推进SCN方法(三)

作者介绍&#xff1a;老苏&#xff0c;10余年DBA工作运维经验&#xff0c;擅长Oracle、MySQL、PG数据库运维&#xff08;如安装迁移&#xff0c;性能优化、故障应急处理等&#xff09; 公众号&#xff1a;老苏畅谈运维 欢迎关注本人公众号&#xff0c;更多精彩与您分享。前面介…

实现k8s网络互通

前言 不管是docker还是k8s都会在物理机组件虚拟局域网&#xff0c;只不过是它们实现的目标不同。 docker&#xff1a;针对同一个物理机&#xff08;宿主机&#xff09; k8s&#xff1a;针对的是多台物理机&#xff08;宿主机&#xff09; Docker 虚拟局域网 K8S虚拟局域网 …

腾讯云centos上安装docker

下面的操作是在root用户下操作的,如果非root用户在命令行前加上sudo 1. 系统及内核查看 操作系统&#xff1a;64位的CentOS 7或更新版本。内核版本&#xff1a;最低要求是3.10&#xff0c;推荐使用3.10或更高版本。 #查看内核版本 (base) [klfwjfweaVM-0-6-centos ~]$ uname…

专业开放式耳机什么牌子更好?六大技巧教你不踩坑!

相信很多入坑的朋友再最开始挑选耳机的时候都会矛盾&#xff0c;现在市面上这么多耳机&#xff0c;我该怎么选择&#xff1f;其实对于开放式耳机&#xff0c;大家都没有一个明确的概念&#xff0c;可能会为了音质的一小点提升而耗费大量的资金&#xff0c;毕竟这是一个无底洞。…

OpenAI的Sam Altman搞核聚变了?!究竟是创新还是疯狂?|TodayAI

据《华尔街日报》报道&#xff0c;西雅图地区的核聚变公司Helion Energy正在与人工智能公司OpenAI洽谈一项重要交易&#xff0c;OpenAI计划“购买大量电力为数据中心提供动力”。这一消息引起了广泛关注。 OpenAI的首席执行官兼联合创始人Sam Altman已向Helion投资了3.75亿美元…

【StableDiffusion】2024.6.4 亲测成功,无魔法 Civitai 镜像,国内下载 Civitai 模型的方法

一、废话不说&#xff0c;直接开始 废话&#xff1a;请注意&#xff0c;这个插件不是万能的&#xff0c;有一些模型无法下载&#xff0c;大概能下载 70% 左右的模型 1.github下载插件 https://github.com/tzwm/sd-webui-model-downloader-cn/tree/main 这个步骤不用我多说了…

用框架思维学Java:集合概览

集合这个词&#xff0c;耳熟能详&#xff0c;从小学一年级开始&#xff0c;每天早上做操时都会听到这两个字&#xff1a; 高中数学又学习到了新的集合&#xff1a; 那么Java中的集合是什么呢&#xff1f; 一&#xff0c;前言 1&#xff0c;什么是Java集合 数学集合是Java集…

110、python-第四阶段-7-Socket服务端开发

服务端代码&#xff1a; 启动客户端工具 netAssist.exe&#xff0c;连接socket服务&#xff0c;如下&#xff0c;进行通信

echarts学习:基本使用和组件封装

前言 我在工作中使用echarts较少&#xff0c;这就导致每次使用时都要从头再来&#xff0c;这让我很头疼。因此我决心编写一系列文章将我参与工作后几次使用echarts所用到的知识记录下来&#xff0c;以便将来可以快速查阅。 一、基本使用 像我一样的新手&#xff0c;想要入门e…

【方法论】钟澄国家杰青 鲸吞法 写文献综述、大论文框架必备

Xlab2020的个人空间-Xlab2020个人主页-哔哩哔哩视频 老师指南 就是1号文件有了后&#xff0c;也就是【】概括了之后&#xff0c;我们会运行下程序&#xff08;程序我会让学生share&#xff09;。然后程序会执行这么一个操作&#xff0c;复制下【】内容&#xff0c;然后在第二个…

在Windows11系统上搭建SFTP服务器

利用OpenSSH搭建SFTP服务器 下载安装部署OpenSSH创建一个测试账户测试链接为SFTP用户配置根目录下载安装部署OpenSSH 参考链接 部署完启动服务要使用管理员模式。 net start sshd创建一个测试账户 使用PC的微软账户是访问不了SFTP的。 需要使用被微软账户覆盖掉的系统账户和…

ATA-3080C功率放大器的基本原理是什么

功率放大器是一种电子设备&#xff0c;用于将输入信号的功率增加到更高的水平&#xff0c;以便驱动负载或输出设备。它在许多应用中都起着重要作用&#xff0c;包括音频放大、无线通信、雷达系统和工业控制等。 功率放大器的基本原理可以通过两个关键概念来解释&#xff1a;放大…