【JavaEE进阶】 Spring请求如何传递参数详解

2024-06-04 4399阅读

文章目录

  • 🎍序言
  • 🌴传递单个参数
  • 🍀传递多个参数
  • 🎄传递对象
  • 🌳后端参数重命名(后端参数映射)
  • 🌲传递数组
  • 🎍传递集合
  • 🌴传递JSON数据
    • 🚩JSON概念
    • 🚩JSON的语法
    • 🚩JSON的两种结构
    • 🚩JSON字符串和Java对象互转
    • 🚩JSON的优点
    • 🚩传递JSON对象
    • 🎋获取URL中参数@PathVariable
    • 🍃上传⽂件@RequestPart
    • 🎄获取Cooki/Session
    • 🍀获取Header
      • 🚩传统获取 header
      • 🚩简洁获取header
        • 🚩结果展示
        • ⭕总结

          🎍序言

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

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

          🌴传递单个参数

          比如博主写了以下程序

          @RequestMapping("pt")
          @RestController
          public class Test_1_12 {
              @RequestMapping("test1")
              public String test1(String name) {
                  return "接收到的参数名为:" + name;
              }
          }
          

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

          http://127.0.0.1:8080/pt/test1?name=遇事问春风

          访问结果如下:

          【JavaEE进阶】 Spring请求如何传递参数详解 第1张

          注意:

          • 如果参数名不一致,获取不到参数,默认没有传参,默认值为null
                @RequestMapping("test2")
                public String test2(Integer year) {
                    return "接收到的参数名为:" + year;
                }
            

            【JavaEE进阶】 Spring请求如何传递参数详解 第2张

            • 如果参数类型不⼀致,是会进行报错的
                  @RequestMapping("test2")
                  public String test2(Integer year) {
                      return "接收到的参数名为:" + year;
                  }
              

              【JavaEE进阶】 Spring请求如何传递参数详解 第3张

              • 如果使⽤基本类型来接收参数时,参数必须传(除boolean类型),否则会报500错误
                    @RequestMapping("test3")
                    public String test3(int year) {
                        return "接收到的参数名为:" + year;
                    }
                

                【JavaEE进阶】 Spring请求如何传递参数详解 第4张

                日志中也会进行报错。

                【JavaEE进阶】 Spring请求如何传递参数详解 第5张

                • 建议使用包装类!!!

                  🍀传递多个参数

                  与传递单个参数一样

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

                      @RequestMapping("test4")
                      public String test4(String name,Integer year) {
                          return "接收到的参数名为:" + name + " " + year;
                      }
                  

                  【JavaEE进阶】 Spring请求如何传递参数详解 第6张

                  🎄传递对象

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

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

                  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();
                      }
                  

                  【JavaEE进阶】 Spring请求如何传递参数详解 第7张

                  注意:

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

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

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

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

                    【JavaEE进阶】 Spring请求如何传递参数详解 第8张

                    注意:

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

                      【JavaEE进阶】 Spring请求如何传递参数详解 第9张

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

                        【JavaEE进阶】 Spring请求如何传递参数详解 第10张

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

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

                        【JavaEE进阶】 Spring请求如何传递参数详解 第11张

                        🌲传递数组

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

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

                        数组传参时,有以下几种:

                        1:http://127.0.0.1:8080/pt/test7?names=张三&names=李四

                        2:http://127.0.0.1:8080/pt/test7?names=张三%2c李四

                        3:http://127.0.0.1:8080/pt/test7?names=张三,李四

                        🎍传递集合

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

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

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

                        @RequestMapping("/m6")
                        public String method6(@RequestParam List 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();
                            }
                        

                        我们使用使⽤Postman来发送json请求参数

                        【JavaEE进阶】 Spring请求如何传递参数详解 第12张

                        🎋获取URL中参数@PathVariable

                        path variable:路径变量

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

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

                        【JavaEE进阶】 Spring请求如何传递参数详解 第13张

                        注意:

                        • 如果⽅法参数名称和需要绑定的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;
                              }
                          

                          我们这里使用Postman发送请求

                          【JavaEE进阶】 Spring请求如何传递参数详解 第14张

                          我们到相应路径进行查看是否上穿成功

                          【JavaEE进阶】 Spring请求如何传递参数详解 第15张

                          🎄获取Cooki/Session

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

                          【JavaEE进阶】 获取Cookie和Session

                          🍀获取Header

                          获取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;
                              }
                          

                          🚩结果展示

                          • 传统获取

                            【JavaEE进阶】 Spring请求如何传递参数详解 第16张

                          • 简洁获取

                            【JavaEE进阶】 Spring请求如何传递参数详解 第17张

                            ⭕总结

                            关于《【JavaEE进阶】 Spring请求如何传递参数详解》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!


    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]