准备工作

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.0.4.RELEASE</version>
  5. </parent>
  6. <dependencies>
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-web</artifactId>
  10. </dependency>
  11. </dependencies>

Springboot里默认加入了jackson-databind作为JSON处理器,所以不需要添加其它额外的JSON处理器。

一、Get请求的普通传递

1.前端表单提交

代码如下(示例):

  1. <form action="delivery" method="get">
  2. <p>username</p>
  3. <input type="text" name="username"> <br>
  4. <p>password</p>
  5. <input type="text" name="password"> <br><br>
  6. <input type="submit">
  7. </form>

input组件里的name属性指定了表单提交数据的参数名分别为username和password,点击submit按钮提交后,会在地址栏上看到数据会以键值对的形式出现在URL末尾。例如http://localhost:8080//delivery?username=用户名称&password=用户密码

2.后端pojo类

代码如下(示例):

  1. public class User {
  2. private String username;
  3. private String password;
  4. public String getUsername() {
  5. return username;
  6. }
  7. public void setUsername(String username) {
  8. this.username = username;
  9. }
  10. public String getPassword() {
  11. return password;
  12. }
  13. public void setPassword(String password) {
  14. this.password = password;
  15. }
  16. }

pojo类里的成员变量名要与前端发送数据的参数名一一对应(名字要相同)! 否则传递会为null。
如果想要某个成员变量被JSON处理器忽略,可以用@JsonIgnore在其上方注解。

3.后端controller类

  • 第一种写法

代码如下(示例):

  1. @RestController
  2. public class delivery {
  3. @PostMapping("/delivery")
  4. public User receive(String username,String password){
  5. User user = new User();
  6. user.setPassword(password);
  7. user.setUsername(username);
  8. return user;
  9. }
  10. }

receive方法里的形参名要和前端发送的数据参数名要一一对应,也就是名称要保持一致,前端数据才会被后端接口捕获。
直接返回pojo对象(user),该对象会被jackson-databind封装成Json字符串,再进行发送。

  • 第二种写法

代码如下(示例):

  1. @RestController
  2. public class delivery {
  3. @GetMapping("/delivery")
  4. public User receive(User user){
  5. return user ;
  6. }
  7. }

receive方法里的形参直接是User对象,这就要求User这个pojo类里的成员变量名要和前端发送的数据参数名一一对应,这样才能将接收数据映射成一个User对象。

4.运行结果

当前端提交数据后,以上这两种controller都能正确地返回JSON字符串,如下图:
SpringBoot项目部署(Docker) - 图1 表单提交页面
SpringBoot项目部署(Docker) - 图2后端返回内容
对于get请求可以在地址栏直接键入http://localhost:8080//delivery?username=用户名称&password=用户密码,对应接口响应后,同样能返回相同的结果


二、Get请求的POJO嵌套传递

我们来考虑一下这种情况,后端接口用来接收的POJO对象包含了另一个POJO对象引用,这时候前后端该怎么进行参数传递。

1.后端pojo类

代码如下(示例):

  1. public class User {
  2. private String username;
  3. private String password;
  4. private Information information;
  5. .......省略usernaame,password,informationsetter,getter方法......
  6. }
  1. public class Information {
  2. private int age;
  3. private String sex;
  4. .......省略age,sexsetter,getter方法......
  5. }

User类里包含了一个Information对象的引用

2.后端controller类

代码如下(示例):

  1. public class delivery {
  2. @GetMapping("/delivery")
  3. public User receive(User user){
  4. return user ;
  5. }
  6. }

3.前端表单提交

代码如下(示例):

  1. <form action="delivery" method="get">
  2. <p>username</p>
  3. <input type="text" name="username"> <br>
  4. <p>password</p>
  5. <input type="text" name="password"> <br>
  6. <p>age</p>
  7. <input type="text" name><br>
  8. <p>sex</p>
  9. <input type="text" name><br><br>
  10. <input type="submit">
  11. </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。

