SpringMVC接收数据

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

创新实训2024.06.03日志:完善Baseline Test框架、加入对Qwen-14B的测试

1. Baseline Test框架重构与完善 在之前的一篇博客中&#xff08;创新实训2024.05.29日志&#xff1a;评测数据集与baseline测试-CSDN博客&#xff09;&#xff0c;我介绍了我们对于大模型进行基线测试的一些基本想法和实现&#xff0c;包括一些基线测试的初步结果。 后来的一…

SpringCloud-面试篇(二十三)

&#xff08;1&#xff09;SpringCloud常见组件有那些 有无数微服务需要相互调用&#xff1a;可以用远程调用组件OpenFeign组件&#xff0c;也可以用Dobble 这么多微服务相互调用怎么管理&#xff1a;就用到注册中心组件Nacos&#xff0c;Eureka 所有的服务去找注册中心做注…

Ollama本地运行 Codestral-22B-v0.1

Ollama本地运行 Codestral-22B-v0.1 0. 引言1. 运行 codestral:22b-v0.1-q8_02. 简单测试下它的代码能力 0. 引言 Mixtral 5月30日发布了 Codestral-22B-v0.1。 Codestrall-22B-v0.1 在 80 多种编程语言的多样化数据集上进行训练&#xff0c;包括最流行的语言&#xff0c;例如…

vue实现pdf下载——html2canvas

html2canvas 官方文档https://html2canvas.hertzen.com/getting-started html2canvas 的原理是通过遍历DOM树,将每一个HTML元素转化为Canvas对象,并叠加到一起形成一张完整的图片或者PDF文件。 1. 安装插件 npm install html2canvas jspdf --save 2.使用&#xff08;页面已经…

月入30000的软件测试人员,简历是什么样子的?

我们都知道&#xff0c;简历是一个人进入职场的敲门砖。从某种层面来说&#xff0c;简历也像一个人的具象身份证&#xff0c;或者专业资格证。所以&#xff0c;一份简历的好坏&#xff0c;不仅关乎个人的“脸面”&#xff0c;更关乎你是不是一个有“含金量”的技术人员。 所以…

企业应用架构模式--详解51种企业应用架构模式

导读&#xff1a;企业应用包括哪些&#xff1f;它们又分别有哪些架构模式&#xff1f; 世界著名软件开发大师Martin Fowler给你答案 目录 01什么是企业应用02 企业应用的种类03企业架构模式 01什么是企业应用 我的职业生涯专注于企业应用&#xff0c;因此&#xff0c;这里所谈…

DevExpress WPF中文教程:Grid - 如何向项目添加GridControl并绑定到数据

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

pyqt QAxWidget 读写Excel文件

QaxWidget相比openpyxl 的方式区别是提供了图形界面&#xff0c;excel的输入修改不用再编写代码&#xff0e;activeX技术是个过时的技术&#xff0c;发挥下余热&#xff0e; # -*- coding: utf-8 -*- from PyQt5.QAxContainer import QAxWidget from PyQt5.QtWidgets import …

JL-03-Y1 清易易站

产品概述 清易易站是清易电子新研发的一体式气象站&#xff0c;坚持科学化和人文化相结合的设计理念&#xff0c;应用新检测原理研发的传感器观测各类气象参数&#xff0c;采用社会上时尚的工艺理念设计气象站的整体结构&#xff0c;实现了快速观测、无线传输、数据准确、精度较…

案例 10kV能源站配电室电气设备集中监控系统

1 项目概况 青山节能科技10kV能源站项目是一个现代化的配电室&#xff0c;包括变压器、高压柜、低压柜等多台设备&#xff0c;为了提高运行效率和安全性&#xff0c;配电室电气设备集中监控系统接入了轨道巡检机器人、“SF6 & O2”双气体探测器、漏水探测器、无源无线电缆…

智慧校园建设经验分享

近年来&#xff0c;智慧校园建设在教育领域引起了广泛的关注和讨论。作为现代化教育的一部分&#xff0c;智慧校园为学生、教师和学校管理者提供了更加便捷、高效的教育环境。下面&#xff0c;我们将分享一些成功的智慧校园建设经验&#xff0c;希望对大家有所启发。 首先&…

【最新鸿蒙应用开发】——一篇搞懂什么是UIAbility

UIAbility组件 UIAbility组件是一种包含UI的应用组件&#xff0c;UIAbility组件是系统调度的基本单元&#xff08;最小单元&#xff09;&#xff0c;为应用提供绘制界面的窗口&#xff0c;主要用于和用户交互。一个应用可以包含一个或多个UIAbility组件。 UIAbility的设计理念…

LeetCode-103. 二叉树的锯齿形层序遍历【树 广度优先搜索 二叉树】

LeetCode-103. 二叉树的锯齿形层序遍历【树 广度优先搜索 二叉树】 题目描述&#xff1a;解题思路一&#xff1a;层序遍历&#xff0c;唯一区别就是ans.append(level[::-1] if len(ans) % 2 else level)背诵版&#xff1a;解题思路三&#xff1a;0 题目描述&#xff1a; 给你二…

【Redis数据库百万字详解】命令操作

文章目录 一、连接命令二、键命令 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f388;欢迎踏入我的博客世界&#xff0c;能与您在此邂逅&#xff0c;真是缘分使然&#xff01;&#x1f60a; &#x1f338;愿您在此停留的每一刻&#xff0c;都沐浴在轻松愉悦的氛围…

工业楼控暖通组态恒温检测控制大屏前端UI案例

工业楼控暖通组态恒温检测控制大屏前端UI案例

详解MyBatis(三)

目录 1.#{} 和 ${} 1.1#{} 和${} 使用 Integer类型参数 String类型参数 1.2#{} 和 ${}区别 1.2.1#{}性能更高&#xff08;预编译&#xff09; 1.2.2#{}更安全&#xff08;防止SQL注入&#xff09; 1.3排序功能 1.4like查询 2.数据库连接池 2.1连接池介绍 2.2更换连接池…

从零入手人工智能(1)——卷积神经网络

1.前言 本人作为一名单片机工程师&#xff0c;近期对人工智能领域产生了浓厚的兴趣&#xff0c;并开始了我的探索之旅。人工智能是一个博大精深的领域&#xff0c;我相信有许多志同道合的朋友也希望涉足这个领域&#xff0c;因此我写下这篇文章&#xff0c;旨在详细记录我学习…

JavaSE——学习总结

一、初识Java 运行Java程序 Java是一门半编译型、半解释型语言 先通过javac编译程序把源文件进行编译&#xff0c;编译后生成的.class文件是由字节码组成的&#xff0c;和平台无关、面向JVM的文件&#xff0c;最后启动java虚拟机来运行.class文件&#xff0c;此时JVM会将字节…

CRT 安装过程出现许可证向导未成功完成

在下载使用SecureCRT和SecureFX时&#xff0c;SecureCRT按照教程很容易破解&#xff0c;而SecureFX使用补丁无法正常破解。 就是会出现了这个问题 The license wizard did not complete successfully. Possible errors include: -The license is for a different version of…

systemctlm-cosim-demo项目分析

概述 systemctlm-cosim-demo项目是Xilinx的systemc库的demo工程。 环境安装 qemu安装 cd xilinx_proj/Downloads git clone https://github.com/Xilinx/qemu.git cd qemu git checkout 74d70f8008# Configure and build # zynq7000 # ./configure --target-list"arm-s…