SpringBoot多种参数传递总结


准备工作

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
    </parent>

    <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
   </dependencies>

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

一、Get请求的普通传递

1.前端表单提交

代码如下(示例):

 <form action="delivery" method="get">
        <p>username</p>
        <input type="text" name="username"> <br>
        <p>password</p>
        <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字符串,如下图:
在这里插入图片描述表单提交页面
在这里插入图片描述后端返回内容
对于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>username</p>
        <input type="text" name="username"> <br>
        <p>password</p>
        <input type="text" name="password"> <br>
        <p>age</p>
        <input type="text" name="information.age"><br>
        <p>sex</p>
        <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.运行结果

在这里插入图片描述表单提交页面

在这里插入图片描述后端返回内容
返回的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.运行结果

在这里插入图片描述提交复选框

在这里插入图片描述后端返回内容

四、后端返回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对象的。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个开源的Java框架,用于简化Spring应用程序的开发和部署。Controller是Spring Boot中的一个重要组件,用于处理来自客户端的HTTP请求,并返回相应的响应。 在Spring Boot的Controller中,参数解析是将客户端请求中的参数值转换为Controller方法的参数的过程。Spring Boot支持多种参数解析方式,包括: 1. PathVariable:通过URL路径中的变量值进行参数解析。在Controller方法的参数列表中使用@PathVariable注解来指定变量名称,并通过在URL中使用{变量名}的方式来传递参数值。 2. RequestParam:通过URL中的查询字符串或表单参数进行解析。在Controller方法的参数列表中使用@RequestParam注解来指定参数名称,并通过URL中使用?参数名=参数值的方式来传递参数值。 3. RequestBody:通过请求体中的内容进行解析。在Controller方法的参数列表中使用@RequestBody注解来指定参数类型,并自动将请求体中的内容转换为对应的Java对象。 4. RequestHeader:通过请求头中的参数进行解析。在Controller方法的参数列表中使用@RequestHeader注解来指定参数名称,并根据请求头中的参数值进行解析。 5. CookieValue:通过请求中的Cookie进行解析。在Controller方法的参数列表中使用@CookieValue注解来指定参数名称,并根据请求中的Cookie值进行解析。 上述这些参数解析方式可以灵活地组合使用,在Controller方法的参数列表中可以同时使用多个注解来实现多种参数解析方式。这样可以方便地获取客户端请求中的各种参数值,并进行相应的处理和业务逻辑操作。 总而言之,Spring Boot的Controller中的参数解析功能使得处理客户端请求变得更加简单和灵活,开发者可以根据具体的需求选择合适的参数解析方式,并通过注解来指定参数的名称和类型,从而精确地获取和处理请求中的参数值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值