当前位置: 首页 > article >正文

【Java EE】Spring请求如何传递参数详解

文章目录
  • ??传递单个参数
  • ??传递多个参数
  • ??传递对象
  • ??后端参数重命名(后端参数映射)
  • ??传递数组
  • ??传递集合
  • ??传递JSON数据
    • ??JSON概念
    • ??JSON的语法
    • ??JSON的两种结构
    • ??JSON字符串和Java对象互转
    • ??JSON的优点
    • ??传递JSON对象
  • ??获取URL中参数@PathVariable
  • ??上传文件@RequestPart
  • ??获取Cooki/Session
  • ??获取Header
    • ??传统获取 header
    • ??简洁获取header
  • ?总结

访问不同的路径,就是发送不同的请求.在发送请求时,可能会带些参数,所以我们在学习Spring的请求时,主要是学习如何传递参数到后端以及后端如何接收.

下面博主会对传递参数进行一个详解,咱们主要是使浏览器和Postman来模拟

??传递单个参数

@RestController
public class hello {
    @RequestMapping("/test")
    public String test(String name){
        return "接受到的参数:"+name;
    }

}

当我们运行后,用浏览器进行访问

http://127.0.0.1:8080/pt/test1name=

访问结果如下:
在这里插入图片描述
注意:

  • 如果参数名不一致,获取不到参数,默认没有传参,默认值为null

在这里插入图片描述

  • 如果参数类型不致,是会进行报错的

    @RestController
    public class hello {
    @RequestMapping(“/test”)
    public String test(Integer name){
    return “接受到的参数:”+name;
    }
    }

在这里插入图片描述
注意:

  • 如果使基本类型来接收参数时,参数必须传(除boolean类型),否则会报500错误

    @RestController
    public class hello {
    @RequestMapping(“/test”)
    public String test(int name){
    return “接受到的参数:”+name;
    }
    }

在这里插入图片描述

日志中也会进行报错。
在这里插入图片描述
建议使用包装类!!!

??传递多个参数

与传递单个参数一样

不同的是当有多个参数时,前后端进参数匹配时,是以参数的名称进匹配的,因此参数的位置是不影响后端获取参数的结果

??传递对象

如果参数较多时,法声明就需要有很多形参.并且后续每次新增个参数,也需要修改法声明.

我们不妨把这些参数封装为个对象.

Spring MVC也可以动实现对象参数的赋值,如Person对象