4.运行结果

SpringBoot项目部署(Docker) - 图3表单提交页面

SpringBoot项目部署(Docker) - 图4后端返回内容
返回的JSON字符串也是嵌套对象的形式,如果前端通过JSON.parse()将该JSON字符串转化成JSON对象P,则age和sex这两个属性值就可以通过P.information.age和P.information.sex引用了。

三、Get请求的数组传递

考虑这种情况,如果前端发送的是复选框的数据,后端该有什么来接受数据呢?我们知道复选框的name属性值一般都是相同的,传递的是参数名相同而参数不相同的多对键值对,所以后端我们可以用数组来接受复选框传递来的数据。

1.后端controller类

代码如下(示例):

  1. public class delivery {
  2. @GetMapping("/delivery")
  3. public String[] receive(String[] words){
  4. return words;
  5. }
  6. }

后端接口用数组对象words接收前端传递的复选框参数,并返回数组对象words。

2.前端表单提交复选框

代码如下(示例):

  1. <form action="/delivery" method="get">
  2. <p>复选框</p><br>
  3. <input type="checkbox" name="words" value="复选框1">
  4. <input type="checkbox" name="words" value="复选框2">
  5. <input type="checkbox" name="words" value="复选框3">
  6. <input type="checkbox" name="words" value="复选框4"><br><br>
  7. <input type="submit">
  8. </form>

四个复选框提交的键值对分别为words = 复选框1、words = 复选框2、words = 复选框3、words = 复选框4。键名一定要和后端接收数组名一致。

3.运行结果

SpringBoot项目部署(Docker) - 图5提交复选框

SpringBoot项目部署(Docker) - 图6后端返回内容

四、后端返回POJO类的集合

后端更多时候不会返回一个pojo实体类,而是从数据库里选取若干条记录并返回给前端,我们知道在SpringBoot里面,一个pojo实体类对应数据库中的一条记录,这个时候就要给前端返回若干个pojo对象了。这时候该怎么写呢?

1.后端pojo类

代码如下(示例):

  1. public class User {
  2. private String username;
  3. private String password;
  4. private Information information;
  5. public User(String username,String password,Information information){
  6. this.username = username;
  7. this.password = password;
  8. this.information = information;
  9. }
  10. .......省略usernaame,password,informationsetter,getter方法......
  11. }
  1. public class Information {
  2. private int age;
  3. private String sex;
  4. public Information(int age,String sex){
  5. this.age = age;
  6. this.sex = sex;
  7. }
  8. .......省略age,sexsetter,getter方法......
  9. }

可以不给pojo实体类添加公共的构造器,不添加的话就只能通过setter方法一个个的赋值了,这样有点麻烦,所以还是加了个构造器。

2.后端controller类

代码如下(示例):

  1. public class delivery {
  2. @GetMapping("/delivery")
  3. public List<User> receive(){
  4. List<User> user = new ArrayList<>();
  5. user.add(new User("用户1","密码1",new Information(1,"男")));
  6. user.add(new User("用户2","密码2",new Information(2,"女")));
  7. user.add(new User("用户3","密码3",new Information(3,"男")));
  8. return user;
  9. }
  10. }

给前端返回一个泛型为User的List集合

直接在地址栏输入http://localhost:8080/delivery访问delivery接口(这也是get请求),返回内容如下图所示:

SpringBoot项目部署(Docker) - 图7好像看不清楚,那就打印出来:[{“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方式的参数传递

其实post请求方式的参数传递跟get是一样的,不同的是post请求传递的数据封装在http请求体里,而get传递的参数附加在了URL的末尾,post请求的数据安全性更高。

此外,后端用于接收post请求的接口要用@PostMapping注解。

六、总结

现在我们知道了,集合和数组是会被SpringBoot封装成JSON数组的,而Java对象是被封装成JSON对象的。