学习Spring MVC
Postman介绍
在软件工程中, 我们需要具有前后端分离的思想, 以降低耦合性. 但是在测试后端代码时,我们还得写前端代码测试,这是个令人头疼的问题.
那么我们如何测试自己的后端程序呢, 这就用到了一个工具: Postman.
界面介绍:
传参的介绍
1.普通传参, 也就是通过查询字符串来传参.
学习HTTP时,我们通过URL来了解互联网上对应的资源.
其中, 查询字符串就是我们传参所需要的参数. (以键值对的形式展示)
2.form-data(完整表示为:multipart/form-data)
指表单提交的数据,通常用于提交图片或文件.
3.x-www-form-urlencoded
form表单.
4.raw
可以上传任意形式的文本,可以上传text, json, xml, html等.
请求
访问不同的URL路径,本质就是发送不同的请求. 在发送请求时,可能会带一些参数(包括上面提到的几种). 所以学习Spring请求,主要是学习如何传递参数到后端以及后端是如何接收的.
传递参数, 咱们主要是使用浏览器和Postman来模拟.
后端开发人员无需过度关注如何传递参数, 了解即可, 实际开发中以Postman测试为主.
传递单个参数
接收单个参数,在Spring MVC直接用方法中的参数, 比如如下代码:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/param")
public class ParamController {
@RequestMapping("/m1")
public String method1(String name) {
return "接受到参数name:" + name;
}
}
使用Postman发送请求并传参:
结果:
Spring MVC会根据方法的参数名,找到对应的参数, 赋值给方法.
如果参数不一致,是获取不到参数的.
比如请求URL:http://127.0.0.1:8080/param/m1?name1=spring
响应结果:
注意事项
使用基本类型来接收参数, 参数必须传(除了boolean类型),否则会报500错误.
类型不匹配时,会报400错误.
@RequestMapping("/m2")
public String method2(int age) {
return "接受到参数name:" + age;
}
1.正常传递参数:
2.不传递age参数.
观察到状态码为500.
观察日志并解决.
一般查看日志堆栈信息的首行, 报错信息显示:
int类型的参数为'age', 虽然是可选的, 但由于被声明基本类型而不能被转换为空值.考虑声明为对应的基本包装类型.
3.传递参数类型不匹配:
对于包装类型,如果不传对应的参数, Spring接收到的参数就是null.
因此为减少上述问题的出现, 对于可能为空的参数, 建议设置为包装类型.
传递多个参数
和传递单个参数一样,只要设置多个参数的接收列表即可.
@RequestMapping("/m3")
public String method3(String name, int age) {
return "接受到参数name:" + name + ", age:" + age;
}
结果:
注: 当有多个参数时, 前后端匹配时, 是以名称进行匹配的, 因此, 参数位置的先后并不影响结果.
传递对象
在传参的过程中,如果写太多参数, 就显得代码很丑, 这时我们就可以按格式创建一个类, 以对象的形式来传递.
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("/m4")
public String method4(Person p) {
return p.toString();
}
运行结果:
与传递多个参数类似, Spring会根据参数名称自动绑定到各个属性上, 如果一个属性未传递, 则赋值为null(基本类型和之前讲到的不同, 由于对象中的属性有初始值, 因此未传会被附为初始值).
后端参数重命名(后端参数映射)
某些特殊的情况下, 前端传递的参数key和后端的参数会存在不一样的情况, 比如前端传递的是一个name, 而后端接收的参数名称则是userName, 这时就会出现接收不到的情况. 我们不必强求它们的一致性, 可以使用 @RequestParam 来重命名后端的参数值. (即指示前端传来的是这个)
举个栗子:
@RequestMapping("/m5")
public String method5(@RequestParam("name") String userName) {
return "接受到参数name:" + userName;
}
可以看到, Spring可以正确地把传递的name参数绑定到了后端的参数userName上.
那么如果传递的是userName呢?
可以得出结论:
1. 使用@RequestParam进行参数重命名时, 请求参数只能和@RequestParam声明的名称一致,才能进行参数绑定和赋值.
2.使用@RequestParam进行参数重命名时, 参数就成了必传参数.
非必传参数设置
如果我们的实际业务前端的参数是一个非必传的参数, 针对上述问题, 应该如何解决呢?
先来了解一下参数必传的原因, 让我们先来查看一下RequestParam的注解:
可以看到, 传递设置这里是true, 即该注解修饰的参数默认为必传.
解决方案:可以手动设置注解里面的required为false来避免报错:
@RequestMapping("/m5")
public String method5(@RequestParam(value = "name", required = false) String userName) {
return "接受到参数name:" + userName;
}
传递数组
Spring MVC可以自动绑定数组参数的赋值.
后端实现代码:
@RequestMapping("/m6")
public String method6(String[] array) {
return Arrays.toString(array);
}
这里通过多个参数传递或者一个参数都可以:
可以看到后端对数组参数进行了正确的接收和响应.
传递集合
集合参数:和数组类似, 同一个请求的参数名为多个, 且需要使用@RequestParam绑定参数关系.
默认情况下, 请求中参数名相同的多个值, 是封装到数组. 如果要封装到集合, 要使用@RequestParam绑定参数关系.
请求方式和数组类似:
代码:
@RequestMapping("/m7")
public String method7(@RequestParam List<String> list) {
return "size:" + list.size() + ",listParam:" + list;
}
运行结果: