【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)
相关推荐
hqxstudying12 分钟前
java依赖注入方法
java·spring·log4j·ioc·依赖
·云扬·20 分钟前
【Java源码阅读系列37】深度解读Java BufferedReader 源码
java·开发语言
春生野草39 分钟前
关于SpringMVC的整理
spring
Bug退退退1231 小时前
RabbitMQ 高级特性之重试机制
java·分布式·spring·rabbitmq
小皮侠1 小时前
nginx的使用
java·运维·服务器·前端·git·nginx·github
Zz_waiting.2 小时前
Javaweb - 10.4 ServletConfig 和 ServletContext
java·开发语言·前端·servlet·servletconfig·servletcontext·域对象
全栈凯哥2 小时前
02.SpringBoot常用Utils工具类详解
java·spring boot·后端
兮动人2 小时前
获取终端外网IP地址
java·网络·网络协议·tcp/ip·获取终端外网ip地址
呆呆的小鳄鱼2 小时前
cin,cin.get()等异同点[面试题系列]
java·算法·面试
独立开阀者_FwtCoder2 小时前
"页面白屏了?别慌!前端工程师必备的排查技巧和面试攻略"
java·前端·javascript