SpringBoot多种参数传递总结

文章目录

  • 准备工作
  • 一、Get请求的普通传递
    • 1.前端表单提交
    • 2.后端pojo类
    • 3.后端controller类
    • 4.运行结果
  • 二、Get请求的POJO嵌套传递
    • 1.后端pojo类
    • 2.后端controller类
    • 3.前端表单提交
    • 4.运行结果
  • 三、Get请求的数组传递
    • 1.后端controller类
    • 2.前端表单提交复选框
    • 3.运行结果
  • 四、后端返回POJO类的集合
    • 1.后端pojo类
    • 2.后端controller类
  • 五、post方式的参数传递
  • 六、总结


准备工作

 <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处理器。

一、Get请求的普通传递

1.前端表单提交

代码如下(示例):

 <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=用户密码

2.后端pojo类

代码如下(示例):


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在其上方注解。

3.后端controller类

  1. 第一种写法

代码如下(示例):

@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字符串,再进行发送。

  1. 第二种写法

代码如下(示例):

@RestController
public class delivery {
    @GetMapping("/delivery")
    public User receive(User user){
         return user ;
    }
}

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

4.运行结果

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


二、Get请求的POJO嵌套传递

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

1.后端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对象的引用

2.后端controller类

代码如下(示例):

@RestController
public class delivery {
    @GetMapping("/delivery")
    public User receive(User user){
         return user ;
    }
}

3.前端表单提交

代码如下(示例):

   <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。

4.运行结果

SpringBoot多种参数传递总结_第3张图片表单提交页面

SpringBoot多种参数传递总结_第4张图片后端返回内容
返回的JSON字符串也是嵌套对象的形式,如果前端通过JSON.parse()将该JSON字符串转化成JSON对象P,则age和sex这两个属性值就可以通过P.information.age和P.information.sex引用了。

三、Get请求的数组传递

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

1.后端controller类

代码如下(示例):

@RestController
public class delivery {
    @GetMapping("/delivery")
    public String[] receive(String[] words){
         return words;
    }
}

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

2.前端表单提交复选框

代码如下(示例):

 <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。键名一定要和后端接收数组名一致。

3.运行结果

SpringBoot多种参数传递总结_第5张图片提交复选框

SpringBoot多种参数传递总结_第6张图片后端返回内容

四、后端返回POJO类的集合

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

1.后端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方法一个个的赋值了,这样有点麻烦,所以还是加了个构造器。

2.后端controller类

代码如下(示例):

@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方式的参数传递

其实post请求方式的参数传递跟get是一样的,不同的是post请求传递的数据封装在http请求体里,而get传递的参数附加在了URL的末尾,post请求的数据安全性更高。
此外,后端用于接收post请求的接口要用@PostMapping注解。

六、总结

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

你可能感兴趣的:(spring,boot,java,spring)