开发者

SpringMVC中的请求参数接收方式

目录
  • SpringMVC请求参数接收
    • 请求
    • 传递单个参数
    • 基本类型参数传递
    • 传递参数类型不匹配
    • 传递多个参数
    • 传递对象
    • 后端参数重命名
    • 请求参数 name 不存在
    • 传递数组
    • 传递集合
    • 传递jsON数据
    • 获取URL中的参数
    • 文件上传
  • 总结

    SpringMVC请求参数接收

    在浏览器与程序进行交互时,主要分为三个阶段

    1. 建立连接:**将用户(浏览器)和 Java 程序连接起来,也就是访问一个地址能够调用到Spring程序

    2. 请求:用户请求时会携带一些参数,在程序中要想办法获取到参数,因此请求这部分主要是获取参数的功能

    3. 响应:**在执行了业务逻辑之后,要将程序执行的结果返回给客户,也就是响应

    在本篇文章中,我们来学习请求(获取参数)这部分内容

    请求

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

    在本篇文章中,为了更方便学习,则不采用前端传递参数,而是使用 浏览器postman 来模拟

    传递单个参数

    接收单个参数时,直接用方法中的参数即可:

    @RequestMapping("/user")
    @RestController
    public class UserController {
        @RequestMapping(value = "/login")
        public String login(String name) {
            return "接收到用户名: " + name;
        }
    }

    使用 浏览器发送请求:127.0.0.1:8080/user/login?name=zhangsan

    SpringMVC中的请求参数接收方式

    后端程序正确拿到 name 参数的值

    Spring MVC 会根据方法的参数名,找到对应的参数,赋值给方法

    SpringMVC中的请求参数接收方式

    当参数名称不一致时,获取不到参数:

    SpringMVC中的请求参数接收方式

    当未传递参数时:

    SpringMVC中的请求参数接收方式

    基本类型参数传递

    我们测试使用基本类型来接收参数时:

    @RequestMapping("/test")
    @RestController
    public class TestController {
        @RequestMapping("/getInt")
        public String getInt(int age) {
            return "接收到参数age: " + age;
        }
    }

    SpringMVC中的请求参数接收方式

    未传递参数

    SpringMVC中的请求参数接收方式

    报了 500 错误

    500 错误码是指**“Internal Server Error**”(服务器内部错误),是表示服务器在处理请求时遇到了未知的错误或异常情况。这种错误通常是由服务器端代码出现问题引起的,而不是客户端请求的问题

    我们查看日志信息:

    SpringMVC中的请求参数接收方式

    int 类型的参数 age 虽然是可选的,但是由于被声明为基本类型而不能转换为空值。考虑将其声明为对应基本类型的包装类型

    我们使用包装类型 Integer 来接收参数:

        @RequestMapping("/getInteger")
        public String getInt(Integer age) {
            return "接收到参数age: " + age;
        }

    SpringMVC中的请求参数接收方式

    当未传递对应参数时,接收到的数据为 null

    在使用基本类型来接收参数时,参数必须传(除了 boolean 类型)

    当使用 boolean 类型接收时:

        @RequestMapping("/getBoolean")
        public String getBoolean(boolean b) {
            return "接收到参数b: " + b;
        }

    未传递参数时,默认值为 false:

    SpringMVC中的请求参数接收方式

    因此,对于参数可能为空的数据,建议使用包装类型接收

    传递参数类型不匹配

    SpringMVC中的请求参数接收方式

    此时报了 400 错误

    400 错误码是指"Bad Request"(错误请求),表示服务器无法理解客户端发送的请求,因为请求语法有误、请求参数无效或者请求消息体格式错误等。

    我们观察后端日志:

    SpringMVC中的请求参数接收方式

    类型转换失败

    传递多个参数

    与接收单个参数一样,直接使用方法的参数接收即可:

        @RequestMapping(value = "/login")
        public String login(String name, String password) {
            return "接收到用户名: " + name + " 接收到密码: " + password;
        }

    SpringMVC中的请求参数接收方式

    后端程序正确拿到了 name 和 password 参数的值

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

    SpringMVC中的请求参数接收方式

    传递对象

    当参数比较多时,就需要很多形参,并且每增加一个参数,就需要修改方法的声明,此时,我们可以将这些参数封装为一个对象

    public class Student {
        private int id;
        private String name;
    DLBaYm    private int age;
        private String sex;
    
        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 = na编程客栈me;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "id=" + id +
                    ", name='" + name + ''' +
                    ", age=" + age +
                    ", sex='" + sex + ''' +
                    '}';
        }
    }

    传递对象:

        @RequestMapping("/getStudent")
        public String getStudent(Student student) {
            return "接收到参数student: " + student;
        }

    后端程序正确接收到各个属性的值

    SpringMVC中的请求参数接收方式

    Spring 会根据参数名称自动绑定到对象的各个属性

    SpringMVC中的请求参数接收方式

    当某个属性未传递时,则赋值为null,基本类型则赋值为默认初始值

    SpringMVC中的请求参数接收方式

    后端参数重命名

    前端传递的参数 key 和 后端接收到的 key 可以不一致,例如前端传递参数 name 给后端,而后端使用 userName 来接收,这种请求下,我们可以使用注解 @RequestParam 来重命名前后端的参数值

    @RequestMapping("/user")
    @RestController
    public class UserController {
        @RequestMapping("/login")
        public String login(@RequestParam("name") String userName) {
            return "接收到用户名: " + userName;
        }
    }

    SpringMVC中的请求参数接收方式

    传递的参数 name 正确绑定到后端参数 userName 上

    SpringMVC中的请求参数接收方式

    而此时,若使用 userName 进行传参:

    SpringMVC中的请求参数接收方式

    观察打印的错误日志:

    SpringMVC中的请求参数接收方式

    请求参数 name 不js存在

    我们可以发现:

    1. 在使用 @RequestParam 进行重命名时,请求参数只能与 @RequestParam 声明的名称一致,才能进行参数绑定和赋值

    2. 在使用 @RequestParam 进行重命名时,参数就变成了必传参数

    在使用 @RequestParam 时,若前端参数是一个非必传参数,此时该如何解决呢?

    我们查看 @RequestParam 注解的实现细节:

    SpringMVC中的请求参数接收方式

    我们可以看到, required 的默认值为 true,表示:该注解修饰的参数默认为必传

    因此,我们可以设置 @RequestParam 中的 rwww.devze.comequired = false,来避免不传递参数时报错:

        @RequestMapping("/login")
        public String login(@RequestParam(value = "name", required = false) String userName) {
            return "接收到用户名: " + userName;
        }

    在添加 required = false后,name 前面也加上了 key,value = “name”

    • 注解属性赋值时,若未指明 key,则默认为 value 属性
    • 若需要有多个属性进行赋值,则需要写上 key

    传递数组

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

    @RequestMapping("/test")
    @RestController
    public class TestController {
        @RequestMapping("getArray")
        public String getArray(String[] array) {
            return Arrays.toString(array);
        }
    }

    发送请求并传参:

    SpringMVC中的请求参数接收方式

    中间分割的 , 必须为英文的逗号

    也可使用:

    SpringMVC中的请求参数接收方式

    请求参数名与形参数组名称相同且请求参数多个,后端定义数组类型形参即可接收参数

    传递集合

    集合参数与数组类似,同一个请求参数名有多个,且需要使用 @RequestParam 绑定参数关系

    默认情况下,请求中参数名相同的多个值,是封装到数组中的,若需要封装到集合中,需要使用 @RequestParam 绑定参数关系

        @RequestMapping("/getList")
        public String getList(@RequestParam List<String> list) {
            return "接收到参数list" + list;
        }

    同样的,有两种方式进行传参:

    SpringMVC中的请求参数接收方式

    SpringMVC中的请求参数接收方式

    传递JSON数据

    JSON是什么

    JSON(javascript Object Notation)是一种轻量级的数据交换格式,易于人类阅读和编写,也易于机器解析和生成。其就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此 JSON本质是字符串,主要负责在不同的语言中数据传递和交互

    我们来看一段JSON数据:

    {
      "name": "zhangsan",
      "age": 18,
      "isStudent": true,
      "courses": ["Math", "English", "History"]
    }

    也可以压缩表示:

    {"najsme":"zhangsan","age":18,"isStudent":true,"courses":["Math","English","History"]}

    与上面描述的数据是一样的,只是上面的进行了格式化,更易读

    JSON的语法:

    • 数据在 键值对(key/value)中
    • 数据由逗号, 分割
    • 对象用{}表示
    • 数组用[]表示
    • 值可以为对象,也可以为数组,数组中可以包含多个对象

    JSON中的两种结构

    • 对象:{} 保存的对象是一个 无序的键值对集合,一个对象以 { 开始,} 结束,每个键(key)后面跟一个 : ,键值对使用 , 分割
    • 数组:[]保存的数组是值(value)的有序集合,一个数组以 [ 开始,] 结束,值之间使用 , 分割

    在使用JSON时,我们可以使用在线JSON格式化工具进行校验和书写

    JSON 字符串和Java对象互转

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

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

    本质是是 jackson-databind 提供的功能,Spring MVC 框架中已经将该工具包引进了,直接使用即可,若脱离 Spring MVC 使用,需要引入相关依赖

    <dependency>
     <groupId>com.fasterXML.jackson.core</groupId>
     <artifactId>jackson-databind</artifactId>
     <version>2.13.5</version>
    </dependency>

    JSON的转换工具包有很多,也可以使用其他的

    @SpringBootTest
    class JSONUtilsTest {
        @Autowired
        private ObjectMapper objectMapper;
        @Test
        public void jsonTest() throws JsonProcessingException {
            Student student = new Student();
            student.setId(1);
            student.setName("zhangsan");
            student.setAge(13);
            student.setSex("男");
            // 将对象转换为 JSON 字符串
            String jsonStr = objectMapper.writeValueAsString(student);
            System.out.println("JSON字符串为:" + jsonStr);
            // 将JSON字符串转换为对象
            Student student1 = objectMapper.readValue(jsonStr, Student.class);
            System.out.println("转换的对象:" + student1);
        }
    }

    使用 ObjectMapper 对象提供的两个方法,可以完成 对象 和 JSON 字符串的互换

    • **writeValueAsString:**将对象转换为JSON字符串
    • **readValue:**将字符串转换为对象

    运行结果:

    SpringMVC中的请求参数接收方式

    JSON的优点

    • 1. 易于理解和阅读: JSON采用了人类可读的文本格式,基本上可以直接阅读和理解,这使得开发人员和数据工程师可以轻松地查看数据内容。
    • 2. 轻量和高效: JSON数据以文本形式存储,相比于其他二进制格式如XML,它的数据量通常更小,传输和解析速度更快,特别是在网络传输和移动设备上更为高效。
    • 3. 跨平台和语言无关: JSON在多种编程语言中都有支持和解析库,因此可以在不同的平台和系统中使用和传输数据,无需担心兼容性问题。
    • 4. 易于解析和生成: JSON数据格式简单明了,解析起来也比较容易。几乎所有现代编程语言都有JSON解析器和生成器,可以方便地将JSON数据转换成各种数据结构或者将数据结构转换成JSON格式
    • **5. 安全性较高:**JSON数据格式是一种纯文本格式,不包含可执行代码,不会执行恶意代码,因此具有较高的安全性

    因此,JSON在web应用程序中被广泛使用(前后端数据交互、API接口数据传输等等)

    传递JSON对象

    • 接收JSON对象,需要使用 @RequestBody 注解
    • @RequestBody:RequestBody,即请求正文,表示这个注解作用在请求正文的数据绑定,请求参数必须写在请求正文中,@RequestBody 注解的作用是将HTTP请求体中的数据转换为Java对象,并作为方法的参数传入
        @RequestMapping("/getStudent")
        public String getStudent(@RequestBody Student student) {
            return "接收到参数student: " + student;
        }

    使用postman发送JSON请求参数:

    SpringMVC中的请求参数接收方式

    后端成功接收

    获取URL中的参数

    在获取URL中的参数时,我们需要使用 @PathVariable 注解

    @RequestMapping("/user")
    @RestController
    public class UserController {
        @RequestMapping("/login/{id}/{name}")
        public String login(@PathVariable Integer id, @PathVariable String name) {
            return "接收到id: " + id + " 接收到name: " + name;
        }
    }

    使用postman测试:

    SpringMVC中的请求参数接收方式

    后端正确获取到URL中的参数

    • 当方法的参数名称和需要绑定的URL中的变量名称一致时,可以不用给 @PathVariable 的属性赋值
    • 而当方法的参数名称和需要绑定的URL中的变量名称不一致时,需要对 @PathVariable的属性value赋值
        @RequestMapping("/login/{id}/{name}")
        public String login(@PathVariable Integer id, @PathVariable("name") String userName) {
            return "接收到id: " + id + " 接收到name: " + userName;
        }

    SpringMVC中的请求参数接收方式

    文件上传

    在传输文件时,我们需要使用 @RequestPart

    @RequestMapping("/test")
    @RestController
    public class TestController {
        @RequestMapping("getFile")
        public String getFile(@RequestPart("file")MultipartFile multipartFile) throws IOException {
            // 获取文件名
            String fileName = multipartFile.getOriginalFilename();
            // 将文件上传到指定路径
            multipartFile.transferTo(new File("D:/" + multipartFile.getOriginalFilename()));
            return "接收到文件:" + fileName;
        }
    }

    使用postman发送请求:

    SpringMVC中的请求参数接收方式

    同时查看文件是否上传成功:

    SpringMVC中的请求参数接收方式

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