【Spring】“请求“ 之传递单个参数、传递多个参数和传递对象

文章目录

  • 请求
  • [1. 传递单个参数](#1. 传递单个参数)
    • 注意事项
      • [1 . 正常传递参数](#1 . 正常传递参数)
      • [2 . 不传递 age 参数](#2 . 不传递 age 参数)
      • [3 . 传递参数类型不匹配](#3 . 传递参数类型不匹配)
  • [2. 传递多个参数](#2. 传递多个参数)
  • [3. 传递对象](#3. 传递对象)

请求

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

传递参数,我们主要是使用浏览器和 Postman 来模拟

后端开发人员无需太过于关注如何传递参数,了解即可,实际开发中以 Postman 测试为主

比如餐厅的厨师,不关注用户是在店里下单还是外卖平台下单,只需要知道如何让接受订单,根据订单做出对应的菜肴就可以了

1. 传递单个参数

接受单个参数,在 Spring MVC 中直接用方法中的参数就可以,比如以下代码:

java 复制代码
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RestController;  
  
@RequestMapping("/param")  
@RestController  
public class UserController {  
  
    @RequestMapping("/m1")  
    public String method1(String name) {  
        return "接收到参数:name="+name;  
    }  
}

可以看到,后端程序正确拿到了 name 参数的值。Spring MVC 会根据方法的参数名,找到对应的参数,赋值给方法

如果参数不一致,是获取不到参数的,比如请求 URL:

http://127.0.0.1:8080/param/m1?name1=spring ,响应结果:


注意事项

使用基本类型来接收参数时,参数必须传(除 boolean 类型),否则会报 500 错误;类型不匹配时,会报 400 错误

java 复制代码
@RequestMapping("/m1/int")  
public String method1GetInt(int age) {  
    return "接收到参数:age="+age;  
}

1 . 正常传递参数

http://127.0.0.1:8080/param/m1/int?age=18

浏览器响应情况:

通过 Fiddler 观察请求和响应,HTTP 响应状态码为 200Content-Typetext/html


2 . 不传递 age 参数

http://127.0.0.1:8080/param/m1/int

浏览器响应情况:

通过 Fiddler 观察请求和响应,HTTP 响应状态码为 500

尝试观察程序的错误日志,并解决问题:

一般看日志堆栈信息的首行,报错信息显示:
int 类型的参数' age ',虽然为可选的,但由于被声明为基本类型而不能被转换为空值。考虑将其声明为对应基本类型的包装类型

包装类型可以为 null,当把类型变成 Integer 之后:

  • 对于包装类,如果不传对应参数,Spring 接收到的数据则为 null。所以企业开发中,对于参数可能为空的数据,建议使用包装类型

3 . 传递参数类型不匹配

http://127.0.0.1:8080/param/m1/int?age=abc

通过 Fiddler 观察请求和响应,HTTP 响应状态码为 400


2. 传递多个参数

如何接收多个参数呢?

和接收单个参数一样,直接使用方法的参数接收即可。使用多个形参

java 复制代码
@RequestMapping("/m2")  
public String method2(String name, String password) {  
    return "接收到参数:name=" + name + ", password=" + password;  
}
  • 可以看到,后端程序正确拿到了 namepassword 参数的值
    当有多个参数的时候,前后端进行参数匹配的时候,是以参数的名称进行匹配的,因此参数的位置是不影响后端获取参数的结果

3. 传递对象

如果参数比较多时,方法声明就需要有很多形参,并且后续每次新增一个参数,也需要修改方法声明。我们不妨把这些参数封装为一个对象。

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

java 复制代码
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 + '\'' +  
                '}';  
    }  
}

对象传递代码实现:

java 复制代码
@RequestMapping("/m3")  
public Object method3(Person person) {  
    return person.toString();  
}
  • 使用浏览器发送请求并传参:
  • 可以看到,后端程序正确拿到了 Person 对象里面的各个属性的值
    Spring 会根据参数名称自动绑定到对象的各个属性上,如果某个属性未传递,则赋值 null(基本类型则赋值为默认初始值,比如 int 类型的属性,会被复赋值为 0)
相关推荐
一行•坚书3 分钟前
kafka服务端与客户端如何协作?生产者发送消息分区策略是什么?消费者组分区策略?集群与ACK机制?
java·后端·kafka
serve the people18 分钟前
Prompt Composition with LangChain’s PipelinePromptTemplate
java·langchain·prompt
天天摸鱼的java工程师19 分钟前
干掉系统卡顿!Excel异步导出完整实战方案(百万数据也不慌)
java·后端
心随雨下28 分钟前
Java中将System.out内容写入Tomcat日志
java·开发语言·tomcat
-指短琴长-1 小时前
ProtoBuf速成【基于C++讲解】
android·java·c++
Cx330❀1 小时前
《C++ 搜索二叉树》深入理解 C++ 搜索二叉树:特性、实现与应用
java·开发语言·数据结构·c++·算法·面试
爱吃烤鸡翅的酸菜鱼1 小时前
深度解析《AI+Java编程入门》:一本为零基础重构的Java学习路径
java·人工智能·后端·ai
SimonKing1 小时前
被卖的Hutool出AI模块了!它如何让Java调用大模型变得如此简单?
java·后端·程序员
不穿格子的程序员2 小时前
从零开始刷算法-栈-字符串解码
java·开发语言
你不是我我2 小时前
【Java 开发日记】设计模式了解吗,知道什么是饿汉式和懒汉式吗?
android·java·开发语言