<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.0.4.RELEASEversion>
parent>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
dependencies>
Springboot里默认加入了jackson-databind作为JSON处理器,所以不需要添加其它额外的JSON处理器。
代码如下(示例):
<form action="delivery" method="get">
<p>usernamep>
<input type="text" name="username"> <br>
<p>passwordp>
<input type="text" name="password"> <br><br>
<input type="submit">
form>
input组件里的name属性指定了表单提交数据的参数名分别为username和password,点击submit按钮提交后,会在地址栏上看到数据会以键值对的形式出现在URL末尾。例如http://localhost:8080//delivery?username=用户名称&password=用户密码
代码如下(示例):
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
pojo类里的成员变量名要与前端发送数据的参数名一一对应(名字要相同)! 否则传递会为null。
如果想要某个成员变量被JSON处理器忽略,可以用@JsonIgnore在其上方注解。
代码如下(示例):
@RestController
public class delivery {
@PostMapping("/delivery")
public User receive(String username,String password){
User user = new User();
user.setPassword(password);
user.setUsername(username);
return user;
}
}
receive方法里的形参名要和前端发送的数据参数名要一一对应,也就是名称要保持一致,前端数据才会被后端接口捕获。
直接返回pojo对象(user),该对象会被jackson-databind封装成Json字符串,再进行发送。
代码如下(示例):
@RestController
public class delivery {
@GetMapping("/delivery")
public User receive(User user){
return user ;
}
}
receive方法里的形参直接是User对象,这就要求User这个pojo类里的成员变量名要和前端发送的数据参数名一一对应,这样才能将接收数据映射成一个User对象。
当前端提交数据后,以上这两种controller都能正确地返回JSON字符串,如下图:
表单提交页面
后端返回内容
对于get请求可以在地址栏直接键入http://localhost:8080//delivery?username=用户名称&password=用户密码,对应接口响应后,同样能返回相同的结果
我们来考虑一下这种情况,后端接口用来接收的POJO对象包含了另一个POJO对象引用,这时候前后端该怎么进行参数传递。
代码如下(示例):
public class User {
private String username;
private String password;
private Information information;
.......省略usernaame,password,information的setter,getter方法......
}
public class Information {
private int age;
private String sex;
.......省略age,sex的setter,getter方法......
}
User类里包含了一个Information对象的引用
代码如下(示例):
@RestController
public class delivery {
@GetMapping("/delivery")
public User receive(User user){
return user ;
}
}
代码如下(示例):
<form action="delivery" method="get">
<p>usernamep>
<input type="text" name="username"> <br>
<p>passwordp>
<input type="text" name="password"> <br>
<p>agep>
<input type="text" name="information.age"><br>
<p>sexp>
<input type="text" name="information.sex"><br><br>
<input type="submit">
form>
***尤其要注意name=“information.age”,name="information.sex"这两个属性的写法是固定的,属性里面的information对应User的information对象的引用,age和sex分别对应information对象里的两个成员变量。因为我们知道User包含了Information对象的引用,这种嵌套了对象的User是会被转化成嵌套了Json对象的Json对象。如果想用User对象来接受参数,则Information里面的成员属性sex和age也要有数据注入才行,而这两个属性对应的参数名分别为information.sex和information.age。
后端返回内容
返回的JSON字符串也是嵌套对象的形式,如果前端通过JSON.parse()将该JSON字符串转化成JSON对象P,则age和sex这两个属性值就可以通过P.information.age和P.information.sex引用了。
考虑这种情况,如果前端发送的是复选框的数据,后端该有什么来接受数据呢?我们知道复选框的name属性值一般都是相同的,传递的是参数名相同而参数不相同的多对键值对,所以后端我们可以用数组来接受复选框传递来的数据。
代码如下(示例):
@RestController
public class delivery {
@GetMapping("/delivery")
public String[] receive(String[] words){
return words;
}
}
后端接口用数组对象words接收前端传递的复选框参数,并返回数组对象words。
代码如下(示例):
<form action="/delivery" method="get">
<p>复选框p><br>
<input type="checkbox" name="words" value="复选框1">
<input type="checkbox" name="words" value="复选框2">
<input type="checkbox" name="words" value="复选框3">
<input type="checkbox" name="words" value="复选框4"><br><br>
<input type="submit">
form>
四个复选框提交的键值对分别为words = 复选框1、words = 复选框2、words = 复选框3、words = 复选框4。键名一定要和后端接收数组名一致。
后端更多时候不会返回一个pojo实体类,而是从数据库里选取若干条记录并返回给前端,我们知道在SpringBoot里面,一个pojo实体类对应数据库中的一条记录,这个时候就要给前端返回若干个pojo对象了。这时候该怎么写呢?
代码如下(示例):
public class User {
private String username;
private String password;
private Information information;
public User(String username,String password,Information information){
this.username = username;
this.password = password;
this.information = information;
}
.......省略usernaame,password,information的setter,getter方法......
}
public class Information {
private int age;
private String sex;
public Information(int age,String sex){
this.age = age;
this.sex = sex;
}
.......省略age,sex的setter,getter方法......
}
可以不给pojo实体类添加公共的构造器,不添加的话就只能通过setter方法一个个的赋值了,这样有点麻烦,所以还是加了个构造器。
代码如下(示例):
@RestController
public class delivery {
@GetMapping("/delivery")
public List<User> receive(){
List<User> user = new ArrayList<>();
user.add(new User("用户1","密码1",new Information(1,"男")));
user.add(new User("用户2","密码2",new Information(2,"女")));
user.add(new User("用户3","密码3",new Information(3,"男")));
return user;
}
}
给前端返回一个泛型为User的List集合
直接在地址栏输入http://localhost:8080/delivery访问delivery接口(这也是get请求),返回内容如下图所示:
好像看不清楚,那就打印出来:[{“username”:“用户1”,“password”:“密码1”,“information”:{“age”:1,“sex”:“男”}},{“username”:“用户2”,“password”:“密码2”,“information”:{“age”:2,“sex”:“女”}},{“username”:“用户3”,“password”:“密码3”,“information”:{“age”:3,“sex”:“男”}}]
由结果可知,返回的是一个内嵌了对象的JSON数组字符串。
其实post请求方式的参数传递跟get是一样的,不同的是post请求传递的数据封装在http请求体里,而get传递的参数附加在了URL的末尾,post请求的数据安全性更高。
此外,后端用于接收post请求的接口要用@PostMapping注解。
现在我们知道了,集合和数组是会被SpringBoot封装成JSON数组的,而Java对象是被封装成JSON对象的。