public class Person {
    private int id;
    private String name;
    private String password;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", password='" + password + ''' +
                '}';
    }
}



@RequestMapping("test5")
    public String test5(Person person) {
        return "接收到的参数名为:" + person.toString();
    }

在这里插入图片描述
注意

Spring会根据参数名称动绑定到对象的各个属性上,如果某个属性未传递,则赋值为null(基本类型则赋值为默认初识值,如int类型的属性,会被赋值为0)

??后端参数重命名(后端参数映射)

某些特殊的情况下,前端传递的参数key和我们后端接收的key可以不致,如前端传递了个time给后端,后端是使createtime字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使 @RequestParam 来重命名前后端的参数值.

    @RequestMapping("test6")
    public String test6(@RequestParam("time") String createtime) {
        return "接收到的参数名为:" + createtime;
    }

注意:

  • 使 @RequestParam 进参数重命名时,请求参数只能和@RequestParam 声明的名称致,才能进参数绑定和赋值.

  • 使 @RequestParam 进参数重命名时,参数就变成了必传参数

  • 如果我们不想让他变成必传参数,我们可以通过设置@RequestParam 中的 required=false (默认为true,必传)来避免不传递时报错

    @RequestMapping("test6")
    public String test6(@RequestParam(value = "time",required = false) String createtime) {
        return "接收到的参数名为:" + createtime;
    }
    

??传递数组

Spring MVC 可以动绑定数组参数的赋值

    @RequestMapping("test7")
    public String test7(String[] names) {
        return "接收到的参数名为:" + Arrays.toString(names);
    }

数组传参时,有以下几种:
1:http://127.0.0.1:8080/pt/test7names=张三&names=李四
2:http://127.0.0.1:8080/pt/test7names=张三%2c李四
3:http://127.0.0.1:8080/pt/test7names=张三,李四

??传递集合

集合参数:和数组类似,同个请求参数名有为多个

不同的时需要使 @RequestParam 绑定参数关系

传参方式与上述数组传参三种方式一样

@RequestMapping("/m6")
public String method6(@RequestParam List<String> listParam){
	return "size:"+listParam.size() + ",listParam:"+listParam;
}

??传递JSON数据

??JSON概念

JSON:JavaScript Object Notation【JavaScript对象表法】

JSON是种轻量级的数据交互格式.它基于ECMAScript(欧洲计算机协会制定的js规范)的个集,采完全独于编程语的本格式来存储和表数据。

简单来说:JSON就是种数据格式,有的格式和语法,使本表个对象或数组的信息,因此JSON本质是字符串.

主要负责在不同的语中数据传递和交换

??JSON的语法

  1. 数据在 键值对(Key/Value) 中
  2. 数据由逗号 , 分隔
  3. 对象 {} 表
  4. 数组 [] 表
  5. 值可以为对象,也可以为数组,数组中可以包含多个对象

??JSON的两种结构

  1. 对象:括号 {} 保存的对象是个序的 键值对 集合.个对象以左括号 { 开始,右括号 }结束。每个"键"后跟个冒号 :
    ,键值对使逗号 , 分隔
  2. 数组: 中括号 [ ] 保存的数组是值(value)的有序集合.个数组以左中括号 [ 开始,右中括号 ] 结束,值之间使逗号 , 分隔。

??JSON字符串和Java对象互转

JSON本质上是个字符串,通过本来存储和描述数据

Spring MVC框架也集成了JSON的转换具,我们可以直接使,来完成JSON字符串和Java对象的互转

??JSON的优点

  1. 简单易:语法简单,易于理解和编写,可以快速地进数据交换

  2. 跨平台持:JSON可以被多种编程语解析和成,可以在不同的平台和语之间进数据交换和传输

  3. 轻量级:相较于XML格式,JSON数据格式更加轻量级,传输数据时占带宽较,可以提数据传输速度

  4. 易于扩展:JSON的数据结构灵活,持嵌套对象和数组等复杂的数据结构,便于扩展和使

  5. 安全性:JSON数据格式是种纯本格式,不包含可执代码,不会执恶意代码,因此具有较的安全性

基于以上特点,JSON在Web应程序中被泛使,如前后端数据交互、API接数据传输等

??传递JSON对象

接收JSON对象,需要使 @RequestBody 注解

RequestBody:请求正,意思是这个注解作在请求正的数据绑定,请求参数必须在写在请求正中

    @RequestMapping("test9")
    public String test9(@RequestBody Person person) {
        return "接收到的参数名为:" + person.toString();
    }

??获取URL中参数@PathVariable

path variable:路径变量

和字表达的意思样,这个注解主要作在请求URL路径上的数据绑定

    @RequestMapping("/test10/{id}/{name}")
    public String test10(@PathVariable Integer id, @PathVariable("name") String userName){
        return "解析参数id:"+id+",name:"+userName;
    }

注意:

  • 如果法参数名称和需要绑定的URL中的变量名称致时,可以简写,不给@PathVariable的属性赋值,如上述例中的id变量

  • 如果法参数名称和需要绑定的URL中的变量名称不致时,需要@PathVariable的属性value赋值,如上述例中的userName变量

??上传文件@RequestPart

代码实现如下:

    @RequestMapping("/test11")
    public String getfile(@RequestPart("file") MultipartFile file) throws IOException {
        //获取?件名称
        String fileName = file.getOriginalFilename();
        //?件上传到指定路径
        file.transferTo(new File("D:/temp/" + file.getOriginalFilename()));
        return "接收到?件名称为: "+fileName;
    }

??获取Cooki/Session

由于这部分内容较多,博主单独写了出来。链接如下:

??获取Header

??传统获取 header

    @RequestMapping("/test17")
    public String test17(HttpServletRequest request, HttpServletResponse response) {
        String userAgent = request.getHeader("User-Agent");
        return  "userAgent:"+userAgent;
    }

??简洁获取header

    @RequestMapping("/test18")
    public String test18(@RequestHeader("User-Agent") String userAgent) {
        return "userAgent:"+userAgent;
    }

总结

感谢大家的阅读,希望得到大家的批评指正,和大家一起进步,与君共勉!


http://www.kler.cn/a/430655.html

相关文章:

  • 强化特种作业管理,筑牢安全生产防线
  • week 11 - BCNF
  • 【赵渝强老师】MongoDB逻辑存储结构
  • [Android]按下扫描键时启动一个线程来执行某些操作
  • Centos7.9安装openldap+phpldapadmin+grafana配置LDAP登录最详细步骤 亲测100%能行
  • 利用Circuit JS1再学学电子方面的知识(硬件)
  • Mac电脑钓鱼到拿下核心权限
  • GC常见垃圾回收算法,JVM分代模型
  • 鸿蒙手机文件目录
  • k8s配置Pod 优先级
  • Python爬虫——HTML中Xpath定位
  • 基于单片机控制的多功能智能语音风扇
  • 幼儿园学校养老院供电安全解决方案
  • MongoDB change stream实战
  • CAD C# 批量替换当前图中块
  • 使用go生成、识别二维码
  • 【GitHub分享】you-get项目
  • 断点续传【授权访问】
  • js后端开发之Next.js、Nuxt.js 与 Express.js
  • 在huggingface.co的Spaces中推理,得到错误:No space left on device
  • Docker多架构镜像构建踩坑记
  • AI Weekly『12月2-8日』:OpenAI发布发布满血版o1,Meta发布Llama 3.3模型!
  • 将yolo系列中的类别转为字典或者list
  • MongoDB靶场(手工注入)攻略
  • UART串口通讯---STM32
  • 初次使用uniapp编译到微信小程序编辑器页面空白,真机预览有内容