【JavaEE】_Spring MVC 项目传参问题

目录

[1. 传递单个参数](#1. 传递单个参数)

[1.1 关于参数名的问题](#1.1 关于参数名的问题)

[2. 传递多个参数](#2. 传递多个参数)

[2.1 关于参数顺序的问题](#2.1 关于参数顺序的问题)

[2.2 关于基本类型与包装类的问题](#2.2 关于基本类型与包装类的问题)

[3. 使用对象传参](#3. 使用对象传参)

[4. 后端参数重命名问题](#4. 后端参数重命名问题)

[4.1 关于@RequestPara注解](#4.1 关于@RequestPara注解)


1. 传递单个参数

现创建Spring MVC项目,.java文件内容如下:

java 复制代码
package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/Para")
@RestController
public class ParaController {
    @RequestMapping("/M1")
    public String m1(String name){
        return "Parameter has Received: Name:"+name;
    }
}

运行启动类,使用Postman向目标地址发送一个GET请求,将待传参数置于query string中,发送的请求与得到的响应如下::

1.1 关于参数名的问题

请注意:客户端传递给服务器的参数应与服务器创建的参数名相同

对于传递单个参数的底层逻辑就是从请求的参数中获取参数名为name的值,并给name赋值;

2. 传递多个参数

在Spring MVC项目的.java文件内容如下:

java 复制代码
package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/Para")
@RestController
public class ParaController {
    @RequestMapping("/M2")
    public String M2(String name, Integer age){
        return "Parameters have received: \n"
                + "Name: "+name + "; Age: "+age;
    }
}

运行启动类后,构造HTTP请求并发送,详情如下:

2.1 关于参数顺序的问题

注:多个参数传参,与参数的顺序无关,仅与参数名是否匹配有关;

2.2 关于基本类型与包装类的问题

现以基本类型 int 与 包装类Integer 为例:

现Spring MVC项目的.java文件内容如下:

java 复制代码
package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/Para")
@RestController
    @RequestMapping("/M3")
    public String M3(String name, int age){
        return "Parameters have received: \n"
                + "Name: "+name + "; Age: "+age;
    }
}

示例1:当 int 型参数有具体传参时:

运行启动类,构造HTTP请求并发送,详情如下:

可见接收正常,返回正常;

示例2:当 int 型参数没有具体传参时:

启动运行类,构造HTTP请求并发送,详情如下:

查看报错信息如下:

建议:在开发中尽量使用包装类,如果使用基本类型的参数,必须要传值

关于包装类的问题,可查看数据结构专栏包装类与泛型一文,链接如下:

【数据结构】_包装类与泛型-CSDN博客https://blog.csdn.net/m0_63299495/article/details/136436372

3. 使用对象传参

如上文所述,当传递的参数个数与类型不同时,就需要频繁修改。

这于前后端配合是非常不便的,在Spring MVC项目中,常使用对象进行传参:

现创建 Person class, 令目录如下:

Person.java文件内容如下:

java 复制代码
package com.example.demo;

public class Person {
    Integer id;
    String name;
    Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

ParaController.java内容如下:

java 复制代码
package com.example.demo.controller;

import com.example.demo.Person;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/Para")
@RestController
public class ParaController {
    @RequestMapping("/M4")
    public String M4(Person person){
        return "Parameters have received: \n"
                + person.toString();
    }
}

使用postman构造并发送请求,详情如下:

在spring项目开发中,通常使用对象对要传递的参数组进行封装,这样可以简化接口逻辑。

也方便使用一些逻辑进行默认值的设定;

4. 后端参数重命名问题

在前后端配合时,也有可能会出现对于前端传递的参数名(如name),在后端需要进行修改的问题(如username,articlename等等),此时可以使用@RequestParm注解对后端参数重命名:

现.java文件内容如下:

java 复制代码
package com.example.demo.controller;

import com.example.demo.Person;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/Para")
@RestController
public class ParaController {
    @RequestMapping("/M5")
    public String m5(@RequestParam("name") String username){
        return "Parameter has Received: Name:"+username;
    }
}

运行启动类,构造HTTP请求并发送,详情如下:

示例1:前端使用name,后端使用username:

示例2:前端与后端均使用username:

查看日志警告信息:

4.1 关于@RequestPara注解

Ctrl+左键点击查看@RequestPara注解源码:

可见@RequestPara注解默认情况为:

当后端使用@RequestPara注解对后端参数进行重命名时,默认该属性为必传属性;

可以修改为false,取消其必传限制:

java 复制代码
package com.example.demo.controller;

import com.example.demo.Person;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/Para")
@RestController
public class ParaController {
    @RequestMapping("/M5")
    public String m5(@RequestParam(value = "name",required = false) String username){
        return "Parameter has Received: Name:"+username;
    }
}

此时再构造请求发送给服务器:

相关推荐
智慧老师4 分钟前
Spring基础分析13-Spring Security框架
java·后端·spring
hanbarger3 小时前
mybatis框架——缓存,分页
java·spring·mybatis
龙少95436 小时前
【深入理解@EnableCaching】
java·后端·spring
啦啦右一12 小时前
Spring Boot | (一)Spring开发环境构建
spring boot·后端·spring
荆州克莱15 小时前
mysql中局部变量_MySQL中变量的总结
spring boot·spring·spring cloud·css3·技术
zquwei15 小时前
SpringCloudGateway+Nacos注册与转发Netty+WebSocket
java·网络·分布式·后端·websocket·网络协议·spring
火烧屁屁啦15 小时前
【JavaEE进阶】初始Spring Web MVC
java·spring·java-ee
岁岁岁平安16 小时前
spring学习(spring-DI(字符串或对象引用注入、集合注入)(XML配置))
java·学习·spring·依赖注入·集合注入·基本数据类型注入·引用数据类型注入
北辰浮光16 小时前
[spring]XML配置文件标签
xml·spring
ZSYP-S16 小时前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring